[packages] ntpclient: add option to bind ntpclient to a specific interface (#6470)
[openwrt/svn-archive/archive.git] / net / ntpclient / files / ntpclient.hotplug
index 2abb0361fc7071b6f5d316f01d67e33df86641a5..c932688c9a951233d36ea6d6c6c75aaec3d168f4 100644 (file)
@@ -3,32 +3,76 @@
 
 . /etc/functions.sh
 
-DONE=0
-config_cb() {
-       local cfg="$CONFIG_SECTION"
-       local cfgtype
-       config_get cfgtype "$cfg" TYPE
-
-       case "$cfgtype" in
-               ntpclient)
-                       config_get hostname     $cfg hostname
-                       config_get port         $cfg port
-                       config_get count        $cfg count
-
-                       [ "$DONE" = "1" ] && exit 0
-                       ps | grep 'bin/[n]tpclient' >&- || {
-                               route -n 2>&- | grep '^0.0.0.0' >&- && {
-                                       /usr/sbin/ntpclient -c ${count:-1} -s -h $hostname -p ${port:-123} 2>&- >&- && DONE=1
-                               }
-                       }
-               ;;
-       esac
+unset SERVER
+unset PORT
+unset INTERVAL
+unset COUNT
+unset INTERFACE_GLOBAL
+
+NTPC=`which ntpclient`
+
+check_server() {
+       local hostname
+       local port
+       local interface
+       [ -n "$SERVER" ] && return
+       config_get hostname $1 hostname
+       config_get port $1 port
+       config_get interface $1 interface
+
+       [ -z "$interface" ] && interface=$INTERFACE_GLOBAL
+
+       [ -n "$interface" ] && {
+               # $INTERFACE is passed from hotplug event
+               [ "$interface" = "$INTERFACE" ] || return
+       }
+
+       [ -z "$hostname" ] && return
+       $NTPC -c 1 -p ${port:-123} -i 2 -h $hostname > /dev/null && { SERVER=$hostname; PORT=${port:-123}; }
+}
+
+set_drift() {
+       config_get freq $1 freq
+       [ -n "$freq" ] && adjtimex -f $freq >/dev/null
+}
+
+start_ntpclient() {
+       config_foreach set_drift ntpdrift
+       config_foreach check_server ntpserver
+       [ -z "$SERVER" ] && exit 0
+       logger starting ntpclient
+       $NTPC ${COUNT:+-c $COUNT} ${INTERVAL:+-i $INTERVAL} -s -l -D -p $PORT -h $SERVER 2> /dev/null
+}
+
+stop_ntpclient() {
+       logger stopping ntpclient
+       killall ntpclient
+}
+
+load_settings() {
+       local interval
+       local count
+       local iface
+       
+       config_get interval $1 interval
+       config_get count $1 count
+       config_get interface $1 interface
+       
+       [ -n "$count" ] && COUNT=$count
+       [ -n "$interval" ] && INTERVAL=$interval
+       [ -n "$interface" ] && INTERFACE_GLOBAL=$interface
 }
+
+config_load ntpclient
+config_foreach load_settings ntpclient
+
+NTP_RUNNING=`ps  | grep $NTPC | grep -v grep`
+
 case "${ACTION:-ifup}" in
        ifup)
-               config_load ntpclient&
+               [ -z "$NTP_RUNNING" ] && start_ntpclient 
        ;;
        ifdown)
-               route -n 2>&- | grep '^0.0.0.0' >&- || killall ntpclient 2>&- >&-
+               [ -n "$NTP_RUNNING" ] && stop_ntpclient 
        ;;
 esac