1111"""See the check's README for more details.
1212"""
1313
14- import argparse # pylint: disable=C0413
15- import sys # pylint: disable=C0413
14+ import argparse
15+ import sys
1616
17- import lib .args # pylint: disable=C0413
18- import lib .base # pylint: disable=C0413
19- import lib .human # pylint: disable=C0413
20- import lib .shell # pylint: disable=C0413
21- import lib .lftest # pylint: disable=C0413
22- from lib .globals import (STATE_CRIT , STATE_OK , # pylint: disable=C0413
23- STATE_UNKNOWN , STATE_WARN )
17+ import lib .args
18+ import lib .base
19+ import lib .human
20+ import lib .lftest
21+ import lib .shell
22+ from lib .globals import (STATE_OK , STATE_UNKNOWN , STATE_WARN )
2423
2524__author__ = 'Linuxfabrik GmbH, Zurich/Switzerland'
26- __version__ = '2025021501 '
25+ __version__ = '2025091501 '
2726
28- DESCRIPTION = '''This plugin checks the clock offset of chronyd in milliseconds
29- compared to ntp servers.'''
27+ DESCRIPTION = '''This plugin compares the chronyd clock offset in milliseconds to that of
28+ the NTP servers.'''
3029
31- DEFAULT_WARN = 800 # ms offset
3230DEFAULT_CRIT = 86400000 # 24h in ms offset
31+ DEFAULT_STRATUM = 6
32+ DEFAULT_WARN = 800 # ms offset
3333
3434
3535def parse_args ():
@@ -40,17 +40,27 @@ def parse_args():
4040 parser .add_argument (
4141 '-V' , '--version' ,
4242 action = 'version' ,
43- version = '{0} : v{1 } by {2}' . format ( '%(prog)s' , __version__ , __author__ )
43+ version = f'%(prog)s : v{ __version__ } by { __author__ } '
4444 )
4545
4646 parser .add_argument (
4747 '-c' , '--critical' ,
48- help = 'Set the critical threshold for the ntp time offset, in ms. Default: %(default)sms' ,
48+ help = 'Set the critical threshold for the ntp time offset, in ms. '
49+ 'Default: %(default)sms' ,
4950 dest = 'CRIT' ,
5051 type = int ,
5152 default = DEFAULT_CRIT ,
5253 )
5354
55+ parser .add_argument (
56+ '--stratum' ,
57+ help = lib .args .help ('--stratum' ) + ' '
58+ + 'Default: %(default)s' ,
59+ dest = 'STRATUM' ,
60+ type = int ,
61+ default = DEFAULT_STRATUM ,
62+ )
63+
5464 parser .add_argument (
5565 '--test' ,
5666 help = 'For unit tests. Needs "path-to-stdout-file,path-to-stderr-file,expected-retc".' ,
@@ -60,7 +70,8 @@ def parse_args():
6070
6171 parser .add_argument (
6272 '-w' , '--warning' ,
63- help = 'Set the warning threshold for the ntp time offset, in ms. Default: %(default)sms' ,
73+ help = 'Set the warning threshold for the ntp time offset, in ms. '
74+ 'Default: %(default)sms' ,
6475 dest = 'WARN' ,
6576 type = int ,
6677 default = DEFAULT_WARN ,
@@ -81,18 +92,27 @@ def main():
8192
8293 if args .TEST is None :
8394 cmd = 'chronyc tracking'
84- stdout , stderr , retc = lib .base .coe (lib .shell .shell_exec (cmd )) # pylint: disable=W0612
85- if stderr :
86- lib .base .cu (stderr )
95+ stdout , stderr , _ = lib .base .coe (lib .shell .shell_exec (cmd ))
8796 else :
8897 # do not call the command, put in test data
89- stdout , stderr , retc = lib .lftest .test (args .TEST )
98+ stdout , stderr , _ = lib .lftest .test (args .TEST )
99+ if stderr :
100+ lib .base .cu (stderr )
90101
91102 # init some vars
92103 msg = ''
93104 state = STATE_OK
94105 perfdata = ''
106+
107+ frequency = 0
108+ last_offset = 0
109+ leap_status = ''
95110 peer_used = False
111+ residual_freq = 0
112+ rms_offset = 0
113+ root_delay = 0
114+ root_dispersion = 0
115+ skew = 0
96116
97117 # analyze data
98118 for line in stdout .splitlines ():
@@ -130,31 +150,93 @@ def main():
130150 msg = 'NTP server not reachable. No NTP server is used.'
131151 success , result = lib .shell .shell_exec ('chronyc sources' )
132152 if success :
133- msg += '\n \n {}' . format ( result [0 ])
153+ msg += '\n \n ' + result [0 ]
134154 lib .base .oao (msg , STATE_WARN )
135155
136156 # build the message
137157 offset_state = lib .base .get_state (abs (last_offset ), args .WARN , args .CRIT )
138158 state = lib .base .get_worst (state , offset_state )
139- msg += 'NTP offset is {}ms{}, ' .format (
140- round (last_offset , 3 ),
141- lib .base .state2str (offset_state , prefix = ' ' ),
142- )
143- msg += 'Stratum is {}' .format (stratum )
144- if stratum >= 9 :
159+ msg += f'NTP offset is { round (last_offset , 3 )} ms' \
160+ f'{ lib .base .state2str (offset_state , prefix = ' ' )} , ' \
161+ f'Stratum is { stratum } '
162+ if stratum >= args .STRATUM :
145163 stratum_state = STATE_WARN
146164 state = lib .base .get_worst (state , stratum_state )
147- msg += ' is >= 9{}' .format (lib .base .state2str (stratum_state , prefix = ' ' ))
148- msg += ', Leap status is {}' .format (leap_status )
149-
150- perfdata += lib .base .get_perfdata ('frequency' , frequency , None , None , None , None , None )
151- perfdata += lib .base .get_perfdata ('last_offset' , last_offset , 'ms' , args .WARN , args .CRIT , None , None )
152- perfdata += lib .base .get_perfdata ('residual_freq' , residual_freq , None , None , None , None , None )
153- perfdata += lib .base .get_perfdata ('rms_offset' , rms_offset , 'ms' , None , None , None , None )
154- perfdata += lib .base .get_perfdata ('root_delay' , root_delay , 'ms' , None , None , None , None )
155- perfdata += lib .base .get_perfdata ('root_dispersion' , root_dispersion , 'ms' , None , None , None , None )
156- perfdata += lib .base .get_perfdata ('skew' , skew , None , None , None , None , None )
157- perfdata += lib .base .get_perfdata ('stratum' , stratum , None , 9 , None , 0 , None )
165+ msg += f' (is >= { args .STRATUM } { lib .base .state2str (stratum_state )} )'
166+ msg += f', Leap status is { leap_status } '
167+
168+ perfdata += lib .base .get_perfdata (
169+ 'frequency' ,
170+ frequency ,
171+ uom = None ,
172+ warn = None ,
173+ crit = None ,
174+ _min = None ,
175+ _max = None ,
176+ )
177+ perfdata += lib .base .get_perfdata (
178+ 'last_offset' ,
179+ last_offset ,
180+ uom = 'ms' ,
181+ warn = args .WARN ,
182+ crit = args .CRIT ,
183+ _min = None ,
184+ _max = None ,
185+ )
186+ perfdata += lib .base .get_perfdata (
187+ 'residual_freq' ,
188+ residual_freq ,
189+ uom = None ,
190+ warn = None ,
191+ crit = None ,
192+ _min = None ,
193+ _max = None ,
194+ )
195+ perfdata += lib .base .get_perfdata (
196+ 'rms_offset' ,
197+ rms_offset ,
198+ uom = 'ms' ,
199+ warn = None ,
200+ crit = None ,
201+ _min = None ,
202+ _max = None ,
203+ )
204+ perfdata += lib .base .get_perfdata (
205+ 'root_delay' ,
206+ root_delay ,
207+ uom = 'ms' ,
208+ warn = None ,
209+ crit = None ,
210+ _min = None ,
211+ _max = None ,
212+ )
213+ perfdata += lib .base .get_perfdata (
214+ 'root_dispersion' ,
215+ root_dispersion ,
216+ uom = 'ms' ,
217+ warn = None ,
218+ crit = None ,
219+ _min = None ,
220+ _max = None ,
221+ )
222+ perfdata += lib .base .get_perfdata (
223+ 'skew' ,
224+ skew ,
225+ uom = None ,
226+ warn = None ,
227+ crit = None ,
228+ _min = None ,
229+ _max = None ,
230+ )
231+ perfdata += lib .base .get_perfdata (
232+ 'stratum' ,
233+ stratum ,
234+ uom = None ,
235+ warn = args .STRATUM ,
236+ crit = None ,
237+ _min = 0 ,
238+ _max = 16 ,
239+ )
158240
159241 # over and out
160242 lib .base .oao (msg + '\n \n ' + stdout , state , perfdata )
0 commit comments