home.router: let dyndns have ipv6 please
This commit is contained in:
parent
951d254c7a
commit
d999895450
6 changed files with 100 additions and 76 deletions
|
@ -1,20 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
[[ -n "$DEBUG" ]] && set -x
|
|
||||||
|
|
||||||
interface="$(ip link show | awk '/ ppp/ {print substr($2, 1, length($2)-1)}')"
|
|
||||||
addr="$(ip addr show dev "$interface" | awk '/inet / {print $2}')"
|
|
||||||
resolved="$(dig +short "${domain}" A)"
|
|
||||||
|
|
||||||
if [[ -z "$addr" ]] || [[ -z "$resolved" ]]
|
|
||||||
then
|
|
||||||
echo "Address on '$interface' is '$addr' - resolved '$resolved'"
|
|
||||||
exit 3
|
|
||||||
elif [[ "$addr" == "$resolved" ]]
|
|
||||||
then
|
|
||||||
echo "Resolved IP for ${domain} matches current ip on $interface"
|
|
||||||
exit 0
|
|
||||||
else
|
|
||||||
echo "Resolved $resolved for ${domain}, but got $addr on $interface!"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
|
@ -1,24 +1,59 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
from sys import argv
|
import logging
|
||||||
|
from ipaddress import ip_address
|
||||||
|
from json import loads
|
||||||
|
from subprocess import check_output
|
||||||
|
|
||||||
import requests
|
from requests import get
|
||||||
|
|
||||||
INTERFACE = argv[1]
|
|
||||||
LOCAL_IP = argv[4]
|
|
||||||
|
|
||||||
UPDATE_URL = '${url}'
|
UPDATE_URL = '${url}'
|
||||||
USERNAME = '${username}'
|
USERNAME = '${username}'
|
||||||
PASSWORD = '${password}'
|
PASSWORD = '${password}'
|
||||||
|
|
||||||
r = requests.get(
|
# <%text>
|
||||||
UPDATE_URL.format(
|
logging.basicConfig(level=logging.INFO)
|
||||||
ip=LOCAL_IP,
|
LOG = logging.getLogger('DynDNS')
|
||||||
),
|
try:
|
||||||
auth=(
|
ips = set()
|
||||||
USERNAME,
|
|
||||||
PASSWORD,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
print('got status {} when updating dns'.format(r.status_code))
|
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>
|
||||||
|
|
|
@ -1,17 +1,52 @@
|
||||||
#!/bin/bash
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
[[ -n "$DEBUG" ]] && set -x
|
import logging
|
||||||
|
from ipaddress import ip_address
|
||||||
|
from json import loads
|
||||||
|
from subprocess import check_output, run
|
||||||
|
|
||||||
interface="$(ip link show | awk '/ ppp/ {print substr($2, 1, length($2)-1)}')"
|
|
||||||
addr="$(ip addr show dev "$interface" | awk '/inet / {print $2}')"
|
|
||||||
resolved="$(dig +short "${domain}" A)"
|
|
||||||
|
|
||||||
if [[ -z "$addr" ]] || [[ -z "$resolved" ]]
|
DOMAIN = '${domain}'
|
||||||
then
|
|
||||||
echo "Something is wrong:"
|
# <%text>
|
||||||
echo "Address on '$interface' is '$addr'"
|
logging.basicConfig(level=logging.INFO)
|
||||||
echo "Resolved DNS is '$resolved'"
|
LOG = logging.getLogger('DynDNS checker')
|
||||||
elif [[ "$addr" != "$resolved" ]]
|
try:
|
||||||
then
|
iproute = loads(check_output(['ip', '-json', 'address', 'show', 'scope', 'global']))
|
||||||
/etc/ppp/ip-up.d/dyndns "$interface" "doesnt" "matter" "$addr"
|
resolved_ipv4 = check_output(['dig', '+short', DOMAIN, 'A']).decode().strip()
|
||||||
fi
|
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)
|
||||||
|
|
||||||
|
# </%text>
|
||||||
|
|
|
@ -110,11 +110,6 @@ if node.metadata.get('pppd/dyndns', {}):
|
||||||
'context': node.metadata.get('pppd/dyndns'),
|
'context': node.metadata.get('pppd/dyndns'),
|
||||||
'mode': '0755',
|
'mode': '0755',
|
||||||
}
|
}
|
||||||
files['/usr/local/share/icinga/plugins/check_dyndns_update'] = {
|
|
||||||
'content_type': 'mako',
|
|
||||||
'context': node.metadata.get('pppd/dyndns'),
|
|
||||||
'mode': '0755',
|
|
||||||
}
|
|
||||||
files['/usr/local/bin/dyndns_periodic'] = {
|
files['/usr/local/bin/dyndns_periodic'] = {
|
||||||
'content_type': 'mako',
|
'content_type': 'mako',
|
||||||
'context': node.metadata.get('pppd/dyndns'),
|
'context': node.metadata.get('pppd/dyndns'),
|
||||||
|
|
|
@ -39,24 +39,3 @@ def ignore_interface(metadata):
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@metadata_reactor.provides(
|
|
||||||
'icinga2_api/pppd/services',
|
|
||||||
)
|
|
||||||
def icinga_dyndns(metadata):
|
|
||||||
if not metadata.get('pppd/dyndns', {}):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
return {
|
|
||||||
'icinga2_api': {
|
|
||||||
'pppd': {
|
|
||||||
'services': {
|
|
||||||
'DYNDNS UPDATE': {
|
|
||||||
'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_dyndns_update',
|
|
||||||
'vars.notification.mail': True,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
nodes['home.router'] = {
|
nodes['home.router'] = {
|
||||||
'hostname': 'router-remote',
|
'hostname': '172.19.138.1',
|
||||||
'bundles': {
|
'bundles': {
|
||||||
'bird',
|
'bird',
|
||||||
'kea-dhcp-server',
|
'kea-dhcp-server',
|
||||||
|
@ -118,7 +118,7 @@ nodes['home.router'] = {
|
||||||
'interface': 'enp1s0.7',
|
'interface': 'enp1s0.7',
|
||||||
'dyndns': {
|
'dyndns': {
|
||||||
'domain': 'franzi-home.kunbox.net',
|
'domain': 'franzi-home.kunbox.net',
|
||||||
'url': 'https://ns-mephisto.kunbox.net/nic/update?hostname=franzi-home.kunbox.net&myip={ip}',
|
'url': 'https://ns-mephisto.kunbox.net/nic/update?hostname=franzi-home.kunbox.net&myip={ips}',
|
||||||
'username': vault.decrypt('encrypt$gAAAAABfr8DLAJhmUIhdxLq83I8MnRRvkRgDZcO8Brvw1KpvplC3K8ZGj0jIIWD3Us33vIP6t0ybd_mgD8slpRUk78Kqd3BMoQ=='),
|
'username': vault.decrypt('encrypt$gAAAAABfr8DLAJhmUIhdxLq83I8MnRRvkRgDZcO8Brvw1KpvplC3K8ZGj0jIIWD3Us33vIP6t0ybd_mgD8slpRUk78Kqd3BMoQ=='),
|
||||||
'password': vault.decrypt('encrypt$gAAAAABfr8Cq5M1hweeJTQAl0dLhFntdlw-QnkIYUQpY-_ycODVWOpyeAwjwOgWLSdsdXIUvqcoiXPZPV-BE12p5C42NGnj9r7sKYpoGz8xfuGIk6haMa2g='),
|
'password': vault.decrypt('encrypt$gAAAAABfr8Cq5M1hweeJTQAl0dLhFntdlw-QnkIYUQpY-_ycODVWOpyeAwjwOgWLSdsdXIUvqcoiXPZPV-BE12p5C42NGnj9r7sKYpoGz8xfuGIk6haMa2g='),
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue