[package] base-files: remove rdate integration, add busybox ntpd init script and...
authorJo-Philipp Wich <jow@openwrt.org>
Thu, 27 Oct 2011 00:21:53 +0000 (00:21 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 27 Oct 2011 00:21:53 +0000 (00:21 +0000)
The rdate applet proved to be too unreliable to obtain the current time on boot:
- public time servers are rare and often unreachable or overloaded
- rdate does not daemonize, it needs a network connection the moment it is started, leading to race conditions
- the /etc/config/timeserver configuration is overly complex and there is no reliable way to disable rdate invocations
- the time protocol as specified in RFC 868 is considered obsolete
This commit adds an init script /etc/init.d/sysntpd which starts and stops the busybox ntpd accordingly.
The builtin ntpd can be disabled by either disabling the init script, removing the symlink to busybox or
by clearing the timeserver list in /etc/config/system.

SVN-Revision: 28612

package/base-files/Makefile
package/base-files/files/etc/config/system
package/base-files/files/etc/config/timeserver [deleted file]
package/base-files/files/etc/hotplug.d/iface/40-rdate [deleted file]
package/base-files/files/etc/init.d/sysntpd [new file with mode: 0755]

index b19f694a09fbaa4de94daba2078fa65f652aa6f3..002d51674de27a4e1602f2045102d8acc6261b13 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=82
+PKG_RELEASE:=83
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 PKG_BUILD_DEPENDS:=opkg/host
index 30055eaf31bd3e1414b241a9ca42fb8a9553df52..ad51db5bd8c74e0465c60b4e54e98f3980760a0a 100644 (file)
@@ -2,5 +2,8 @@ config system
        option hostname OpenWrt
        option timezone UTC
 
-config rdate
-       option interface        wan
+config timeserver
+       list server     0.openwrt.pool.ntp.org
+       list server     1.openwrt.pool.ntp.org
+       list server     2.openwrt.pool.ntp.org
+       list server     3.openwrt.pool.ntp.org
diff --git a/package/base-files/files/etc/config/timeserver b/package/base-files/files/etc/config/timeserver
deleted file mode 100644 (file)
index 294631e..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-config timeserver
-       option hostname ptbtime1.ptb.de
-#      option interface        wan
-
-config timeserver
-       option hostname time-a.nist.gov
-
-config timeserver
-       option hostname ntp.xs4all.nl
-
-config timeserver
-       option hostname ptbtime2.ptb.de
-
-config timeserver
-       option hostname time-b.nist.gov
diff --git a/package/base-files/files/etc/hotplug.d/iface/40-rdate b/package/base-files/files/etc/hotplug.d/iface/40-rdate
deleted file mode 100644 (file)
index c5abaf0..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-IFACE_GLOBAL=$(uci_get "system.@rdate[0].interface")
-SERVERS=
-MAX=0
-SYNCED=
-
-do_rdate()
-{
-       local server="$1"
-
-       rdate -s "$server" >/dev/null 2>/dev/null && {
-               logger -t rdate "Synced with $server"
-               SYNCED="$server"
-       } || {
-               logger -t rdate "Failed to sync with $server"
-       }
-}
-
-add_server()
-{
-       local section="$1"
-
-       local server
-       config_get server "$section" hostname
-       [ -z "$server" ] && return
-
-       local iface
-       config_get iface "$section" interface
-       [ -z "$iface" ] && iface=$IFACE_GLOBAL
-       [ -n "$iface" ] && {
-               [ "$iface" = "$INTERFACE" ] || return
-       }
-
-       SERVERS="${SERVERS} $server"; : $((MAX++))
-}
-
-sync_time()
-{
-       local server
-       server=$(uci_get_state "network.$INTERFACE.lease_timesrv")
-       [ -n "$server" ] && do_rdate "$server"
-       [ -n "$SYNCED" ] && return
-
-       config_load timeserver
-       config_foreach add_server timeserver
-
-       local servers
-       while [ $MAX -gt 0 ] && [ -z "$SYNCED" ]; do
-               unset servers; random=$(awk "BEGIN { srand(); print int(rand() * $MAX + 1); }")
-               for server in $SERVERS; do
-                       [ $((--random)) -eq 0 ] && { do_rdate "$server"; continue; }
-                       servers="${servers} $server"
-               done
-               SERVERS="${servers}"; : $((MAX--))
-       done
-
-       [ -z "$SYNCED" ] && logger -t rdate "No usable time server for $INTERFACE found"
-}
-
-case "${ACTION:-ifup}" in
-       ifup)
-               sync_time
-       ;;
-esac
diff --git a/package/base-files/files/etc/init.d/sysntpd b/package/base-files/files/etc/init.d/sysntpd
new file mode 100755 (executable)
index 0000000..fefb48f
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2011 OpenWrt.org
+
+START=98
+
+BIN=/usr/sbin/ntpd
+PID=/var/run/sysntpd.pid
+
+start() {
+       [ -x $BIN ] || exit 0
+
+       local peers
+
+       getpeers() {
+               config_get peers "$1" server
+       }
+
+       config_load system
+       config_foreach getpeers timeserver
+
+       if [ -n "$peers" ]; then
+               local peer
+               local args="-n"
+               for peer in $peers; do
+                       append args "-p $peer"
+               done
+
+               start-stop-daemon -x $BIN -m -p $PID -b -S -- $args
+       fi
+}
+
+stop() {
+       service_kill ${BIN##*/} $PID
+       rm -f $PID
+}