You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			117 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
| 
											6 years ago
										 | #!/bin/sh | ||
|  | 
 | ||
|  | : <<=cut | ||
|  | 
 | ||
|  | =head1 NAME | ||
|  | 
 | ||
|  | parse Chrony Tracking output for timeserver status information | ||
|  | 
 | ||
|  | =head1 APPLICABLE SYSTEMS | ||
|  | 
 | ||
|  | Any system with a local chronyd service. | ||
|  | 
 | ||
|  | =head1 CONFIGURATION | ||
|  | 
 | ||
|  | No configuration. | ||
|  | 
 | ||
|  | =head1 MAGIC MARKERS | ||
|  | 
 | ||
|  |   #%# family=auto | ||
|  |   #%# capabilities=autoconf | ||
|  | 
 | ||
|  | =head1 VERSION | ||
|  | 
 | ||
|  | Revision 0.1 2008/08/23 13:06:00 joti | ||
|  | 
 | ||
|  |   First version only chronyc tracking, autodetection included. | ||
|  | 
 | ||
|  | Revision 0.2 2008/10/11 16:09:00 joti | ||
|  | 
 | ||
|  |   Added scaling of other values to match with frequency, added more description to fields | ||
|  | 
 | ||
|  | Revision 0.3 2014/02/16 zjttoefs | ||
|  | 
 | ||
|  |   reduce forking by using awk | ||
|  |   do not limit output precision | ||
|  |   add stratum monitoring | ||
|  |   detect slow/fast time or freqency and adjust sign of value accordingly | ||
|  |   remove commented out code | ||
|  | 
 | ||
|  | Revision 0.4 2016/11/10 Lars Kruse | ||
|  | 
 | ||
|  |   rewrite field handling | ||
|  |   use "which" for "chronyc" location | ||
|  |   switch from "bash" to "sh" | ||
|  |   fix exit code of failing "autoconf" | ||
|  | 
 | ||
|  | =head1 AUTHOR | ||
|  | 
 | ||
|  |   joti | ||
|  |   zjttoefs | ||
|  |   Lars Kruse <devel@sumpfralle.de> | ||
|  | 
 | ||
|  | =cut | ||
|  | 
 | ||
|  | CHRONYC="$(which chronyc | head -1)" | ||
|  | 
 | ||
|  | # Frequency has extremely higher values than other. Therefore they are fitted by scaling via suitable factors. | ||
|  | # field definitions: | ||
|  | #   - munin fieldname | ||
|  | #   - factor for graph visualization (all values are supposed to reach a similar dimension) | ||
|  | #   - regular expression of the chrony output line (may not contain whitespace, case insensitive) | ||
|  | #   - label (may include "%d" for including the factor; may contain whitespace) | ||
|  | fields="frequency	1	^Frequency		Local Clock Frequency Drift (ppm) | ||
|  | 	residualfreq	1	^Residual.freq		Residual Freq (ppm) | ||
|  | 	skew		1	^Skew			Skew (ppm)" | ||
|  | 
 | ||
|  | # chrony example output (v2.4.1): | ||
|  | #   Reference ID    : 131.188.3.221 (ntp1.rrze.uni-erlangen.de) | ||
|  | #   Stratum         : 2 | ||
|  | #   Ref time (UTC)  : Thu Nov 10 22:39:50 2016 | ||
|  | #   System time     : 0.000503798 seconds slow of NTP time | ||
|  | #   Last offset     : +0.000254355 seconds | ||
|  | #   RMS offset      : 0.002186779 seconds | ||
|  | #   Frequency       : 17.716 ppm slow | ||
|  | #   Residual freq   : +0.066 ppm | ||
|  | #   Skew            : 4.035 ppm | ||
|  | #   Root delay      : 0.042980 seconds | ||
|  | #   Root dispersion : 0.005391 seconds | ||
|  | #   Update interval : 258.4 seconds | ||
|  | #   Leap status     : Normal | ||
|  | 
 | ||
|  | 
 | ||
|  | if [ "$1" = "autoconf" ]; then | ||
|  | 	if [ -n "$CHRONYC" ] && [ -x "$CHRONYC" ]; then | ||
|  | 		echo yes | ||
|  | 	else | ||
|  | 		echo "no (missing 'chronyc' executable)" | ||
|  | 	fi | ||
|  | 	exit 0 | ||
|  | fi | ||
|  | 
 | ||
|  | if [ "$1" = "config" ]; then | ||
|  | 	echo 'graph_title Chrony Tracking Stats - Frequencies stability' | ||
|  | 	echo 'graph_args --base 1000 -l 0' | ||
|  | 	echo 'graph_vlabel (ppm)' | ||
|  | 	echo 'graph_category time' | ||
|  | 	echo 'graph_scale no' | ||
|  | 	echo "$fields" | while read fieldname factor regex label; do | ||
|  | 		# insert the factor, if "%d" is part of the label | ||
|  | 		printf "${fieldname}.label $label\n" "$factor" | ||
|  | 		echo "${fieldname}.type GAUGE" | ||
|  | 	done | ||
|  | 	exit 0 | ||
|  | fi | ||
|  | 
 | ||
|  | chrony_status="$("$CHRONYC" tracking)" | ||
|  | echo "$fields" | while read fieldname factor regex label; do | ||
|  | 	status_line="$(echo "$chrony_status" | grep -i -- "$regex " | cut -d ":" -f 2-)" | ||
|  | 	if [ -z "$status_line" ]; then | ||
|  | 		value="U" | ||
|  | 	else | ||
|  | 		# the keyword "slow" indicates negative values | ||
|  | 		value="$(echo "$status_line" | awk '{ /slow/ ? SIGN=-1 : SIGN=1; print $1 * SIGN * '"$factor"' }')" | ||
|  | 	fi | ||
|  | 	echo "${fieldname}.value $value" | ||
|  | done |