bundles/pppd: automatically restart pppoe (once per hour) if no public ip address can be found
Some checks failed
bundlewrap/pipeline/head There was a failure building this commit
Some checks failed
bundlewrap/pipeline/head There was a failure building this commit
This commit is contained in:
parent
b80c0b12fe
commit
bd217f0666
4 changed files with 54 additions and 1 deletions
46
bundles/pppd/files/restart-pppoe-if-no-public-ip
Normal file
46
bundles/pppd/files/restart-pppoe-if-no-public-ip
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
from ipaddress import ip_address
|
||||||
|
from subprocess import run
|
||||||
|
from sys import exit
|
||||||
|
|
||||||
|
import netifaces
|
||||||
|
|
||||||
|
now = int(datetime.timestamp(datetime.utcnow()))
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open('/var/tmp/pppd-last-restart.status', 'r') as f:
|
||||||
|
last_restart = int(f.read().strip())
|
||||||
|
except:
|
||||||
|
last_restart = 0
|
||||||
|
|
||||||
|
if now-3600 < last_restart:
|
||||||
|
print('Last restart is less than an hour ago, exiting ...')
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
ifaces = set()
|
||||||
|
for i in netifaces.interfaces():
|
||||||
|
if i.startswith('ppp'):
|
||||||
|
ifaces.add(i)
|
||||||
|
|
||||||
|
system_has_public_ip = False
|
||||||
|
for iface in ifaces:
|
||||||
|
for type in [netifaces.AF_INET, netifaces.AF_INET6]:
|
||||||
|
for ip in netifaces.ifaddresses(iface)[type]:
|
||||||
|
try:
|
||||||
|
addr = ip_address(ip['addr'])
|
||||||
|
|
||||||
|
if not addr.is_private and not addr.is_loopback:
|
||||||
|
system_has_public_ip = True
|
||||||
|
except:
|
||||||
|
# Apparently not an ip
|
||||||
|
pass
|
||||||
|
|
||||||
|
if not system_has_public_ip:
|
||||||
|
run(['systemctl', 'restart', 'pppoe'])
|
||||||
|
|
||||||
|
with open('/var/tmp/pppd-last-restart.status', 'w') as f:
|
||||||
|
f.write(now)
|
||||||
|
|
||||||
|
print('pppoe.service has been restarted')
|
|
@ -81,6 +81,9 @@ files = {
|
||||||
'svc_systemd:pppoe:restart',
|
'svc_systemd:pppoe:restart',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
'/usr/local/bin/restart-pppoe-if-no-public-ip': {
|
||||||
|
'mode': '0755',
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if 'dyndns' in node.metadata['pppd']:
|
if 'dyndns' in node.metadata['pppd']:
|
||||||
|
|
|
@ -4,7 +4,11 @@ defaults = {
|
||||||
'ppp': {},
|
'ppp': {},
|
||||||
'pppoe': {},
|
'pppoe': {},
|
||||||
'python3-requests': {},
|
'python3-requests': {},
|
||||||
|
'python3-netifaces': {},
|
||||||
'ndisc6': {},
|
'ndisc6': {},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
'cron': {
|
||||||
|
'restart-pppoe-if-no-public-ip': '*/5 * * * * root /usr/local/bin/restart-pppoe-if-no-public-ip',
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,7 +41,7 @@ nodes['home.router'] = {
|
||||||
# connected longer than 24 hours. We install this cronjob
|
# connected longer than 24 hours. We install this cronjob
|
||||||
# to make sure we don't get disconnected randomly during the
|
# to make sure we don't get disconnected randomly during the
|
||||||
# day.
|
# day.
|
||||||
'restart_pppd': '23 2 * * * root systemctl restart pppoe',
|
'restart_pppd': '23 2 * * * root systemctl restart pppoe && date -u +%s > /var/tmp/pppd-last-restart.status',
|
||||||
},
|
},
|
||||||
'dhcpd': {
|
'dhcpd': {
|
||||||
'subnets': {
|
'subnets': {
|
||||||
|
|
Loading…
Reference in a new issue