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:
parent
803c7edcb3
commit
272d95f0f1
5 changed files with 41 additions and 81 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
35
package/base-files/files/etc/init.d/sysntpd
Executable file
35
package/base-files/files/etc/init.d/sysntpd
Executable 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
|
||||
}
|
Loading…
Reference in a new issue