openwrt/package/utils/busybox/files/sysntpd
Alexey Dobrovolsky e12fcf0fe5 busybox: sysntpd: option to bind server to iface
NTPD in busybox has option -I to bind server to IFACE.
However, capabilities of the busybox are limited, the -I option cannot be
repeated and only one interface can be effectively specified in it.
This option is currently not configurable via UCI.
The patch adds an interface option to the system config, ntp section.
Also sort options for uci_load_validate alphabetically.

Signed-off-by: Alexey Dobrovolsky <dobrovolskiy.alexey@gmail.com>
2021-03-01 00:34:22 +01:00

111 lines
2.7 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" ] && procd_append_param command -I $interface
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() {
validate_ntp_section ntp start_ntpd_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
}