Skip to content

Commit

Permalink
optimization + python3 compatible
Browse files Browse the repository at this point in the history
  • Loading branch information
Cedrick GAILLARD committed Jul 20, 2020
1 parent bcae18b commit 839bb5d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 20 deletions.
6 changes: 4 additions & 2 deletions src/example.config.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,12 @@
+ <?php $ip = $_SERVER['REMOTE_ADDR']; ?>
<?php print $ip; ?>
e.g.
+ https://ifconfig.co/ip
+ https://ifconfig.co
+ http://ifconfig.me/ip
+ http://whatismyip.akamai.com/
+ http://ipinfo.io/ip
+ many more ...
'''
ifconfig = 'choose_from_above_or_run_your_own'
ifconfig = 'http://ipinfo.io/ip'
ifconfig_name = 'ipinfo.io'
gateway = '---Your GATEWAY IP----'
49 changes: 31 additions & 18 deletions src/gandi-live-dns.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,33 @@
Created on 13 Aug 2017
http://doc.livedns.gandi.net/
http://doc.livedns.gandi.net/#api-endpoint -> https://dns.gandi.net/api/v5/
http://doc.livedns.gandi.net/#api-endpoint -> https://dns.beta.gandi.net/api/v5/
'''

import requests, json
import config
import argparse
import socket
from pyroute2 import IPRoute

def set_route(dest, gw):
resolver = socket.gethostbyname(dest)
ip = IPRoute()
get_to = ip.get_routes(dst=resolver)
for f in get_to[0]['attrs']:
if f[0] == 'RTA_GATEWAY':
gw_curr = f[1]
if gw_curr != gw:
ip.route('add', dst=resolver, gateway=gw, mask=32)


def get_dynip(ifconfig_provider):
''' find out own IPv4 at home <-- this is the dynamic IP which changes more or less frequently
similar to curl ifconfig.me/ip, see example.config.py for details to ifconfig providers
'''
r = requests.get(ifconfig_provider)
print 'Checking dynamic IP: ' , r._content.strip('\n')
return r.content.strip('\n')
print('Checking dynamic IP: ' , r._content.decode('utf-8').strip('\n'))
return r.content.decode('utf-8').strip('\n')

def get_uuid():
'''
Expand All @@ -38,8 +50,8 @@ def get_uuid():
if u.status_code == 200:
return json_object['zone_uuid']
else:
print 'Error: HTTP Status Code ', u.status_code, 'when trying to get Zone UUID'
print json_object['message']
print('Error: HTTP Status Code ', u.status_code, 'when trying to get Zone UUID')
print( json_object['message'])
exit()

def get_dnsip(uuid):
Expand All @@ -51,16 +63,16 @@ def get_dnsip(uuid):
the actual DNS Record IP
'''

url = config.api_endpoint+ '/zones/' + uuid + '/records/' + config.subdomains[0] + '/A'
url = "{0}/zones/{1}/records/{2}/A".format(config.api_endpoint, uuid, config.subdomains[0])
headers = {"X-Api-Key":config.api_secret}
u = requests.get(url, headers=headers)
if u.status_code == 200:
json_object = json.loads(u._content)
print 'Checking IP from DNS Record' , config.subdomains[0], ':', json_object['rrset_values'][0].encode('ascii','ignore').strip('\n')
return json_object['rrset_values'][0].encode('ascii','ignore').strip('\n')
print('Checking IP from DNS Record' , config.subdomains[0], ':', json_object['rrset_values'][0].encode('ascii','ignore'))
return json_object['rrset_values'][0].encode('ascii','ignore')
else:
print 'Error: HTTP Status Code ', u.status_code, 'when trying to get IP from subdomain', config.subdomains[0]
print json_object['message']
print('Error: HTTP Status Code ', u.status_code, 'when trying to get IP from subdomain', config.subdomains[0])
print( json_object['message'])
exit()

def update_records(uuid, dynIP, subdomain):
Expand All @@ -71,7 +83,7 @@ def update_records(uuid, dynIP, subdomain):
-H 'X-Api-Key: XXX' \
-d '{"rrset_ttl": 10800,
"rrset_values": ["<VALUE>"]}' \
https://dns.gandi.net/api/v5/zones/<UUID>/records/<NAME>/<TYPE>
https://dns.beta.gandi.net/api/v5/zones/<UUID>/records/<NAME>/<TYPE>
'''
url = config.api_endpoint+ '/zones/' + uuid + '/records/' + subdomain + '/A'
payload = {"rrset_ttl": config.ttl, "rrset_values": [dynIP]}
Expand All @@ -80,37 +92,38 @@ def update_records(uuid, dynIP, subdomain):
json_object = json.loads(u._content)

if u.status_code == 201:
print 'Status Code:', u.status_code, ',', json_object['message'], ', IP updated for', subdomain
print('Status Code:', u.status_code, ',', json_object['message'], ', IP updated for', subdomain)
return True
else:
print 'Error: HTTP Status Code ', u.status_code, 'when trying to update IP from subdomain', subdomain
print json_object['message']
print('Error: HTTP Status Code ', u.status_code, 'when trying to update IP from subdomain', subdomain)
print( json_object['message'])
exit()



def main(force_update, verbosity):

if verbosity:
print "verbosity turned on - not implemented by now"
print("verbosity turned on - not implemented by now")


#get zone ID from Account
uuid = get_uuid()

#compare dynIP and DNS IP
set_route(config.ifconfig_name, config.gateway)
dynIP = get_dynip(config.ifconfig)
dnsIP = get_dnsip(uuid)

if force_update:
print "Going to update/create the DNS Records for the subdomains"
print("Going to update/create the DNS Records for the subdomains")
for sub in config.subdomains:
update_records(uuid, dynIP, sub)
else:
if dynIP == dnsIP:
print "IP Address Match - no further action"
print("IP Address Match - no further action")
else:
print "IP Address Mismatch - going to update the DNS Records for the subdomains with new IP", dynIP
print("IP Address Mismatch - going to update the DNS Records for the subdomains with new IP", dynIP)
for sub in config.subdomains:
update_records(uuid, dynIP, sub)

Expand Down

1 comment on commit 839bb5d

@paulhenry46
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Very good work! It works perfectly for me with python 3! Thanks a lot! Be careful, ipinfo.io returns an error, but with whatismyip.akamai.com, it works!

Please sign in to comment.