#!/bin/sh
# check/log NTP status

[ -e '/var/local/telem/gps_is_enabled' ] || \
grep -- '^\s*server' '/etc/ntp.conf' | grep -vq -- 'server *127.127.1.0' || \
exit

logf='/var/local/telem/log/ntpvar.log'
logf1='/var/local/telem/log/ntpvar.1.log'
logGPSf='/var/local/telem/log/gps.log'
logGPSf1='/var/local/telem/log/gps.1.log'

ntp_invalid='/tmp/telem/ntp_invalid'
#ntp_invalid='/var/local/telem/errors/ntp_invalid'
gps_invalid='/var/local/telem/errors/gps_invalid'

check_gps=':'
init_gps=':'
if [ -e '/var/local/telem/gps_is_enabled' ]; then
    check_gps='check_gps'
    init_gps='init_gps'
fi

logFlag='any'
log() {
    if [ "${logFlag}" != "$*" ]; then
        logFlag="$*"
        echo "$(date -Iseconds) - ${state} ${1}" >> "${logf}"
        # simple log rotate
        if [ -n "$(find "${logf}" -size +300k 2> /dev/null)" ]; then
            mv "${logf}" "${logf1}"
            echo "$(date -Iseconds) - rotate" >> "${logf}"
        fi
    fi
}
logFlagGPS='any'
logGPS() {
    # to keep log file same as in old check_gps_status
    if [ "${logFlagGPS}" != "$*" ]; then
        logFlagGPS="$*"
        echo "$(date) - ${1}" >> "${logGPSf}"
        # simple log rotate
        if [ -n "$(find "${logGPSf}" -size +300k 2> /dev/null)" ]; then
            mv "${logGPSf}" "${logGPSf1}"
            echo "$(date) - rotate" >> "${logGPSf}"
        fi
    fi
}

check_ntp() {
    state="$(ntpq -c "readvar 0 stratum,offset,refid" 2>&1)"
    if echo "${state}" | grep -q -- 'refid=\(INIT\|LOCAL\)\|stratum=16'; then
        # Only system clock or not syncing
        touch "${ntp_invalid}"
        log '(not syncing)'
    elif echo "${state}" | grep -q -- 'refid='; then
        # Syncing
        # extract absolute offset (minus removed)
        offset="$(echo "${state}" | grep -o -- 'offset=[0-9.-]*' | grep -o -- '[0-9.]*')"
        refid="$(echo "${state}" | grep -o -- 'refid=GPS')"
        # check that offset is small enough
        if [ "${offset%%.*}" -lt 3000 ]; then
            rm  "${ntp_invalid}" 2> /dev/null
            log '(sync)' "${refid}"
        else
            touch "${ntp_invalid}"
            log '(syncing)' "${refid}"
        fi
    else
        # Error or other message
        log
    fi
}

check_gps() {
    # from old check_gps_status
    if ntpq -pn  2>&1 | grep -Fq -- 'o127.127.20.0'; then
        # gps ok
        rm "${gps_invalid}" 2>/dev/null 
        logGPS 'GPS OK (PPS)'
    else
        # gps invalid
        touch "${gps_invalid}"
        logGPS 'GPS Invalid (PPS)'
    fi
}

init_ntp() {
    rm    /tmp/telem/ntp_ok 2> /dev/null
    touch "${ntp_invalid}"
    echo "$(date -Iseconds) - start" >> "${logf}"
}

init_gps() {
    touch "${gps_invalid}"
    echo "$(date) - start" >> "${logGPSf}"
}

init_ntp
"$init_gps"

sleep 3
while :; do   
    check_ntp
    "$check_gps"
    sleep 20
done
