环境:
Windows2008R2系统上安装CCProxy代理,安全起见只允许自己的IP可以使用代理。
由于自己使用的ADSL拨号,IP不固定,每次手动修改太麻烦。
所以使用Golang自动更新CCProxy配置。
大概过程:
1、自己这边使用一个DDNS,域名为 test.allgo.cc
2、使用golang每个1分钟解析一次test.allgo.cc
3、解析结果若同CCProxy配置中的不同,则更新配置
4、重新载入CCProxy配置
001 | package main |
002 |
003 | /* |
004 | 编译后台运行 |
005 | go build -ldflags "-H windowsgui" -o ddns_ccproxy.exe edit_win_ini.go |
006 |
007 | goconfig库教程 |
009 | */ |
010 |
011 | import ( |
012 | "fmt" |
013 | "github.com/Unknwon/goconfig" |
014 | "log" |
015 | "net" |
016 | "os/exec" |
017 | "time" |
018 | ) |
019 |
020 | const ( |
021 | DDNS_STR = "test.allgo.cc" |
022 | INI_PATH = "C:/CCProxy/AccInfo.ini" |
023 | EXE_PATH = "C:/CCProxy/CCProxy.exe" |
024 | TIME_INTERVAL = 60 |
025 | ) |
026 |
027 | var ( |
028 | cfg_ip string |
029 | ) |
030 |
031 | func main() { |
032 | cfg, err := goconfig.LoadConfigFile(INI_PATH) |
033 | if err != nil { |
034 | log.Fatalf( "无法加载配置文件:%s" , err) |
035 | } |
036 |
037 | cfg_ip, err = cfg.GetValue( "User001" , "IPAddressLow" ) |
038 | if err != nil { |
039 | log.Fatalf( "无法获取键值(%s):%s" , "IPAddressLow" , err) |
040 | } |
041 | log.Printf( "%s > %s: %s" , "User001" , "IPAddressLow" , cfg_ip) |
042 |
043 | for { |
044 | now_ip, err := get_cfg_ip() |
045 | if err != nil { |
046 | log.Printf( "dns无法解析: %s" , err) |
047 | } else { |
048 | if now_ip != cfg_ip { |
049 |
050 | log.Printf( "now_ip ->[%s] , cfg_ip->[%s]" , now_ip, cfg_ip) |
051 |
052 | //更新ini文件IP |
053 | isInsert := cfg.SetValue( "User001" , "IPAddressLow" , now_ip) |
054 | log.Printf( "设置键值 %s 为插入操作:%v" , "IPAddressLow" , isInsert) |
055 |
056 | isInsert0 := cfg.SetValue( "User001" , "IPAddressHigh" , now_ip) |
057 | log.Printf( "设置键值 %s 为插入操作:%v" , "IPAddressHigh" , isInsert0) |
058 |
059 | //更新ini文件时间 |
060 | isInsert1 := cfg.SetValue( "User001" , "DisableDateTime" , ntime()) |
061 | log.Printf( "设置键值 %s 为插入操作:%v" , "DisableDateTime" , isInsert1) |
062 |
063 | err := goconfig.SaveConfigFile(cfg, INI_PATH) |
064 | if err != nil { |
065 | log.Fatalf( "无法保存配置文件:%s" , err) |
066 | } |
067 | reload_ccproxy_cfg() |
068 | err1 := cfg.Reload() |
069 | if err1 != nil { |
070 | log.Fatalf( "重新载入ini配置失败:%s" , err) |
071 | } |
072 | cfg_ip, err = cfg.GetValue( "User001" , "IPAddressLow" ) |
073 | if err != nil { |
074 | log.Fatalf( "无法获取键值(%s):%s" , "IPAddressLow" , err) |
075 | } |
076 | log.Printf( "%s > %s: %s" , "User001" , "IPAddressLow" , cfg_ip) |
077 | } else { |
078 | log.Printf( "DNS IP not change !" ) |
079 | } |
080 | } |
081 | time.Sleep(time.Second * TIME_INTERVAL) |
082 | } |
083 |
084 | } |
085 |
086 | //解析域名,返回字符串类型IP |
087 | func get_cfg_ip() (ip_str string, err error) { |
088 | dns_ip, err := net.LookupIP(DDNS_STR) |
089 | ip_str = iptostr(dns_ip[ 0 ]) |
090 | log.Printf( "dns resolve : %s" , ip_str) |
091 | return ip_str, err |
092 | } |
093 |
094 | //获取当前时间 |
095 | func ntime() string { |
096 | tmpnow := time.Now() |
097 | return fmt.Sprintf(tmpnow.Format( "2006-01-02 15:04:05" )) |
098 | } |
099 |
100 | //ip类型转字符串类型 |
101 | func iptostr(tip net.IP) string { |
102 | return fmt.Sprintf( "%s" , tip) |
103 | } |
104 |
105 | //重新加载CCProxy配置 |
106 | func reload_ccproxy_cfg() { |
107 | log.Println( "Reload CCProxy Config..." ) |
108 | argv := []string{ "-update" } |
109 | //fmt.Println(argv) |
110 | _, err := exec.Command(EXE_PATH, argv...).Output() |
111 | if err != nil { |
112 | log.Printf( "Reload CCProxy Config Error: %s" , err) |
113 | } |
114 | } |