55 lines
1.2 KiB
Text
55 lines
1.2 KiB
Text
|
#!/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. This is probably fine.')
|
||
|
exit(0)
|
||
|
|
||
|
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)
|