| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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", "二级域名")
- var gInterval = 120 // 间隔时间
- // 获取当前网络环境的公网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"]
- gInterval, _ = strconv.Atoi(configjson["interval"])
- }
- log.Println("start:", gSecretId, gSecretKey, gDomain, gSubName, gInterval)
- // 默认启动执行一次检测
- checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
- go func() {
- for {
- ticker := time.NewTicker(time.Duration(gInterval) * time.Second)
- select {
- case <-ticker.C:
- log.Println("当前时间为:", time.Now())
- checkDomain(gSecretId, gSecretKey, gDomain, gSubName)
- }
- }
- }()
- for {
- time.Sleep(time.Second * 1)
- }
- }
|