base-files (#7316) - improve rdate reliability - make rdate config more ntp like...
authorJo-Philipp Wich <jow@openwrt.org>
Mon, 17 May 2010 19:54:35 +0000 (19:54 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Mon, 17 May 2010 19:54:35 +0000 (19:54 +0000)
SVN-Revision: 21495

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

index 2c9b387e53a11e6304de6a336fe691dbb6daee00..1a92a59d9d5b0f17db139a73d6b2864412fc8537 100644 (file)
@@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
 include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=43
+PKG_RELEASE:=44
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 
index 3f121bd4d3671efe1ab13a8f6487bb06afbf11d9..30055eaf31bd3e1414b241a9ca42fb8a9553df52 100644 (file)
@@ -3,10 +3,4 @@ config system
        option timezone UTC
 
 config rdate
-       list server ac-ntp0.net.cmu.edu
-       list server ptbtime1.ptb.de
-       list server ac-ntp1.net.cmu.edu
-       list server ntp.xs4all.nl
-       list server ptbtime2.ptb.de
-       list server cudns.cit.cornell.edu
-       list server ptbtime3.ptb.de
+       option interface        wan
diff --git a/package/base-files/files/etc/config/timeserver b/package/base-files/files/etc/config/timeserver
new file mode 100644 (file)
index 0000000..d8db088
--- /dev/null
@@ -0,0 +1,24 @@
+config timeserver
+       option hostname ac-ntp0.net.cmu.edu
+#      option interface        wan
+
+config timeserver
+       option hostname ptbtime1.ptb.de
+
+config timeserver
+       option hostname ac-ntp1.net.cmu.edu
+
+config timeserver
+       option hostname tick.greyware.com
+
+config timeserver
+       option hostname ntp.xs4all.nl
+
+config timeserver
+       option hostname ptbtime2.ptb.de
+
+config timeserver
+       option hostname cudns.cit.cornell.edu
+
+config timeserver
+       option hostname ptbtime3.ptb.de
index cf56c02ac53547cbeb9fb724d28ae9d13ddaaec7..c5abaf011e205e86f464f89866f18211640dcd46 100644 (file)
@@ -1,46 +1,63 @@
-uci_get_one()
+IFACE_GLOBAL=$(uci_get "system.@rdate[0].interface")
+SERVERS=
+MAX=0
+SYNCED=
+
+do_rdate()
 {
-       for var in "$@"; do
-               uci -P /var/state get "$var" 2>/dev/null && break
-       done
+       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"
+       }
 }
 
-rand()
+add_server()
 {
-       random=$(awk 'BEGIN { srand(); print int(rand() * 10 + 1); }')
+       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_rdate()
+sync_time()
 {
-       local servers=$(uci_get_one "network.$INTERFACE.lease_timesrv" \
-               "system.@rdate[0].server")
-
-       if [ -n "$servers" ]; then
-               match=0
-               tries=3
-               rand
-
-               while [ $match = 0 ] && [ $tries != 0 ]; do
-                       for server in $servers; do
-                               if [ $((--random)) = 0 ]; then
-                                       rdate -s $server >/dev/null 2>/dev/null && {
-                                               logger -t rdate "Synced with $server"
-                                               match=1
-                                       } || {
-                                               logger -t rdate "Failed to sync with $server"
-                                               let tries="$tries - 1"
-                                               rand
-                                       }
-
-                                       break
-                               fi
-                       done
+       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
-       else
-               logger -t rdate "No usable time server found"
-       fi
+               SERVERS="${servers}"; : $((MAX--))
+       done
+
+       [ -z "$SYNCED" ] && logger -t rdate "No usable time server for $INTERFACE found"
 }
 
-case "$ACTION" in
-       ifup) route -n | grep -q ^0.0.0.0 && sync_rdate;;
+case "${ACTION:-ifup}" in
+       ifup)
+               sync_time
+       ;;
 esac