@@ -76,19 +76,34 @@ func (provider *DNSProvider) UpdateIP(domainName, subdomainName, ip string) erro
7676 zoneID := provider .getZone (domainName )
7777 if zoneID != "" {
7878 records := provider .getDNSRecords (zoneID )
79+ matched := false
7980
8081 // update records
8182 for _ , rec := range records {
83+ rec := rec
8284 if ! recordTracked (provider .getCurrentDomain (domainName ), & rec ) {
8385 log .Debug ("Skipping record:" , rec .Name )
8486 continue
8587 }
86- if rec .IP != ip {
87- log .Infof ("IP mismatch: Current(%+v) vs Cloudflare(%+v)" , ip , rec .IP )
88- provider .updateRecord (rec , ip )
89- } else {
90- log .Infof ("Record OK: %+v - %+v" , rec .Name , rec .IP )
88+
89+ if strings .Contains (rec .Name , subdomainName ) {
90+ if rec .IP != ip {
91+ log .Infof ("IP mismatch: Current(%+v) vs Cloudflare(%+v)" , ip , rec .IP )
92+ provider .updateRecord (rec , ip )
93+ } else {
94+ log .Infof ("Record OK: %+v - %+v" , rec .Name , rec .IP )
95+ }
96+
97+ matched = true
98+ }
99+ }
100+
101+ if ! matched {
102+ log .Debugf ("Record %s not found, will create it." , subdomainName )
103+ if err := provider .createRecord (zoneID , domainName , subdomainName , ip ); err != nil {
104+ return err
91105 }
106+ log .Infof ("Record [%s] created with IP address: %s" , subdomainName , ip )
92107 }
93108 } else {
94109 log .Errorf ("Failed to find zone for domain: %s" , domainName )
@@ -100,6 +115,7 @@ func (provider *DNSProvider) UpdateIP(domainName, subdomainName, ip string) erro
100115
101116func (provider * DNSProvider ) getCurrentDomain (domainName string ) * settings.Domain {
102117 for _ , domain := range provider .configuration .Domains {
118+ domain := domain
103119 if domain .DomainName == domainName {
104120 return & domain
105121 }
@@ -210,6 +226,49 @@ func (provider *DNSProvider) getDNSRecords(zoneID string) []DNSRecord {
210226 return r .Records
211227}
212228
229+ func (provider * DNSProvider ) createRecord (zoneID , domain , subDomain , ip string ) error {
230+ newRecord := DNSRecord {
231+ Type : utils .IPTypeA ,
232+ Name : fmt .Sprintf ("%s.%s" , subDomain , domain ),
233+ IP : ip ,
234+ TTL : 1 ,
235+ }
236+
237+ content , err := json .Marshal (newRecord )
238+ if err != nil {
239+ log .Errorf ("Encoder error: %+v" , err )
240+ return err
241+ }
242+
243+ req , client := provider .newRequest ("POST" , fmt .Sprintf ("/zones/%s/dns_records" , zoneID ), bytes .NewBuffer (content ))
244+ resp , err := client .Do (req )
245+ if err != nil {
246+ log .Error ("Request error:" , err )
247+ return err
248+ }
249+
250+ defer resp .Body .Close ()
251+ body , err := ioutil .ReadAll (resp .Body )
252+ if err != nil {
253+ log .Errorf ("Failed to read request body: %+v" , err )
254+ return err
255+ }
256+
257+ var r DNSRecordUpdateResponse
258+ err = json .Unmarshal (body , & r )
259+ if err != nil {
260+ log .Errorf ("Decoder error: %+v" , err )
261+ return err
262+ }
263+
264+ if ! r .Success {
265+ log .Infof ("Response failed: %+v" , string (body ))
266+ return fmt .Errorf ("failed to create record: %+v" , string (body ))
267+ }
268+
269+ return nil
270+ }
271+
213272// Update DNS A Record with new IP.
214273func (provider * DNSProvider ) updateRecord (record DNSRecord , newIP string ) string {
215274
@@ -228,6 +287,7 @@ func (provider *DNSProvider) updateRecord(record DNSRecord, newIP string) string
228287 return ""
229288 }
230289
290+ defer resp .Body .Close ()
231291 body , _ := ioutil .ReadAll (resp .Body )
232292 err = json .Unmarshal (body , & r )
233293 if err != nil {
0 commit comments