#!/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')