Skip to content

Commit 80e784c

Browse files
authored
Merge pull request #19 from 873314461/master
Add IPv6 support.
2 parents 8a312eb + eac02df commit 80e784c

File tree

1 file changed

+29
-10
lines changed

1 file changed

+29
-10
lines changed

main.go

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@ func (ak *AccessKey) DelRecord(fulldomain string) (err error) {
7474
return
7575
}
7676

77-
func (ak *AccessKey) UpdateRecord(recordID, rr, value string) (err error) {
77+
func (ak *AccessKey) UpdateRecord(recordID, rr, dmType, value string) (err error) {
7878
_, err = ak.getClient().UpdateDomainRecord(
7979
&dns.UpdateDomainRecordArgs{
8080
RecordId: recordID,
8181
RR: rr,
8282
Value: value,
83-
Type: dns.ARecord,
83+
Type: dmType,
8484
})
8585
return
8686
}
@@ -96,32 +96,40 @@ func (ak *AccessKey) AddRecord(domain, rr, dmType, value string) (err error) {
9696
return err
9797
}
9898

99-
func (ak *AccessKey) CheckAndUpdateRecordA(fulldomain, ipaddr string) (err error) {
99+
func (ak *AccessKey) CheckAndUpdateRecord(fulldomain, ipaddr string, ipv6 bool) (err error) {
100100
if getDNS(fulldomain) == ipaddr {
101101
return // Skip
102102
}
103103
rr := regexp.MustCompile(`\.[^\.]*`).ReplaceAllString(fulldomain, "")
104104
domain := regexp.MustCompile(`^[^\.]*\.`).ReplaceAllString(fulldomain, "")
105105
// fmt.Println(rr, domain)
106+
recordType := "A"
107+
if ipv6 {
108+
recordType = "AAAA"
109+
}
106110
var target *dns.RecordTypeNew
107111
if dnsRecords, err := ak.ListRecord(domain); err == nil {
108112
for i := range dnsRecords {
109-
if dnsRecords[i].RR == rr {
113+
if dnsRecords[i].RR == rr && dnsRecords[i].Type == recordType {
110114
target = &dnsRecords[i]
111115
break
112116
}
113117
}
114118
} else {
115119
return err
116120
}
121+
117122
if target == nil {
118-
err = ak.AddRecord(domain, rr, "A", ipaddr)
123+
err = ak.AddRecord(domain, rr, recordType, ipaddr)
119124
} else if target.Value != ipaddr {
120-
err = ak.UpdateRecord(target.RecordId, target.RR, ipaddr)
125+
if target.Type != recordType {
126+
return fmt.Errorf("record type error! oldType=%s, targetType=%s", target.Type, recordType)
127+
}
128+
err = ak.UpdateRecord(target.RecordId, target.RR, target.Type, ipaddr)
121129
}
122130
if err != nil && strings.Contains(err.Error(), `DomainRecordDuplicate`) {
123131
ak.DelRecord(fulldomain)
124-
return ak.CheckAndUpdateRecordA(fulldomain, ipaddr)
132+
return ak.CheckAndUpdateRecord(fulldomain, ipaddr, ipv6)
125133
}
126134
return err
127135
}
@@ -211,13 +219,17 @@ func main() {
211219
Name: "ipaddr, i",
212220
Usage: "Specific `IP`. like 1.2.3.4",
213221
},
222+
cli.BoolFlag{
223+
Name: "ipv6, 6",
224+
Usage: "update IPv6 address",
225+
},
214226
},
215227
Action: func(c *cli.Context) error {
216228
if err := appInit(c); err != nil {
217229
return err
218230
}
219-
// fmt.Println(c.Command.Name, "task: ", accessKey, c.String("domain"), c.String("ipaddr"))
220-
if err := accessKey.CheckAndUpdateRecordA(c.String("domain"), c.String("ipaddr")); err != nil {
231+
fmt.Println(c.Command.Name, "task: ", accessKey, c.String("domain"), c.String("ipaddr"))
232+
if err := accessKey.CheckAndUpdateRecord(c.String("domain"), c.String("ipaddr"), c.Bool("ipv6")); err != nil {
221233
log.Printf("%+v", err)
222234
} else {
223235
log.Println(c.String("domain"), c.String("ipaddr"), ip2locCN(c.String("ipaddr")))
@@ -239,6 +251,10 @@ func main() {
239251
Value: "",
240252
Usage: "redo Auto-Update, every N `Seconds`; Disable if N less than 10; End with [Rr] enable random delay: [N, 2N]",
241253
},
254+
cli.BoolFlag{
255+
Name: "ipv6, 6",
256+
Usage: "update IPv6 address",
257+
},
242258
},
243259
Action: func(c *cli.Context) error {
244260
if err := appInit(c); err != nil {
@@ -262,7 +278,10 @@ func main() {
262278
}
263279
for {
264280
autoip := getIP()
265-
if err := accessKey.CheckAndUpdateRecordA(c.String("domain"), autoip); err != nil {
281+
if c.Bool("ipv6") {
282+
autoip = getIP6()
283+
}
284+
if err := accessKey.CheckAndUpdateRecord(c.String("domain"), autoip, c.Bool("ipv6")); err != nil {
266285
log.Printf("%+v", err)
267286
} else {
268287
log.Println(c.String("domain"), autoip, ip2locCN(autoip))

0 commit comments

Comments
 (0)