func ModifyRecord(domainId int, recordId, subDomain, strIp string) bool { data := url.Values{} data.Add("login_email", g.Config().LoginEmail) data.Add("login_password", g.Config().LoginPassword) data.Add("format", "json") data.Add("domain_id", strconv.Itoa(domainId)) data.Add("record_id", recordId) data.Add("sub_domain", subDomain) data.Add("record_type", "A") data.Add("record_line", "默认") data.Add("value", strIp) strResponse, err := Post("https://dnsapi.cn/Record.Modify", data) if nil != err { logger.Errorln("RECORD_MODIFY ERROR", err) } else { logger.Infoln("RECORD_MODIFY_RESPONSE:", strResponse, err) if "" != strResponse && strings.Contains(strResponse, `"code":"1"`) { return true } else { logger.Infoln("domainId:%d,recordId:%s,sub_domain:%s\n", domainId, recordId, subDomain) } } return false }
func heartbeat() { strIp := getIp() if "" == strIp || lastIp == strIp { logger.Debug("strIp:%s, lastIp: %s.\n", strIp, lastIp) return } logger.Debugln("domainMap's size:", len(domainMap)) if 0 == len(domainMap) { return } var modifyResult bool for _, domain := range g.Config().Domains { if _, ok := domainMap[domain.DomainName]; ok { if recordResults, exists := recordMap[domain.DomainName]; exists { for _, recordResult := range recordResults { if existsRecordName(domain.DomainName, recordResult.Name) && strIp != recordResult.Value { modifyResult = ModifyRecord(domainMap[domain.DomainName], recordResult.Id, recordResult.Name, strIp) } } } } } if modifyResult { lastIp = strIp logger.Infoln("last ip have changed into ", strIp) if g.Config().Redis.Enabled { // send to redis rc := g.RedisConnPool.Get() defer rc.Close() rc.Do("LPUSH", "COMMAND_udai", g.Config().ExecuteCommand) } } }
func getIp() string { strUrl := g.Config().GetIpApi logger.Debug("REQUEST_URL:%s\n", strUrl) httpRequest := httplib.Get(strUrl).SetTimeout(3*time.Second, 10*time.Second) httpResponse, err := httpRequest.Bytes() if nil != err { logger.Errorln("GET_IP error", err) return "" } strIp := "" var resp g.ServletResponse err = json.Unmarshal(httpResponse, &resp) if err != nil { logger.Error("decode GET_IP response fail %v\n", err) } else if false == resp.Success { logger.Error("GET_IP fail %s\n", resp.Message) } else { strIp = resp.Message } logger.Infoln("RESPONSE_IP:", strIp) return strIp }