go语言实现dcv端口转发

  • 环境及目标
  • 代码实现

环境及目标

  • 环境
    所有转发机器已经实现了端口和ip的转发。端口为默认端口。
    参考https://blog.csdn.net/wz122330/article/details/91980227

代码实现

package appimport ("io/ioutil""os""os/exec""path/filepath""strings""sync/atomic""com.wz/test/def""com.wz/test/def""gopkg.in/ini.v1"
)type confParser struct {reader *ini.File // config reader
}const (unavailStatus = "unavail"binCmd        = "/bin/bash"scriptName    = "get_host_status.sh"lineBreak     = "\n"
)var (// Forwarded host file.forwardedHostFile = filepath.Join(sysconf.VarDir(), "forwarded.host")// For counter.count int32
)// Get VNC console file.
func (m *Manager) GetVNCInfo(req *def.VNCReq) (string, error) {cwd := req.CwdvncConsolePath := ""if filepath.IsAbs(cwd) {vncConsolePath = filepath.Join(cwd, def.Spooler, def.OperatorConsole)}if _, err := os.Stat(vncConsolePath); err != nil {log.Errorf("The job '%s' vnc file is not created, because of %v", req.JobID, err)return "", err}if m.config.DCV.Forward {if err := m.convertHostIP(vncConsolePath); err != nil {log.Errorf("Failed to convert host ip, vncConsolePath %s", vncConsolePath)return vncConsolePath, err}}return vncConsolePath, nil
}func (m *Manager) convertHostIP(dcvFile string) error {section := def.Connectkey := def.ForwardHostforwardHostsFile := m.config.DCV.HostsFileparser := confParser{}parser.load(dcvFile)lastHost, err := loadForwardHostFromFile(forwardedHostFile)if err != nil {log.Warnf("Failed to load forward host from file %s, because of %v", forwardedHostFile, err)}hosts, err := m.loadHostsToSlice(forwardHostsFile)if err != nil {log.Errorf("Failed to load hosts from file %s to slice, because of %v", forwardHostsFile, err)return err}h, err := m.chooseAvailHost(lastHost, hosts)if err != nil {log.Errorf("Failed to choose a available host, lastHost %s hosts %v, because of %v",lastHost, hosts, err)return err}if h != "" {log.Debugf("Choose a available host %s", h)if err := parser.setValue(dcvFile, section, key, h); err != nil {return err}if err := saveForwardHostToFile(forwardedHostFile, h); err != nil {log.Warnf("Failed to save host %s to file %s, because of %s", h, forwardedHostFile, err)return nil}} else {log.Errorf("All hosts in hosts file %s are unavailable, please check hosts's status",forwardHostsFile)}return nil
}func getNextHost(lastHost string, hosts []string) string {atomic.AddInt32(&count, 1)log.Debugf("The counter is %d", count)idx := 0if lastHost == "" {return hosts[0]}for i, h := range hosts {if lastHost == h {idx = i + 1break} else {continue}}if idx < len(hosts) {return hosts[idx]} else {return hosts[0]}
}func (m *Manager) chooseAvailHost(host string, hosts []string) (string, error) {if int(count) >= len(hosts) {return "", nil}log.Debugf("Last host is %s, all hosts are %v", host, hosts)nextHost := getNextHost(host, hosts)log.Debugf("NextHost is %s ", nextHost)available, err := m.checkHostAvailable(nextHost)if err != nil {return "", err} else {if available {return nextHost, nil} else {return m.chooseAvailHost(nextHost, hosts)}}
}func (m *Manager) loadHostsToSlice(hostsFile string) ([]string, error) {cont, err := ioutil.ReadFile(hostsFile)if err != nil {return []string{}, err}// Remove the last one '\n'.str := strings.TrimSpace(string(cont))return strings.Split(str, lineBreak), nil
}// Load conf file.
func (c *confParser) load(vncConsolePath string) {conf, err := ini.Load(vncConsolePath)if err != nil {log.Errorf("Failed to load vnc file %s, because of %v", vncConsolePath, err)}c.reader = conf
}// Set value for conf file.
func (c *confParser) setValue(file, section, key, value string) error {c.reader.Section(section).Key(key).SetValue(value)return c.reader.SaveTo(file)
}func (m *Manager) checkHostAvailable(ip string) (bool, error) {shellPath := filepath.Join(m.config.BaseDir, def.AppScriptDir, scriptName)log.Debugf("shellPath %s  %s", shellPath, ip)out, err := exec.Command(binCmd, shellPath, ip).CombinedOutput()if err != nil {return false, err}status := strings.TrimSpace(string(out))log.Debugf("Host is %s, it's status is %s", ip, status)if status == unavailStatus {return false, err}count = 0return true, nil
}func loadForwardHostFromFile(file string) (string, error) {data, err := ioutil.ReadFile(file)if err != nil {return "", err}return string(data), nil
}func saveForwardHostToFile(file, host string) error {log.Debugf("Save forwarding host %s to %s", host, file)if err := os.MkdirAll(filepath.Dir(file), def.DirPerm); err != nil {return err}return ioutil.WriteFile(file, []byte(host), def.FilePerm)
}

go语言实现dcv端口转发相关推荐

  1. SSH的端口转发:本地转发Local Forward和远程转发Remote Forward

    http://zhumeng8337797.blog.163.com/blog/static/100768914201172125444948/ 实战 SSH 端口转发 https://www.ibm ...

  2. 4g网络设置dns地址_黑群晖nas中tr软件汉化、路由器设置端口转发教程(二)

    一.安装增强汉化web作者最近又更新了,推荐[通过群晖的"任务计划"自动安装及定期自动更新]这个方式安装,更方便,还能自动更新见作者:下载地址见留言,或私信 官方功能介绍:在线查看 ...

  3. firewalld防火墙配置、测试服务、高级配置与IP伪装、端口转发

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Firewalld防火墙 防火墙基础 一.防火墙配置 二.使用防火墙安装http服务测试分别测试内网.外网.dmz 三.firewal ...

  4. firewalld防火墙配置IP伪装和端口转发

    IP地址伪装和端口转发都属于NAT(网络地址转换). 地址伪装和端口转发的区别如下: IP地址伪装: 1.通过地址伪装,NAT设备将经过设备的包转发到指定的接收方,同时将通过的数据包 2.源地址更改为 ...

  5. OpenWrt路由开启DDNS+端口转发进行外网访问

    OpenWrt路由开启DDNS+端口转发进行外网访问(LuCI界面实现) --开篇 一.准备工作 二.开机! 三.连接 --结尾 –开篇 本篇适用于一切装有OpenWrt系统的路由器/软路由,只要你保 ...

  6. centos 7的firewalld防火墙配置IP伪装和端口转发(内附配置案例)

    IP地址伪装和端口转发都属于NAT(网络地址转换). 地址伪装和端口转发的区别如下: IP地址伪装: 通过地址伪装,NAT设备将经过设备的包转发到指定的接收方,同时将通过的数据包 源地址更改为其NAT ...

  7. 使用GOST搭建一个简单的端口转发(LinuxWindows)

    介绍 Gost是一个功能多样且实用的安全隧道工具,使用的是go语言编写 GitHub项目:https://github.com/ginuerzh/gost Gost文档:https://docs.gi ...

  8. mac 端口转发方案

    mac 端口映射 好坑 osx10.10mac移除了ipfw改用pf pf以前没用过 查文档 mac的 pf语法,没有找到.bsd的倒是很全,心喜拿来一试. http://www.openbsd.or ...

  9. SecureCRT 端口转发连接服务器

    场景: 1.日常远程管理服务器,大多是先通过连接接入到公网中的跳板机,再ssh到内网其他服务器中进行管理操作. 2.为了服务器更安全的管理,一般是使用ssh公私钥方式连接linux.而即使Secure ...

最新文章

  1. 使用Python,OpenCV进行去水印,图像修复
  2. R语言数值向上近似函数(round, ceiling, floor, trunc, signif)实战
  3. Map集合遍历的四种方式理解和简单使用
  4. 招聘一周 | 腾讯、华为、微软、中科院自动化所等12家公司热招职位汇总
  5. php mysql简单留言本_php+mysql写的简单留言本实例代码
  6. 软考 中级职称哪些最热门_我如何利用有史以来最热门的中级故事来建立排行榜。 以及它几乎是怎么死的。...
  7. pytorch保存模型时报错***object has no attribute 'state_dict'
  8. 【OJ】洛谷数组题单题解锦集
  9. 斐波那契数列的时间复杂度
  10. java中final用法
  11. 苹果mac强大的截图录像工具:Snagit
  12. K线技术指标实现详解—MA
  13. Gephi可视化人物关系图
  14. 阿里云服务器购买了还需要买数据库吗?
  15. 输入法规则(V模式输入)
  16. 想做自媒体,做什么样的内容呢,怎么做呢--第006期博文
  17. 多精度里FNT和SSA的点滴
  18. mac环境搭建node.js并启服务
  19. 【T+】畅捷通T+服务管理中,异步任务服务(TPlusPopAsyncTaskService1700)无法启动
  20. Python爬虫数据写入MongoDB

热门文章

  1. 韩国·欧美实用设计分层源文件 12DVD
  2. Premiere不能导入视频怎么办?详细全面的快速解决办法
  3. mysql workbench怎么设置为中文?(仅菜单项汉化)附带main_menu文件
  4. android日志管理最佳策略,深入Android应用开发:核心技术解析与最佳实践
  5. HTML5video标签播放服务器视频
  6. 15 款免费好用的 Mac App
  7. Typora 拾遗:玩转图片存储
  8. 照片转成3D效果怎么做?建议收藏这些方法
  9. Spring基础之属性注入总结
  10. 学UI设计好找工作吗?