环境:
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)
}
}