#!/bin/sh cd /var/log/ntpstats || exit 1 update=0 if [[ "$1" == "-u" ]] then shift if [[ -w /var/lib/ntp ]] then update=1 else echo "Error: Can not update /var/lib/ntp" 1>&2 fi fi old_good=`cat /var/lib/ntp/ntp.drift.good` old_good2=`echo "$old_good" | sed 's/\.//'` data_raw=$( cat loopstats.200[0-9][0-1][0-9][0-9][0-9] | head -100; \ (cat loopstats.200[0-9][0-1][0-9][0-9][0-9]; \ zcat loopstats.200[0-9][0-9][0-9][0-9][0-9].gz) | head -1000 ) #echo "$data_raw" data=$( echo "$data_raw" | grep " 0\.00[0-9]* \(1[0-2]\|[0-9]\)\.[0-9][0-9]* 1[0-9]$" \ | cut -d' ' -f 4 \ | sort -n \ | sed "s/^\(-*[0-9][0-9]*\.[0-9][0-9][0-9]\)[0-9]*$/\1/" ) tot_lines=$(( $( echo "$data_raw" | wc -l) + 0)) lines=$((`echo "$data" | wc -l` + 0)) if [[ $lines -lt 1 ]] then echo "lines: $lines/$tot_lines old good: $old_good" exit 0 fi mid=$(( (lines + 1) / 2 )) min=`echo "$data" | sed -n "1p"` min2=`echo "$min" | sed 's/\.//'` median=`echo "$data" | sed -n "${mid}p"` median2=`echo "$median" | sed 's/\.//'` max=`echo "$data" | sed -n "${lines}p"` max2=`echo "$max" | sed 's/\.//'` diff=$(( old_good2 - median2 )) if [[ $diff -lt 0 ]] then diff=$(( -diff )) fi spread=$(( (max2 - min2) / lines )) if [[ $update -eq 1 ]] then # see if we have enough valid data to consider updating ntp.drift.good if [[ $lines -ge 50 \ && $spread -lt 50 \ && $diff -gt 100 \ && $diff -lt 10000 ]] then echo "[`date '+%D %T'`] Updating /var/lib/ntp/ntp.drift.good to $median" echo "[`date '+%D %T'`] lines: $lines/$tot_lines new good: $min/$median/$max ($spread) old good: $old_good" mv /var/lib/ntp/ntp.drift.good.2 /var/lib/ntp/ntp.drift.good.3 mv /var/lib/ntp/ntp.drift.good.1 /var/lib/ntp/ntp.drift.good.2 mv /var/lib/ntp/ntp.drift.good.0 /var/lib/ntp/ntp.drift.good.1 mv /var/lib/ntp/ntp.drift.good /var/lib/ntp/ntp.drift.good.0 echo $median >/var/lib/ntp/ntp.drift.good chmod +r /var/lib/ntp/ntp.drift.good fi else echo "lines: $lines/$tot_lines new good: $min/$median/$max ($spread) old good: $old_good" fi