busybox: sysntpd - Support for NTP servers received via DHCP(v6)

The busybox ntpd utility currently uses ntp servers specified in uci.
This patch allows the ntpd utility to use NTP servers received via DHCP(v6)
Following uci parameters have been added:
    use_dhcp : enables NTP server config via DHCP(v6)
    dhcp_interface : use NTP servers received only on the specified DHCP(v6) interfaces; if empty all interfaces are considered

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
This commit is contained in:
Hans Dedecker 2016-05-23 14:30:57 +02:00 committed by Jo-Philipp Wich
parent 2ac21bd793
commit 6707d9750a
2 changed files with 54 additions and 7 deletions

View file

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=busybox PKG_NAME:=busybox
PKG_VERSION:=1.24.2 PKG_VERSION:=1.24.2
PKG_RELEASE:=1 PKG_RELEASE:=2
PKG_FLAGS:=essential PKG_FLAGS:=essential
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
@ -42,7 +42,7 @@ define Package/busybox
MAINTAINER:=Felix Fietkau <nbd@openwrt.org> MAINTAINER:=Felix Fietkau <nbd@openwrt.org>
TITLE:=Core utilities for embedded Linux TITLE:=Core utilities for embedded Linux
URL:=http://busybox.net/ URL:=http://busybox.net/
DEPENDS:=+BUSYBOX_USE_LIBRPC:librpc +BUSYBOX_CONFIG_PAM:libpam DEPENDS:=+BUSYBOX_USE_LIBRPC:librpc +BUSYBOX_CONFIG_PAM:libpam +BUSYBOX_CONFIG_NTPD:jsonfilter
MENU:=1 MENU:=1
endef endef

View file

@ -7,13 +7,34 @@ USE_PROCD=1
PROG=/usr/sbin/ntpd PROG=/usr/sbin/ntpd
HOTPLUG_SCRIPT=/usr/sbin/ntpd-hotplug 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() { validate_ntp_section() {
uci_validate_section system timeserver "${1}" \ uci_validate_section system timeserver "${1}" \
'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0' 'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0' 'use_dhcp:bool:1' 'dhcp_interface:list(string)'
} }
start_service() { start_service() {
local server enabled enable_server peer local server enabled enable_server use_dhcp dhcp_interface peer
validate_ntp_section ntp || { validate_ntp_section ntp || {
echo "validation failed" echo "validation failed"
@ -22,6 +43,8 @@ start_service() {
[ $enabled = 0 ] && return [ $enabled = 0 ] && return
[ $use_dhcp = 1 ] && get_dhcp_ntp_servers "$dhcp_interface"
[ -z "$server" ] && return [ -z "$server" ] && return
procd_open_instance procd_open_instance
@ -35,8 +58,32 @@ start_service() {
procd_close_instance procd_close_instance
} }
service_triggers() service_triggers() {
{ local script name use_dhcp
procd_add_reload_trigger "system"
script=$(readlink -f "$initscript")
name=$(basename ${script:-$initscript})
procd_open_trigger
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_close_trigger
procd_add_validation validate_ntp_section procd_add_validation validate_ntp_section
} }