You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
1.9 KiB

#!/usr/bin/env python
## imports
import json
import requests
import os, sys
import logging
import logging.handlers
from dotenv import load_dotenv
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler(address = '/dev/log')
formatter = logging.Formatter("dyndns-update: %(message)s")
handler.setFormatter(formatter)
my_logger.addHandler(handler)
env_path = os.path.abspath ( os.path.join ( os.curdir, os.path.relpath('.env') ) )
load_dotenv(verbose=True, dotenv_path=env_path)
## constants
PDNS_API_BASE = os.getenv("PDNS_API_BASE")
PDNS_TOKEN = os.getenv("PDNS_TOKEN")
TMPFILE = '/tmp/lastIP'
def get_ip():
r = requests.get('http://ipinfo.io')
return (r.json()['ip'])
def set_record(zone, name, type, record):
payload = {
'rrsets': [
{
'name': name,
'type': type,
'ttl': 30,
'changetype': "REPLACE",
'records': [ record ]
}
]
}
p = requests.patch(PDNS_API_BASE + 'zones/' + zone, headers={'X-API-KEY': PDNS_TOKEN}, json=payload)
return (p.status_code)
if len(sys.argv) > 2:
if os.path.exists(TMPFILE):
with open(TMPFILE) as file:
try:
lastIP=file.read()
except:
my_logger.critical('error reading ' + TMPFILE)
else:
lastIP = ''
currentIP = get_ip()
if lastIP == currentIP:
my_logger.debug ('IP has not changed since last call')
exit()
record = {
'disabled': False,
'content': currentIP
}
if (set_record (sys.argv[1], sys.argv[2]+'.', 'A', record) == 204):
my_logger.debug('IP of ' + sys.argv[2] + ' successfully changed to ' + currentIP)
with open(TMPFILE, 'w') as file:
file.write(currentIP)
else:
print('Updates IP record of NAME in ZONE to current IP from ipinfo.io\n\nUsage:\n' + sys.argv[0] + ' ZONE NAME')