#!/usr/bin/env python3 import logging from ipaddress import ip_address from json import loads from subprocess import check_output, run DOMAIN = '${domain}' # <%text> logging.basicConfig(level=logging.INFO) LOG = logging.getLogger('DynDNS checker') try: iproute = loads(check_output(['ip', '-json', 'address', 'show', 'scope', 'global'])) resolved_ipv4 = check_output(['dig', '+short', DOMAIN, 'A']).decode().strip() resolved_ipv6 = check_output(['dig', '+short', DOMAIN, 'AAAA']).decode().strip() LOG.info(f'resolved ipv4 is "{resolved_ipv4}"') LOG.info(f'resolved ipv6 is "{resolved_ipv6}"') needs_changing = False for iface in iproute: if not iface['ifname'].startswith('ppp'): LOG.debug(f'ignoring {iface["ifname"]}') continue LOG.info(f'working on {iface["ifname"]}') for ip in iface['addr_info']: try: addr = ip_address(ip['local']) LOG.info(f'{iface["ifname"]} has ip {addr.compressed}') if ( (addr.version == 4 and addr.compressed != resolved_ipv4) or (addr.version == 6 and addr.compressed != resolved_ipv6) ): needs_changing = True except Exception: continue if needs_changing: LOG.warning('addresses have changed, calling update script!') run(['/etc/ppp/ip-up.d/dyndns']) else: LOG.info('everything is fine') except Exception as e: logging.exception(e) #