@@ -29,44 +29,14 @@ def my_ip_address():
2929
3030 return ip_address , ip_address_type
3131
32- def main ():
33- try :
34- dns_name = sys .argv [1 ]
35- except :
36- exit ('usage: example-update-dynamic-dns.py fqdn-hostname' )
37-
38- host_name , zone_name = dns_name .split ('.' , 1 )
39-
40- ip_address , ip_address_type = my_ip_address ()
41-
42- print 'MY IP: %s %s' % (dns_name , ip_address )
43-
44- cf = CloudFlare .CloudFlare ()
45-
46- # grab the zone identifier
47- try :
48- params = {'name' :zone_name }
49- zones = cf .zones .get (params = params )
50- except CloudFlare .CloudFlareAPIError as e :
51- exit ('/zones %d %s - api call failed' % (e , e ))
52- except Exception as e :
53- exit ('/zones.get - %s - api call failed' % (e ))
54-
55- if len (zones ) != 1 :
56- exit ('/zones.get - %s - api call returned %d items' % (zone_name , len (zones )))
57-
58- zone = zones [0 ]
59-
60- zone_name = zone ['name' ]
61- zone_id = zone ['id' ]
62-
32+ def do_dns_update (cf , zone_name , zone_id , dns_name , ip_address , ip_address_type ):
6333 try :
6434 params = {'name' :dns_name ,'match' :'all' ,'type' :ip_address_type }
6535 dns_records = cf .zones .dns_records .get (zone_id , params = params )
6636 except CloudFlare .CloudFlareAPIError as e :
6737 exit ('/zones/dns_records %s - %d %s - api call failed' % (dns_name , e , e ))
6838
69- did_update = False
39+ updated = False
7040
7141 # update the record - unless it's already correct
7242 for dns_record in dns_records :
@@ -79,16 +49,18 @@ def main():
7949
8050 if ip_address_type != old_ip_address_type :
8151 # only update the correct address type (A or AAAA)
52+ # we don't see this becuase of the search params above
8253 print 'IGNORED: %s %s ; wrong address family' % (dns_name , old_ip_address )
8354 continue
8455
8556 if ip_address == old_ip_address :
8657 print 'UNCHANGED: %s %s' % (dns_name , ip_address )
87- did_update = True
58+ updated = True
8859 continue
8960
61+ # Yes, we need to update this record - we know it's the same address type
62+
9063 dns_record_id = dns_record ['id' ]
91- # update this record - we know it's the same address type
9264 dns_record = {
9365 'name' :dns_name ,
9466 'type' :ip_address_type ,
@@ -99,21 +71,59 @@ def main():
9971 except CloudFlare .CloudFlareAPIError as e :
10072 exit ('/zones.dns_records.put %s - %d %s - api call failed' % (dns_name , e , e ))
10173 print 'UPDATED: %s %s -> %s' % (dns_name , old_ip_address , ip_address )
102- did_update = True
74+ updated = True
10375
104- if did_update == False :
105- # nothing found - so create record
106- dns_record = {
107- 'name' :host_name ,
108- 'type' :ip_address_type ,
109- 'content' :ip_address
110- }
111- try :
112- dns_record = cf .zones .dns_records .post (zone_id , data = dns_record )
113- except CloudFlare .CloudFlareAPIError as e :
114- exit ('/zones.dns_records.post %s - %d %s - api call failed' % (dns_name , e , e ))
115- print 'CREATED: %s %s' % (dns_name , ip_address )
116- exit (0 )
76+ if updated :
77+ return
78+
79+ # no exsiting dns record to update - so create dns record
80+ dns_record = {
81+ 'name' :dns_name ,
82+ 'type' :ip_address_type ,
83+ 'content' :ip_address
84+ }
85+ try :
86+ dns_record = cf .zones .dns_records .post (zone_id , data = dns_record )
87+ except CloudFlare .CloudFlareAPIError as e :
88+ exit ('/zones.dns_records.post %s - %d %s - api call failed' % (dns_name , e , e ))
89+ print 'CREATED: %s %s' % (dns_name , ip_address )
90+
91+ def main ():
92+ try :
93+ dns_name = sys .argv [1 ]
94+ except :
95+ exit ('usage: example-update-dynamic-dns.py fqdn-hostname' )
96+
97+ host_name , zone_name = dns_name .split ('.' , 1 )
98+
99+ ip_address , ip_address_type = my_ip_address ()
100+
101+ print 'MY IP: %s %s' % (dns_name , ip_address )
102+
103+ cf = CloudFlare .CloudFlare ()
104+
105+ # grab the zone identifier
106+ try :
107+ params = {'name' :zone_name }
108+ zones = cf .zones .get (params = params )
109+ except CloudFlare .CloudFlareAPIError as e :
110+ exit ('/zones %d %s - api call failed' % (e , e ))
111+ except Exception as e :
112+ exit ('/zones.get - %s - api call failed' % (e ))
113+
114+ if len (zones ) == 0 :
115+ exit ('/zones.get - %s - zone not found' % (zone_name ))
116+
117+ if len (zones ) != 1 :
118+ exit ('/zones.get - %s - api call returned %d items' % (zone_name , len (zones )))
119+
120+ zone = zones [0 ]
121+
122+ zone_name = zone ['name' ]
123+ zone_id = zone ['id' ]
124+
125+ do_dns_update (cf , zone_name , zone_id , dns_name , ip_address , ip_address_type )
126+ exit (0 )
117127
118128if __name__ == '__main__' :
119129 main ()
0 commit comments