This repository was archived by the owner on Apr 7, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathauto_ddns.go
More file actions
156 lines (140 loc) · 4.06 KB
/
auto_ddns.go
File metadata and controls
156 lines (140 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package main
import (
"flag"
"fmt"
"encoding/xml"
"time"
"net/http"
"io/ioutil"
)
var URL_GET_DNS_DATA = "https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=%s&domain=%s"
var URL_UPDATE_DNS_DATA = "https://www.namesilo.com/api/dnsUpdateRecord?version=1" +
"&type=xml&key=%s&domain=%s&rrid=%s&rrhost=%s&rrvalue=%s&rrttl=%d"
var domain = flag.String("domain", "example.com", "your main domain")
var subDomain = flag.String("sub", "home", "sub domain")
var key = flag.String("api_key", "xxx", "api key")
var ttl = flag.Int("ttl", 3600, "ttl")
var circle = flag.Int("circle", 300, "circle")
type DnsData struct {
OutterIP string
RecordId string
CurrentIP string
}
type ListDnsRequest struct {
Operation string `xml:"operation"`
IP string `xml:"ip"`
}
type ResourceRecordData struct {
RecordId string `xml:"record_id"`
Type string `xml:"type"`
Host string `xml:"host"`
Value string `xml:"value"`
TTL int `xml:"ttl"`
Distance int `xml:"distance"`
}
type ListReply struct {
Code int `xml:"code"`
Detail string `xml:"detail"`
ResourceRecord []ResourceRecordData `xml:"resource_record"`
}
type ListDnsDataParse struct {
Namesilo xml.Name `xml:"namesilo"`
Request ListDnsRequest `xml:"request"`
Reply ListReply `xml:"reply"`
}
type UpdateRequest struct {
Operation string `xml:"operation"`
IP string `xml:"ip"`
}
type UpdateReply struct {
Code int `xml:"code"`
Detail string `xml:"detail"`
RecordId string `xml:"record_id"`
}
type UpdateDataParse struct {
Namesilo xml.Name `xml:"namesilo"`
Request UpdateRequest `xml:"request"`
Reply UpdateReply `xml:"reply"`
}
func RequestHTTP(url string) ([]byte, error) {
rsp, err := http.Get(url)
if err != nil {
return nil, err
}
defer rsp.Body.Close()
data, err := ioutil.ReadAll(rsp.Body)
if err != nil {
return nil, err
}
//fmt.Printf("Get data from remote:%s", string(data))
return data, nil
}
func GetDNSData(domain string, sub string, key string) (*DnsData, error) {
url := fmt.Sprintf(URL_GET_DNS_DATA, key, domain)
data, err := RequestHTTP(url)
if err != nil {
return nil, err
}
parser := &ListDnsDataParse{}
if err = xml.Unmarshal(data, parser); err != nil {
return nil, err
}
if parser.Reply.Code != 300 {
return nil, fmt.Errorf("request err, code:%d, msg:%s", parser.Reply.Code, parser.Reply.Detail)
}
target := fmt.Sprintf("%s.%s", sub, domain)
var dnsData *DnsData = nil
for _, item := range parser.Reply.ResourceRecord {
if item.Host == target {
dnsData = &DnsData{}
dnsData.OutterIP = parser.Request.IP
dnsData.RecordId = item.RecordId
dnsData.CurrentIP = item.Value
}
}
//fmt.Printf("%+v", *parser)
if dnsData == nil {
return nil, fmt.Errorf("not found target host:%s", target)
}
return dnsData, nil
}
func UpdateDNSData(domain, sub, recordid string, key string, value string, ttl int) error {
url := fmt.Sprintf(URL_UPDATE_DNS_DATA, key, domain, recordid, sub, value, ttl)
data, err := RequestHTTP(url)
if err != nil {
return err
}
parser := &UpdateDataParse{}
if err = xml.Unmarshal(data, parser); err != nil {
return err
}
if parser.Reply.Code != 300 {
return fmt.Errorf("code not ok, code:%d, msg:%s", parser.Reply.Code, parser.Reply.Detail)
}
return nil
}
func doCircle() {
for {
for {
data, err := GetDNSData(*domain, *subDomain, *key)
if err != nil {
fmt.Printf("Get dns data fail, err:%v, domain:%s, sub:%s\n", err, *domain, *subDomain)
break
}
fmt.Printf("Read dns data from namesilo succ, recordid:%s, current ip:%s, outter ip:%s\n",
data.RecordId, data.CurrentIP, data.OutterIP)
err = UpdateDNSData(*domain, *subDomain, data.RecordId, *key, data.OutterIP, *ttl)
if err != nil {
fmt.Printf("Update dns data fail, err:%v, domain:%s, sub:%s\n", err, *domain, *subDomain)
break
}
fmt.Printf("Set new dns value to namesilo succ, recordid:%s, target ip:%s\n", data.RecordId, data.OutterIP)
break
}
time.Sleep(time.Duration(*circle) * time.Second)
}
}
func main() {
flag.Parse()
doCircle()
}