标签归档:golang动态更新CCProxy配置

golang动态更新CCProxy账号对应的IP

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