mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 15:32:33 +00:00
a49503bbc7
ntpd from Busybox supports peer-less (standalone) mode when it's started
with option -l and without any peer provided with option -p. In this
mode ntpd uses local time as reference and acts as stratum 1 server.
This mode can be used in isolated networks, where Internet access and/or
other NTP server/s are not available, but the device has some other way
of getting correct time, like e.g. GPS (ugps supports setting local time
by default).
Support for this mode was incorrectly disabled/removed in:
1527f96ca6
Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
Acked-by: Jo-Philipp Wich <jo@mein.io>
87 lines
2.1 KiB
Bash
Executable File
87 lines
2.1 KiB
Bash
Executable File
#!/bin/sh /etc/rc.common
|
|
# Copyright (C) 2011 OpenWrt.org
|
|
|
|
START=98
|
|
|
|
USE_PROCD=1
|
|
PROG=/usr/sbin/ntpd
|
|
HOTPLUG_SCRIPT=/usr/sbin/ntpd-hotplug
|
|
|
|
get_dhcp_ntp_servers() {
|
|
local interfaces="$1"
|
|
local filter="*"
|
|
local interface ntpservers ntpserver
|
|
|
|
for interface in $interfaces; do
|
|
[ "$filter" = "*" ] && filter="@.interface='$interface'" || filter="$filter,@.interface='$interface'"
|
|
done
|
|
|
|
ntpservers=$(ubus call network.interface dump | jsonfilter -e "@.interface[$filter]['data']['ntpserver']")
|
|
|
|
for ntpserver in $ntpservers; do
|
|
local duplicate=0
|
|
local entry
|
|
for entry in $server; do
|
|
[ "$ntpserver" = "$entry" ] && duplicate=1
|
|
done
|
|
[ "$duplicate" = 0 ] && server="$server $ntpserver"
|
|
done
|
|
}
|
|
|
|
validate_ntp_section() {
|
|
uci_validate_section system timeserver "${1}" \
|
|
'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0' 'use_dhcp:bool:1' 'dhcp_interface:list(string)'
|
|
}
|
|
|
|
start_service() {
|
|
local server enabled enable_server use_dhcp dhcp_interface peer
|
|
|
|
validate_ntp_section ntp || {
|
|
echo "validation failed"
|
|
return 1
|
|
}
|
|
|
|
[ $enabled = 0 ] && return
|
|
|
|
[ $use_dhcp = 1 ] && get_dhcp_ntp_servers "$dhcp_interface"
|
|
|
|
[ -z "$server" -a "$enable_server" = "0" ] && return
|
|
|
|
procd_open_instance
|
|
procd_set_param command "$PROG" -n -N
|
|
[ "$enable_server" = "1" ] && procd_append_param command -l
|
|
[ -x "$HOTPLUG_SCRIPT" ] && procd_append_param command -S "$HOTPLUG_SCRIPT"
|
|
for peer in $server; do
|
|
procd_append_param command -p $peer
|
|
done
|
|
procd_set_param respawn
|
|
procd_close_instance
|
|
}
|
|
|
|
service_triggers() {
|
|
local script name use_dhcp
|
|
|
|
script=$(readlink -f "$initscript")
|
|
name=$(basename ${script:-$initscript})
|
|
|
|
procd_add_config_trigger "config.change" "system" /etc/init.d/$name reload
|
|
|
|
config_load system
|
|
config_get use_dhcp ntp use_dhcp 1
|
|
|
|
[ $use_dhcp = 1 ] && {
|
|
local dhcp_interface
|
|
config_get dhcp_interface ntp dhcp_interface
|
|
|
|
if [ -n "$dhcp_interface" ]; then
|
|
for n in $dhcp_interface; do
|
|
procd_add_interface_trigger "interface.*" $n /etc/init.d/$name reload
|
|
done
|
|
else
|
|
procd_add_raw_trigger "interface.*" 1000 /etc/init.d/$name reload
|
|
fi
|
|
}
|
|
|
|
procd_add_validation validate_ntp_section
|
|
}
|