#!/bin/sh # Please make sure the paths below are correct. # shellcheck disable=SC2016 # AWK program strings — $BIN_AWK indirection hides awk from shellcheck # Alternatively you can put them in $0.conf, meaning if you've named # this script ntp-client.sh then it must go in ntp-client.sh.conf . # # NTPQV output version of "ntpq -c rv" # p1 DD-WRT and some other outdated linux distros # p11 FreeBSD 11 and any linux distro that is up to date # # If you are unsure, which to set, run this script and make sure that # the JSON output variables match that in "ntpq -c rv". # BIN_NTPD='/usr/bin/env ntpd' BIN_NTPQ='/usr/bin/env ntpq' BIN_NTPDC='/usr/bin/env ntpdc' BIN_GREP='/usr/bin/env grep' BIN_TR='/usr/bin/env tr' BIN_CUT='/usr/bin/env cut' BIN_SED="/usr/bin/env sed" BIN_AWK='/usr/bin/env awk' NTPQV="p11" ################################################################ # Don't change anything unless you know what are you doing # ################################################################ CONFIG="$0.conf" if [ -f "$CONFIG" ]; then . "$CONFIG" fi VERSION=1 STRATUM=$("$BIN_NTPQ" -c rv | "$BIN_GREP" -Eow "stratum=[0-9]+" | "$BIN_CUT" -d "=" -f 2) # parse the ntpq info that requires version specific info NTPQ_RAW=$("$BIN_NTPQ" -c rv | "$BIN_GREP" jitter | "$BIN_SED" 's/[[:alpha:]=,_]/ /g') if [ "$NTPQV" = "p11" ]; then OFFSET=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $3}') FREQUENCY=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $4}') SYS_JITTER=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $5}') CLK_JITTER=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $6}') CLK_WANDER=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $7}') fi if [ "$NTPQV" = "p1" ]; then OFFSET=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $2}') FREQUENCY=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $3}') SYS_JITTER=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $4}') CLK_JITTER=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $5}') CLK_WANDER=$(echo "$NTPQ_RAW" | "$BIN_AWK" -F ' ' '{print $6}') fi VER=$("$BIN_NTPD" --version) if [ "$VER" = '4.2.6p5' ]; then USECMD="$BIN_NTPDC -c iostats" else USECMD="$BIN_NTPQ -c iostats localhost" fi CMD2=$($USECMD | "$BIN_TR" -d ' ' | "$BIN_CUT" -d : -f 2 | "$BIN_TR" '\n' ' ') TIMESINCERESET=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $1}') RECEIVEDBUFFERS=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $2}') FREERECEIVEBUFFERS=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $3}') USEDRECEIVEBUFFERS=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $4}') LOWWATERREFILLS=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $5}') DROPPEDPACKETS=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $6}') IGNOREDPACKETS=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $7}') RECEIVEDPACKETS=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $8}') PACKETSSENT=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $9}') PACKETSENDFAILURES=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $10}') INPUTWAKEUPS=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $11}') USEFULINPUTWAKEUPS=$(echo "$CMD2" | "$BIN_AWK" -F ' ' '{print $12}') echo '{"data":{"offset":"'"$OFFSET"\ '","frequency":"'"$FREQUENCY"\ '","sys_jitter":"'"$SYS_JITTER"\ '","clk_jitter":"'"$CLK_JITTER"\ '","clk_wander":"'"$CLK_WANDER"\ '","stratum":"'"$STRATUM"\ '","time_since_reset":"'"$TIMESINCERESET"\ '","receive_buffers":"'"$RECEIVEDBUFFERS"\ '","free_receive_buffers":"'"$FREERECEIVEBUFFERS"\ '","used_receive_buffers":"'"$USEDRECEIVEBUFFERS"\ '","low_water_refills":"'"$LOWWATERREFILLS"\ '","dropped_packets":"'"$DROPPEDPACKETS"\ '","ignored_packets":"'"$IGNOREDPACKETS"\ '","received_packets":"'"$RECEIVEDPACKETS"\ '","packets_sent":"'"$PACKETSSENT"\ '","packet_send_failures":"'"$PACKETSENDFAILURES"\ '","input_wakeups":"'"$INPUTWAKEUPS"\ '","useful_input_wakeups":"'"$USEFULINPUTWAKEUPS"\ '"},"error":"0","errorString":"","version":"'"$VERSION"'"}'