From da55c9639aaae4c1997f40b223877c4c9321b82f Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Mon, 17 May 2010 19:54:35 +0000 Subject: [PATCH] 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 --- package/base-files/Makefile | 2 +- package/base-files/files/etc/config/system | 8 +- .../base-files/files/etc/config/timeserver | 24 +++++ .../files/etc/hotplug.d/iface/40-rdate | 87 +++++++++++-------- 4 files changed, 78 insertions(+), 43 deletions(-) create mode 100644 package/base-files/files/etc/config/timeserver diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 2c9b387e53..1a92a59d9d 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 3f121bd4d3..30055eaf31 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 0000000000..d8db08857e --- /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 cf56c02ac5..c5abaf011e 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 -- 2.30.2