@@ -74,13 +74,13 @@ func (ak *AccessKey) DelRecord(fulldomain string) (err error) {
74
74
return
75
75
}
76
76
77
- func (ak * AccessKey ) UpdateRecord (recordID , rr , value string ) (err error ) {
77
+ func (ak * AccessKey ) UpdateRecord (recordID , rr , dmType , value string ) (err error ) {
78
78
_ , err = ak .getClient ().UpdateDomainRecord (
79
79
& dns.UpdateDomainRecordArgs {
80
80
RecordId : recordID ,
81
81
RR : rr ,
82
82
Value : value ,
83
- Type : dns . ARecord ,
83
+ Type : dmType ,
84
84
})
85
85
return
86
86
}
@@ -96,32 +96,40 @@ func (ak *AccessKey) AddRecord(domain, rr, dmType, value string) (err error) {
96
96
return err
97
97
}
98
98
99
- func (ak * AccessKey ) CheckAndUpdateRecordA (fulldomain , ipaddr string ) (err error ) {
99
+ func (ak * AccessKey ) CheckAndUpdateRecord (fulldomain , ipaddr string , ipv6 bool ) (err error ) {
100
100
if getDNS (fulldomain ) == ipaddr {
101
101
return // Skip
102
102
}
103
103
rr := regexp .MustCompile (`\.[^\.]*` ).ReplaceAllString (fulldomain , "" )
104
104
domain := regexp .MustCompile (`^[^\.]*\.` ).ReplaceAllString (fulldomain , "" )
105
105
// fmt.Println(rr, domain)
106
+ recordType := "A"
107
+ if ipv6 {
108
+ recordType = "AAAA"
109
+ }
106
110
var target * dns.RecordTypeNew
107
111
if dnsRecords , err := ak .ListRecord (domain ); err == nil {
108
112
for i := range dnsRecords {
109
- if dnsRecords [i ].RR == rr {
113
+ if dnsRecords [i ].RR == rr && dnsRecords [ i ]. Type == recordType {
110
114
target = & dnsRecords [i ]
111
115
break
112
116
}
113
117
}
114
118
} else {
115
119
return err
116
120
}
121
+
117
122
if target == nil {
118
- err = ak .AddRecord (domain , rr , "A" , ipaddr )
123
+ err = ak .AddRecord (domain , rr , recordType , ipaddr )
119
124
} 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 )
121
129
}
122
130
if err != nil && strings .Contains (err .Error (), `DomainRecordDuplicate` ) {
123
131
ak .DelRecord (fulldomain )
124
- return ak .CheckAndUpdateRecordA (fulldomain , ipaddr )
132
+ return ak .CheckAndUpdateRecord (fulldomain , ipaddr , ipv6 )
125
133
}
126
134
return err
127
135
}
@@ -211,13 +219,17 @@ func main() {
211
219
Name : "ipaddr, i" ,
212
220
Usage : "Specific `IP`. like 1.2.3.4" ,
213
221
},
222
+ cli.BoolFlag {
223
+ Name : "ipv6, 6" ,
224
+ Usage : "update IPv6 address" ,
225
+ },
214
226
},
215
227
Action : func (c * cli.Context ) error {
216
228
if err := appInit (c ); err != nil {
217
229
return err
218
230
}
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 {
221
233
log .Printf ("%+v" , err )
222
234
} else {
223
235
log .Println (c .String ("domain" ), c .String ("ipaddr" ), ip2locCN (c .String ("ipaddr" )))
@@ -239,6 +251,10 @@ func main() {
239
251
Value : "" ,
240
252
Usage : "redo Auto-Update, every N `Seconds`; Disable if N less than 10; End with [Rr] enable random delay: [N, 2N]" ,
241
253
},
254
+ cli.BoolFlag {
255
+ Name : "ipv6, 6" ,
256
+ Usage : "update IPv6 address" ,
257
+ },
242
258
},
243
259
Action : func (c * cli.Context ) error {
244
260
if err := appInit (c ); err != nil {
@@ -262,7 +278,10 @@ func main() {
262
278
}
263
279
for {
264
280
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 {
266
285
log .Printf ("%+v" , err )
267
286
} else {
268
287
log .Println (c .String ("domain" ), autoip , ip2locCN (autoip ))
0 commit comments