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',
|
||||
},
|
||||
},
|
||||
'/usr/local/bin/restart-pppoe-if-no-public-ip': {
|
||||
'mode': '0755',
|
||||
},
|
||||
}
|
||||
|
||||
if 'dyndns' in node.metadata['pppd']:
|
||||
|
|
|
@ -4,7 +4,11 @@ defaults = {
|
|||
'ppp': {},
|
||||
'pppoe': {},
|
||||
'python3-requests': {},
|
||||
'python3-netifaces': {},
|
||||
'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
|
||||
# to make sure we don't get disconnected randomly during the
|
||||
# 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': {
|
||||
'subnets': {
|
||||
|
|
Loading…
Reference in a new issue