|
|
@@ -0,0 +1,111 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "flag"
|
|
|
+ "github.com/athurg/go-qcloud-cns-sdk"
|
|
|
+ "io/ioutil"
|
|
|
+ "log"
|
|
|
+ "net"
|
|
|
+ "net/http"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+var gSecretId = *flag.String("secretId", "111123123", "腾讯云秘钥id")
|
|
|
+var gSecretKey = *flag.String("secretKey", "222222", "腾讯云秘钥key")
|
|
|
+var gDomain = *flag.String("domain", "dszgame.cn", "域名")
|
|
|
+var gSubName = *flag.String("subname", "home", "二级域名")
|
|
|
+
|
|
|
+// 获取当前网络环境的公网IP
|
|
|
+func GetIP() string {
|
|
|
+ resp, err := http.Get("http://ip.cip.cc")
|
|
|
+ if err != nil {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ defer resp.Body.Close()
|
|
|
+ body, err := ioutil.ReadAll(resp.Body)
|
|
|
+ return string(body)
|
|
|
+}
|
|
|
+
|
|
|
+// unicode转中文
|
|
|
+func u2s(form string) string {
|
|
|
+ str, err := strconv.Unquote(strings.Replace(strconv.Quote(string(form)), `\\u`, `\u`, -1))
|
|
|
+ if err != nil {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ return str
|
|
|
+}
|
|
|
+
|
|
|
+// 检测域名是否需要修改解析
|
|
|
+func checkDomain(secretId, secretKey, sDomain, sSubName string){
|
|
|
+ url := sSubName +"." + sDomain
|
|
|
+ oldips, err := net.LookupHost(url)
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err.Error())
|
|
|
+ }
|
|
|
+ oldip := strings.ReplaceAll(oldips[0], "\n", "")
|
|
|
+ curip := strings.ReplaceAll(GetIP(), "\n", "")
|
|
|
+ if oldip == curip {
|
|
|
+ log.Println("解析出来的IP本来就是当前公网IP:", url, curip)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ log.Println("开始检测 url:" + url + " ip:", GetIP(), " host:", oldip)
|
|
|
+
|
|
|
+ cli := cns.New( secretId, secretKey)
|
|
|
+ lists, err := cli.RecordList(sDomain)
|
|
|
+
|
|
|
+ for _, rec := range lists {
|
|
|
+ if rec.Name == sSubName && rec.Type == "A" { // 找到要修改的解析
|
|
|
+ log.Println("record:", rec)
|
|
|
+ if oldip != rec.Value || curip != oldip {
|
|
|
+ rec.Value = curip
|
|
|
+ err1 := cli.RecordModify(sDomain, rec)
|
|
|
+ if err1 != nil {
|
|
|
+ log.Println("RecordModify error:", err1.Error())
|
|
|
+ }else{
|
|
|
+ log.Println("RecordModify succeded:", url, rec.Value)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func main() {
|
|
|
+
|
|
|
+ bytes, err := ioutil.ReadFile("./config.json")
|
|
|
+ if err == nil {
|
|
|
+ log.Println("读取json文件成功")
|
|
|
+
|
|
|
+ configjson := map[string]string{}
|
|
|
+ json.Unmarshal(bytes, &configjson)
|
|
|
+
|
|
|
+ gSecretId = configjson["secretId"]
|
|
|
+ gSecretKey = configjson["secretKey"]
|
|
|
+ gDomain = configjson["domain"]
|
|
|
+ gSubName = configjson["subname"]
|
|
|
+ }
|
|
|
+
|
|
|
+ log.Println("start:", gSecretId, gSecretKey, gDomain, gSubName)
|
|
|
+
|
|
|
+
|
|
|
+ // 默认启动执行一次检测
|
|
|
+ checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
|
|
|
+
|
|
|
+ go func() {
|
|
|
+ for {
|
|
|
+ ticker := time.NewTicker(120 * time.Second)
|
|
|
+ select {
|
|
|
+ case <-ticker.C:
|
|
|
+ log.Println("当前时间为:", time.Now())
|
|
|
+ checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ for {
|
|
|
+ time.Sleep(time.Second * 1)
|
|
|
+ }
|
|
|
+}
|