base-files: remove rdate integration, add busybox ntpd init script and server list in /etc/config/system 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
This commit is contained in:
Jo-Philipp Wich 2011-10-27 00:21:53 +00:00
parent 803c7edcb3
commit 272d95f0f1
5 changed files with 41 additions and 81 deletions

View 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

View 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

View File

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

View File

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

View File

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