环境:
Windows2008R2系统上安装CCProxy代理,安全起见只允许自己的IP可以使用代理。
由于自己使用的ADSL拨号,IP不固定,每次手动修改太麻烦。
所以使用Golang自动更新CCProxy配置。
大概过程:
1、自己这边使用一个DDNS,域名为 test.allgo.cc
2、使用golang每个1分钟解析一次test.allgo.cc
3、解析结果若同CCProxy配置中的不同,则更新配置
4、重新载入CCProxy配置
package main /* 编译后台运行 go build -ldflags "-H windowsgui" -o ddns_ccproxy.exe edit_win_ini.go goconfig库教程 https://github.com/Unknwon/go-rock-libraries-showcases/tree/master/lectures/01-goconfig */ import ( "fmt" "github.com/Unknwon/goconfig" "log" "net" "os/exec" "time" ) const ( DDNS_STR = "test.allgo.cc" INI_PATH = "C:/CCProxy/AccInfo.ini" EXE_PATH = "C:/CCProxy/CCProxy.exe" TIME_INTERVAL = 60 ) var ( cfg_ip string ) func main() { cfg, err := goconfig.LoadConfigFile(INI_PATH) if err != nil { log.Fatalf("无法加载配置文件:%s", err) } cfg_ip, err = cfg.GetValue("User001", "IPAddressLow") if err != nil { log.Fatalf("无法获取键值(%s):%s", "IPAddressLow", err) } log.Printf("%s > %s: %s", "User001", "IPAddressLow", cfg_ip) for { now_ip, err := get_cfg_ip() if err != nil { log.Printf("dns无法解析: %s", err) } else { if now_ip != cfg_ip { log.Printf("now_ip ->[%s] , cfg_ip->[%s]", now_ip, cfg_ip) //更新ini文件IP isInsert := cfg.SetValue("User001", "IPAddressLow", now_ip) log.Printf("设置键值 %s 为插入操作:%v", "IPAddressLow", isInsert) isInsert0 := cfg.SetValue("User001", "IPAddressHigh", now_ip) log.Printf("设置键值 %s 为插入操作:%v", "IPAddressHigh", isInsert0) //更新ini文件时间 isInsert1 := cfg.SetValue("User001", "DisableDateTime", ntime()) log.Printf("设置键值 %s 为插入操作:%v", "DisableDateTime", isInsert1) err := goconfig.SaveConfigFile(cfg, INI_PATH) if err != nil { log.Fatalf("无法保存配置文件:%s", err) } reload_ccproxy_cfg() err1 := cfg.Reload() if err1 != nil { log.Fatalf("重新载入ini配置失败:%s", err) } cfg_ip, err = cfg.GetValue("User001", "IPAddressLow") if err != nil { log.Fatalf("无法获取键值(%s):%s", "IPAddressLow", err) } log.Printf("%s > %s: %s", "User001", "IPAddressLow", cfg_ip) } else { log.Printf("DNS IP not change !") } } time.Sleep(time.Second * TIME_INTERVAL) } } //解析域名,返回字符串类型IP func get_cfg_ip() (ip_str string, err error) { dns_ip, err := net.LookupIP(DDNS_STR) ip_str = iptostr(dns_ip[0]) log.Printf("dns resolve : %s", ip_str) return ip_str, err } //获取当前时间 func ntime() string { tmpnow := time.Now() return fmt.Sprintf(tmpnow.Format("2006-01-02 15:04:05")) } //ip类型转字符串类型 func iptostr(tip net.IP) string { return fmt.Sprintf("%s", tip) } //重新加载CCProxy配置 func reload_ccproxy_cfg() { log.Println("Reload CCProxy Config...") argv := []string{"-update"} //fmt.Println(argv) _, err := exec.Command(EXE_PATH, argv...).Output() if err != nil { log.Printf("Reload CCProxy Config Error: %s", err) } }