#! /bin/sh
#
# System-V init script for the NTP daemon
#

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="network time protocol daemon"
NAME=ntpd
DAEMON=/usr/sbin/$NAME
NTPDATE_BIN=/usr/bin/ntpdate
GPS_SOURCE=/dev/gps0

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

# Read config file if it is present.
if [ -r /etc/default/$NAME ]
then
	. /etc/default/$NAME
fi

NTPDATE_PROBLEM_FILE=/var/local/telem/errors/ntpdate

GPSENABLED=no
PORT=CNone

[ -e /etc/telem-gps.conf ] && . /etc/telem-gps.conf

start() {

    stop

    logger -s -p "user.info" -t "$0" "Starting NTP service"
    
    if [ "$NTPDATE" = "yes" ]; then
        if [ -x $NTPDATE_BIN ] ; then
            [ ! -e /var/local/telem/stats/device-is-booted ] && NTPDATE_OPTS="$NTPDATE_OPTS -b"
            [ -e $NTPDATE_PROBLEM_FILE ] && NTPDATE_OPTS="$NTPDATE_OPTS -b"
            
            if [ ! -z "$NTPSERVERS" ]; then
                logger -s -p "user.info" -t "$0" "Getting initial time via NTP"
                $NTPDATE_BIN $NTPDATE_OPTS -s $NTPSERVERS > /dev/null 2>&1
                if [ $? = 0 ]; then
                    hwclock -w -u
                    ! rm -f $NTPDATE_PROBLEM_FILE
                else
                    # ntpdate failed use gpsdate
                    if [ "x$GPSENABLED" = "xno" ]; then
                        touch $NTPDATE_PROBLEM_FILE
                    fi
                    doGpsDate=1
                fi
            fi
            
            echo "."
        fi
    else
        doGpsDate=1
    fi
    
    if [ $doGpsDate ] && [ "x$GPSENABLED" = "xyes" ] && [ "x$PORT" = "xC1" ]; then
        logger -s -p "user.info" -t "$0" "Getting initial time via GPS"
        getgpsdate $GPS_SOURCE
    fi

    if [ "$NTPD" = "yes" ]; then
        logger -s -p "user.info" -t "$0" "Starting $DESC: $NAME"
        /usr/local/bin/ntp/StartNTP &> /dev/null &
        echo "."
    fi
}

stop() {
    logger "Killing NTP service"
    busybox killall -9 StartNTP
    busybox killall -9 ntpd
    busybox killall -9 ntpdate
    killall check_gps_status
}

restart() {
	safeRestart
}

ntp_reset_lockFile="/tmp/ntpd_reset_lock"
safeRestart() {
	# restart only if there are servers
	if [ -n "$NTPSERVERS" ]; then
		if [ ! -e "$ntp_reset_lockFile" ]; then
			touch "$ntp_reset_lockFile"
			(
				# restart after 6 seconds, because there may be many request in short time from multiple processes.
				while [ "$(find "$ntp_reset_lockFile" -mmin -0.1 -mmin +0 2>/dev/null)" == "$ntp_reset_lockFile" ]; do
					sleep 2
				done
				start # stop is inside start
				rm "$ntp_reset_lockFile"
			) &
		else
			# just update time to postpone restart
			touch "$ntp_reset_lockFile"
		fi
	fi
}

forceRestart() {
	start # stop is inside start
}

case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	restart|reload)
		restart
		;;
	force-restart)
		forceRestart
		;;
	safe-restart)
		safeRestart
		;;
	*)
		echo $"Usage: $0 {start|stop|restart|force-restart|safe-restart}"
		exit 1
esac

exit $?
