88114f617a
sysntpd server becomes unavailable if the index of the bound interface changes. So let's add an interface trigger to reload sysntpd. This patch also adds the ability for the sysntpd script to handle uci interface name from configuration. Fixes: 4da60500ebd2 ("busybox: sysntpd: option to bind server to iface") Signed-off-by: Alexey Dobrovolsky <dobrovolskiy.alexey@gmail.com> Reviewed-by: Philip Prindeville <philipp@redfish-solutions.com>
131 lines
3.2 KiB
Bash
Executable File
131 lines
3.2 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_load_validate system timeserver "$1" "$2" \
|
|
'dhcp_interface:list(string)' \
|
|
'enable_server:bool:0' \
|
|
'enabled:bool:1' \
|
|
'interface:string' \
|
|
'server:list(host)' \
|
|
'use_dhcp:bool:1'
|
|
}
|
|
|
|
start_ntpd_instance() {
|
|
local peer
|
|
|
|
[ "$2" = 0 ] || {
|
|
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
|
|
if [ "$enable_server" = "1" ]; then
|
|
procd_append_param command -l
|
|
[ -n "$interface" ] && {
|
|
local ifname
|
|
|
|
network_get_device ifname "$interface" || \
|
|
ifname="$interface"
|
|
procd_append_param command -I "$ifname"
|
|
procd_append_param netdev "$ifname"
|
|
}
|
|
fi
|
|
[ -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
|
|
[ -x /sbin/ujail -a -e /etc/capabilities/ntpd.json ] && {
|
|
procd_add_jail ntpd ubus
|
|
procd_add_jail_mount "$HOTPLUG_SCRIPT"
|
|
procd_add_jail_mount "/usr/share/libubox/jshn.sh"
|
|
procd_add_jail_mount "/usr/bin/env"
|
|
procd_add_jail_mount "/usr/bin/jshn"
|
|
procd_add_jail_mount "/bin/ubus"
|
|
procd_set_param capabilities /etc/capabilities/ntpd.json
|
|
procd_set_param user ntp
|
|
procd_set_param group ntp
|
|
procd_set_param no_new_privs 1
|
|
}
|
|
procd_close_instance
|
|
}
|
|
|
|
start_service() {
|
|
. /lib/functions/network.sh
|
|
validate_ntp_section ntp start_ntpd_instance
|
|
}
|
|
|
|
service_triggers() {
|
|
local script name use_dhcp enable_server interface
|
|
|
|
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
|
|
}
|
|
|
|
config_get_bool enable_server ntp enable_server 0
|
|
config_get interface ntp interface
|
|
|
|
[ $enable_server -eq 1 ] && [ -n "$interface" ] && {
|
|
local ifname
|
|
|
|
network_get_device ifname "$interface" || \
|
|
ifname="$interface"
|
|
procd_add_interface_trigger "interface.*" "$ifname" \
|
|
/etc/init.d/"$name" reload
|
|
}
|
|
|
|
procd_add_validation validate_ntp_section
|
|
}
|