@@ -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