bundlewrap/bundles/systemd/files/check_timesyncd_sync

60 lines
1.3 KiB
Python

#!/usr/bin/env python3
from subprocess import check_output
from sys import exit
CONVERSIONS = [
('ns', 1/1000000),
('us', 1/1000),
('ms', 1),
('s', 1000),
]
try:
in_sync = check_output(
"timedatectl status | grep -iF 'system clock synchronized' | cut -d: -f2",
shell=True,
).strip().decode()
if in_sync.lower() != 'yes':
print(f'systemd-timesyncd reports sync status: {in_sync}')
exit(2)
out = check_output(
"timedatectl timesync-status | grep -iF offset | cut -d: -f2",
shell=True,
).strip().decode()
if not out:
print('NTP service is active, but could not get offset. Something is wrong.')
exit(1)
if out in ('+0', '-0', '0'):
# if the offset is exactly zero, timedatectl only shows '0', thus
# breaking the logic below.
out = '0ms'
if out.startswith('+'):
out = out[1:]
offset = None
for unit, factor in CONVERSIONS:
if out.endswith(unit):
offset = float(out[:(len(unit)*-1)])
offset = offset * factor
break
else:
raise ValueError(out)
print(f'Sync offset is {round(offset, 2)} ms')
if -50 < offset < 50:
exit(0)
elif -100 < offset < 100:
exit(1)
else:
exit(2)
except Exception as e:
print(repr(e))
exit(3)