can require IP version(s)
This commit is contained in:
parent
b012a6b7dd
commit
dab404ecb6
1 changed files with 64 additions and 54 deletions
|
@ -26,9 +26,14 @@ in which cases we can call with no argument (the ovh module gets the credentials
|
||||||
'''
|
'''
|
||||||
client = ovh.Client()
|
client = ovh.Client()
|
||||||
|
|
||||||
|
# Should missing IP address being considered as error (Depend on the ISP, internet box settings...)?
|
||||||
|
# In case a required IP cannot be obtained, the script will send an email and stop without updating anything.
|
||||||
|
# If, for any reason, IPv4 or IPv6 address cannot be obtained and if it is not protected by this list, the corresponding records will be deleted for all hosts.
|
||||||
|
ip_versions_required = [4] # MUST not be empty. Can be [4],[6] or [4,6]
|
||||||
|
|
||||||
default_ttl = 600 # seconds
|
default_ttl = 600 # seconds
|
||||||
# ttl = how long will a DNS server cache the value before checking it at the Registrar. Longer value yields faster name resolution most of the time, but less frequent updates
|
# ttl = how long will a DNS server cache the value before checking it at the Registrar. Longer value yields faster name resolution most of the time, but less frequent updates
|
||||||
records_changed = 0
|
|
||||||
# list of hosts (=subdomain.domain.tld) to update, each a dictionnary with at least "domain" and "subdomain" defined
|
# list of hosts (=subdomain.domain.tld) to update, each a dictionnary with at least "domain" and "subdomain" defined
|
||||||
hosts = [
|
hosts = [
|
||||||
{
|
{
|
||||||
|
@ -56,7 +61,7 @@ def send_email(msg, sender = 'no_reply@mydomain.com', receiver = 'admin@mydomain
|
||||||
try :
|
try :
|
||||||
smtpObj = smtplib.SMTP('localhost')
|
smtpObj = smtplib.SMTP('localhost')
|
||||||
smtpObj.sendmail(sender, receiver,
|
smtpObj.sendmail(sender, receiver,
|
||||||
"From: {}\nTo: {}\nSubject: DNS Update problem\n\n{}\n".format(sender, receiver, msg)
|
"From: {}\nTo: {}\nSubject: DNS update problem\n\nThe ovh-dns-updater.py script reports:\n{}\n".format(sender, receiver, msg)
|
||||||
)
|
)
|
||||||
except smtplib.SMTPException:
|
except smtplib.SMTPException:
|
||||||
print( timestamp()," : Error unable to send email")
|
print( timestamp()," : Error unable to send email")
|
||||||
|
@ -67,8 +72,22 @@ def get_current_ip(v = 4):
|
||||||
r = requests.get(url, timeout=5.0)
|
r = requests.get(url, timeout=5.0)
|
||||||
except requests.exceptions.RequestException as e:
|
except requests.exceptions.RequestException as e:
|
||||||
#print("failed getting ipv{} address because {} occurred".format(v, str(e)))
|
#print("failed getting ipv{} address because {} occurred".format(v, str(e)))
|
||||||
|
if v in ip_versions_required :
|
||||||
|
message = "{} : Cannot get required IPv{} because {} occurred. Failing".format(timestamp(), v, e)
|
||||||
|
print(message)
|
||||||
|
send_email (message)
|
||||||
|
quit()
|
||||||
|
else :
|
||||||
|
return False
|
||||||
|
if r.status_code == requests.codes.ok
|
||||||
|
return r.text
|
||||||
|
elif v in ip_versions_required :
|
||||||
|
message = "{} : Cannot get required IPv{} : requests.get returned status_code {}. Failing".format(timestamp(), v, r.status_code)
|
||||||
|
print(message)
|
||||||
|
send_email (message)
|
||||||
|
quit()
|
||||||
|
else :
|
||||||
return False
|
return False
|
||||||
return r.text if r.status_code == requests.codes.ok else False
|
|
||||||
|
|
||||||
def timestamp() :
|
def timestamp() :
|
||||||
return time.asctime( time.localtime(time.time()) )
|
return time.asctime( time.localtime(time.time()) )
|
||||||
|
@ -145,24 +164,20 @@ def delete_record(domain, subdomain, typ):
|
||||||
records_changed += 1
|
records_changed += 1
|
||||||
|
|
||||||
|
|
||||||
#reload saved values
|
|
||||||
try:
|
|
||||||
with open(current_ip_file, 'r') as f:
|
|
||||||
old_time, old_ipv4, old_ipv6 = json.load(f)
|
|
||||||
except IOError:
|
|
||||||
#print("No old ips recorded")
|
|
||||||
pass
|
|
||||||
|
|
||||||
current_ipv4 = get_current_ip(4)
|
current_ipv4 = get_current_ip(4)
|
||||||
current_ipv6 = get_current_ip(6)
|
current_ipv6 = get_current_ip(6)
|
||||||
#print('current ips: {} ; {}'.format(current_ipv4, current_ipv6))
|
#print('current ips: {} ; {}'.format(current_ipv4, current_ipv6))
|
||||||
|
|
||||||
if current_ipv4 or current_ipv6 : #we could get at least one address
|
#reload saved values & compare
|
||||||
try :
|
try:
|
||||||
|
with open(current_ip_file, 'r') as f:
|
||||||
|
old_time, old_ipv4, old_ipv6 = json.load(f)
|
||||||
need_update = (old_ipv4 != current_ipv4) or (old_ipv6 != current_ipv6) or ((old_time - time.time()) > 3600.0 * checkDNS_interval_hrs)
|
need_update = (old_ipv4 != current_ipv4) or (old_ipv6 != current_ipv6) or ((old_time - time.time()) > 3600.0 * checkDNS_interval_hrs)
|
||||||
except : #old values do not exist, we must check the records
|
except IOError:
|
||||||
|
#print("No old ips recorded")
|
||||||
need_update = True
|
need_update = True
|
||||||
if need_update :
|
if need_update :
|
||||||
|
records_changed = 0
|
||||||
try :
|
try :
|
||||||
for host in hosts :
|
for host in hosts :
|
||||||
domain = host["domain"]
|
domain = host["domain"]
|
||||||
|
@ -194,13 +209,8 @@ if current_ipv4 or current_ipv6 : #we could get at least one address
|
||||||
print(msg)
|
print(msg)
|
||||||
send_email(msg)
|
send_email(msg)
|
||||||
# not saving new addresses, so that update is attempted again.
|
# not saving new addresses, so that update is attempted again.
|
||||||
else :
|
else :
|
||||||
#print("nothing to do!")
|
#print("nothing to do!")
|
||||||
pass
|
pass
|
||||||
else :
|
|
||||||
msg = "{} : cannot get IPs. Network down? ipify.org down?".format(timestamp())
|
|
||||||
print(msg)
|
|
||||||
send_email(msg)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue