Browse Source

base-files (#7316) - improve rdate reliability - make rdate config more ntp like - move time server list to /etc/config/timeserver - bump package revision

SVN-Revision: 21495
Jo-Philipp Wich 16 years ago
parent
commit
da55c9639a

+ 1 - 1
package/base-files/Makefile

@@ -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/
 

+ 1 - 7
package/base-files/files/etc/config/system

@@ -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

+ 24 - 0
package/base-files/files/etc/config/timeserver

@@ -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

+ 52 - 35
package/base-files/files/etc/hotplug.d/iface/40-rdate

@@ -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