summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--package/base-files/Makefile2
-rw-r--r--package/base-files/files/etc/config/system8
-rw-r--r--package/base-files/files/etc/config/timeserver24
-rw-r--r--package/base-files/files/etc/hotplug.d/iface/40-rdate87
4 files changed, 78 insertions, 43 deletions
diff --git a/package/base-files/Makefile b/package/base-files/Makefile
index 2c9b387..1a92a59 100644
--- a/package/base-files/Makefile
+++ b/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/
diff --git a/package/base-files/files/etc/config/system b/package/base-files/files/etc/config/system
index 3f121bd..30055ea 100644
--- a/package/base-files/files/etc/config/system
+++ b/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
diff --git a/package/base-files/files/etc/config/timeserver b/package/base-files/files/etc/config/timeserver
new file mode 100644
index 0000000..d8db088
--- /dev/null
+++ b/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
diff --git a/package/base-files/files/etc/hotplug.d/iface/40-rdate b/package/base-files/files/etc/hotplug.d/iface/40-rdate
index cf56c02..c5abaf0 100644
--- a/package/base-files/files/etc/hotplug.d/iface/40-rdate
+++ b/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