Merge pull request 'support multiple records.' (#1) from dev01 into master

Reviewed-on: https://gitea.wq520.cloud:4435/wangjiacai/alidns/pulls/1
This commit is contained in:
wangjiacai 2021-04-23 00:43:21 +08:00
commit ec7743a9a2

281
alidns.go
View File

@ -1,138 +1,143 @@
package main package main
import ( import (
"encoding/json" "encoding/json"
"flag" "flag"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log" "log"
"net/http" "net/http"
"github.com/aliyun/alibaba-cloud-sdk-go/services/alidns" "github.com/aliyun/alibaba-cloud-sdk-go/services/alidns"
) )
// TODO: support array of (Type, RR) // TODO: support array of (Type, RR)
type Config struct {
RegionId string `json:"regionId"` type Record struct {
AccessKeyId string `json:"accessKeyId"` Type string `json:"Type"`
AccessSecret string `json:"accessSecret"` RR string `json:"RR"`
DomainName string `json:"domainName"` }
Type string `json:"Type"`
RR string `json:"RR"` type Config struct {
} RegionId string `json:"regionId"`
AccessKeyId string `json:"accessKeyId"`
type IpJson struct { AccessSecret string `json:"accessSecret"`
Status string `json:"status"` DomainName string `json:"domainName"`
Country string `json:"country"` Records []Record
CountryCode string `json:"countryCode"` }
Region string `json:"region"`
RegionName string `json:"regionName"` type IpJson struct {
City string `json:"city"` Status string `json:"status"`
Zip string `json:"zip"` Country string `json:"country"`
Lat float64 `json:"lat"` CountryCode string `json:"countryCode"`
Lon float64 `json:"lon"` Region string `json:"region"`
Timezone string `json:"timezone"` RegionName string `json:"regionName"`
Isp string `json:"isp"` City string `json:"city"`
Org string `json:"org"` Zip string `json:"zip"`
As string `json:"as"` Lat float64 `json:"lat"`
Query string `json:"query"` Lon float64 `json:"lon"`
} Timezone string `json:"timezone"`
Isp string `json:"isp"`
func main() { Org string `json:"org"`
As string `json:"as"`
configPath := flag.String("config", "./config.json", "path to config file") Query string `json:"query"`
flag.Parse() }
fmt.Println("config file path: ", *configPath)
func main() {
configJson, err := ioutil.ReadFile(*configPath)
if err != nil { configPath := flag.String("config", "./config.json", "path to config file")
log.Fatal(err.Error()) flag.Parse()
} fmt.Println("config file path: ", *configPath)
var config Config
json.Unmarshal(configJson, &config) configJson, err := ioutil.ReadFile(*configPath)
if err != nil {
res, err := http.Get("http://ip-api.com/json/") log.Fatal(err.Error())
if err != nil { }
log.Fatal(err) var config Config
} json.Unmarshal(configJson, &config)
data, err := ioutil.ReadAll(res.Body) res, err := http.Get("http://ip-api.com/json/")
res.Body.Close() if err != nil {
if err != nil { log.Fatal(err)
log.Fatal(err) }
}
var ipJson IpJson data, err := ioutil.ReadAll(res.Body)
json.Unmarshal(data, &ipJson) res.Body.Close()
ip := ipJson.Query if err != nil {
if ipJson.Status != "success" { log.Fatal(err)
log.Fatal("get ip failed") }
} var ipJson IpJson
json.Unmarshal(data, &ipJson)
client, err := alidns.NewClientWithAccessKey(config.RegionId, config.AccessKeyId, config.AccessSecret) ip := ipJson.Query
if ipJson.Status != "success" {
describeDomainRequest := alidns.CreateDescribeDomainRecordsRequest() log.Fatal("get ip failed")
describeDomainRequest.Scheme = "https" }
describeDomainRequest.DomainName = config.DomainName client, err := alidns.NewClientWithAccessKey(config.RegionId, config.AccessKeyId, config.AccessSecret)
domainRecords, err := client.DescribeDomainRecords(describeDomainRequest) describeDomainRequest := alidns.CreateDescribeDomainRecordsRequest()
if err != nil { describeDomainRequest.Scheme = "https"
fmt.Println(err.Error())
} describeDomainRequest.DomainName = config.DomainName
var i int64 = 0 domainRecords, err := client.DescribeDomainRecords(describeDomainRequest)
var found bool = false if err != nil {
// find subdomain fmt.Println(err.Error())
for i = 0; i < domainRecords.TotalCount; i++ { }
if config.RR == domainRecords.DomainRecords.Record[i].RR && config.Type == domainRecords.DomainRecords.Record[i].Type {
found = true //found subdomain record var i int64 = 0
if ip == domainRecords.DomainRecords.Record[i].Value { // ip not changed var found bool = false
fmt.Println("ip", ip, "not changed!") // find subdomain
} else { for i = 0; i < domainRecords.TotalCount; i++ {
fmt.Printf("ip changed from %s to %s\n", domainRecords.DomainRecords.Record[i].Value, ip) if config.RR == domainRecords.DomainRecords.Record[i].RR && config.Type == domainRecords.DomainRecords.Record[i].Type {
fmt.Printf("---> update %s record to %s ...\n", config.RR+"."+config.DomainName, ip) found = true //found subdomain record
if ip == domainRecords.DomainRecords.Record[i].Value { // ip not changed
updateDomainRecordRequest := alidns.CreateUpdateDomainRecordRequest() fmt.Println("ip", ip, "not changed!")
updateDomainRecordRequest.Scheme = "https" } else {
updateDomainRecordRequest.RecordId = domainRecords.DomainRecords.Record[i].RecordId fmt.Printf("ip changed from %s to %s\n", domainRecords.DomainRecords.Record[i].Value, ip)
updateDomainRecordRequest.RR = config.RR fmt.Printf("---> update %s record to %s ...\n", config.RR+"."+config.DomainName, ip)
updateDomainRecordRequest.Type = config.Type
updateDomainRecordRequest.Value = ip updateDomainRecordRequest := alidns.CreateUpdateDomainRecordRequest()
response, err := client.UpdateDomainRecord(updateDomainRecordRequest) updateDomainRecordRequest.Scheme = "https"
if err != nil { updateDomainRecordRequest.RecordId = domainRecords.DomainRecords.Record[i].RecordId
fmt.Println(err.Error()) updateDomainRecordRequest.RR = config.RR
} updateDomainRecordRequest.Type = config.Type
if response.IsSuccess() { updateDomainRecordRequest.Value = ip
fmt.Println("success") response, err := client.UpdateDomainRecord(updateDomainRecordRequest)
} else { if err != nil {
fmt.Printf("failed.\n%s\n", response.GetHttpContentString()) fmt.Println(err.Error())
} }
} if response.IsSuccess() {
} fmt.Println("success")
} else {
} fmt.Printf("failed.\n%s\n", response.GetHttpContentString())
}
if !found { }
fmt.Printf("ip is %s, but no domain record found.\n", ip) }
fmt.Printf("---> add %s record to %s ...\n", config.RR+"."+config.DomainName, ip)
}
addDomainRequest := alidns.CreateAddDomainRecordRequest()
addDomainRequest.Scheme = "https" if !found {
fmt.Printf("ip is %s, but no domain record found.\n", ip)
addDomainRequest.DomainName = config.DomainName fmt.Printf("---> add %s record to %s ...\n", config.RR+"."+config.DomainName, ip)
addDomainRequest.RR = config.RR
addDomainRequest.Type = config.Type addDomainRequest := alidns.CreateAddDomainRecordRequest()
addDomainRequest.Value = ip addDomainRequest.Scheme = "https"
response, err := client.AddDomainRecord(addDomainRequest) addDomainRequest.DomainName = config.DomainName
if err != nil { addDomainRequest.RR = config.RR
fmt.Println(err.Error()) addDomainRequest.Type = config.Type
} addDomainRequest.Value = ip
if response.IsSuccess() {
fmt.Println("success") response, err := client.AddDomainRecord(addDomainRequest)
} else { if err != nil {
fmt.Printf("failed.\n%s\n", response.GetHttpContentString()) fmt.Println(err.Error())
} }
} if response.IsSuccess() {
fmt.Println() fmt.Println("success")
} } else {
fmt.Printf("failed.\n%s\n", response.GetHttpContentString())
}
}
fmt.Println()
}