package main import ( "flag" "fmt" "io/ioutil" "net/http" "os" "strings" "time" "github.com/denverdino/aliyungo/dns" ) var client *dns.Client func main() { fmt.Println("Check Time: " + time.Now().Format("2006-01-02 15:04:05")) initClient() domainRecord := parseArgs() flag.Parse() updateDNSRecord(domainRecord) } func initClient() { id := *flag.String("id", os.Getenv("ALI_DNS_ID"), "AliId") key := *flag.String("key", os.Getenv("ALI_DNS_KEY"), "AliKey") client = dns.NewClient(id, key) } func parseArgs() *dns.AddDomainRecordArgs { return &dns.AddDomainRecordArgs{ DomainName: *flag.String("domain", os.Getenv("ALI_DNS_DOMAIN"), "Domain"), RR: *flag.String("sub", os.Getenv("ALI_DNS_SUB_DOMAIN"), "RR"), Type: *flag.String("type", "A", "RR"), Value: *flag.String("value", getLocalIP(), "Value"), } } func updateDNSRecord(domainRecord *dns.AddDomainRecordArgs) { fmt.Println("Local IP: " + domainRecord.Value) record, err := listRecord(domainRecord) if err != nil { panic("List Record ERR: " + err.Error()) } if record != nil && record.Value == domainRecord.Value { fmt.Println("Record RR: " + domainRecord.RR + " Not Change") fmt.Println("Record ID: " + record.RecordId) fmt.Println("Record Value: " + domainRecord.Value) return } if record == nil { _, err = addRecord(domainRecord) fmt.Println("Record RR: " + domainRecord.RR + " Added!") } else { _, err = updateRecord(record.RecordId, domainRecord) fmt.Println("Record RR: " + domainRecord.RR + " Updated!") fmt.Println("Record ID: " + record.RecordId) } fmt.Println("Record Value: " + domainRecord.Value) if err != nil { fmt.Println("Update Or Add Record ERR: " + err.Error()) } } func getLocalIP() string { resp, err := http.Get("http://ip.3322.org") if err != nil { panic("Get Network IP ERR: " + err.Error()) } str, err := ioutil.ReadAll(resp.Body) defer resp.Body.Close() if err != nil { panic("Read Body Byte ERR: " + err.Error()) } return strings.Replace(string(str), "\n", "", -1) } func listRecord(domainRecord *dns.AddDomainRecordArgs) (*dns.RecordTypeNew, error) { resp, err := client.DescribeDomainRecordsNew( &dns.DescribeDomainRecordsNewArgs{ DomainName: domainRecord.DomainName, RRKeyWord: domainRecord.RR, }) if err != nil { return nil, err } for _, r := range resp.DomainRecords.Record { if r.RR == domainRecord.RR { return &r, nil } } return nil, err } func addRecord(domainRecord *dns.AddDomainRecordArgs) (*dns.AddDomainRecordResponse, error) { return client.AddDomainRecord(domainRecord) } func updateRecord(id string, domainRecord *dns.AddDomainRecordArgs) (*dns.UpdateDomainRecordResponse, error) { return client.UpdateDomainRecord(&dns.UpdateDomainRecordArgs{ RecordId: id, RR: domainRecord.RR, Type: domainRecord.Type, Value: domainRecord.Value, }) }