59 lines
1.2 KiB
Python
59 lines
1.2 KiB
Python
#!/usr/bin/env python3
|
|
|
|
import logging
|
|
from ipaddress import ip_address
|
|
from json import loads
|
|
from subprocess import check_output
|
|
|
|
from requests import get
|
|
|
|
|
|
UPDATE_URL = '${url}'
|
|
USERNAME = '${username}'
|
|
PASSWORD = '${password}'
|
|
|
|
# <%text>
|
|
logging.basicConfig(level=logging.INFO)
|
|
LOG = logging.getLogger('DynDNS')
|
|
try:
|
|
ips = set()
|
|
|
|
iproute = loads(check_output(['ip', '-json', 'address', 'show', 'scope', 'global']))
|
|
|
|
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}')
|
|
ips.add(addr.compressed)
|
|
except Exception:
|
|
continue
|
|
|
|
if ips:
|
|
LOG.info('got some addresses!')
|
|
break
|
|
|
|
url = UPDATE_URL.format(
|
|
ips=','.join(sorted(ips))
|
|
)
|
|
|
|
LOG.info(url)
|
|
|
|
r = get(
|
|
url,
|
|
auth=(
|
|
USERNAME,
|
|
PASSWORD,
|
|
),
|
|
)
|
|
r.raise_for_status()
|
|
except Exception as e:
|
|
logging.exception(e)
|
|
|
|
# </%text>
|