112 lines
2.8 KiB
Go
112 lines
2.8 KiB
Go
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,
|
|
})
|
|
}
|