[OpenWrt-Devel] [PATCH] busybox: sysntpd - Support for NTP servers received via DHCP(v6)

Hans Dedecker dedeckeh at gmail.com
Thu May 19 12:57:51 EDT 2016


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 at gmail.com>
---

The patch is based on a previous discussion held on the OpenWRT-devel mailing list
(https://lists.openwrt.org/pipermail/openwrt-devel/2016-January/039081.html) as per Felix's
comments this solution is based on procd interface service triggers

 package/utils/busybox/Makefile      |  2 +-
 package/utils/busybox/files/sysntpd | 43 ++++++++++++++++++++++++++++++++-----
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/package/utils/busybox/Makefile b/package/utils/busybox/Makefile
index 24c064c..24e0e11 100644
--- a/package/utils/busybox/Makefile
+++ b/package/utils/busybox/Makefile
@@ -42,7 +42,7 @@ define Package/busybox
   MAINTAINER:=Felix Fietkau <nbd at openwrt.org>
   TITLE:=Core utilities for embedded Linux
   URL:=http://busybox.net/
-  DEPENDS:=+BUSYBOX_USE_LIBRPC:librpc +BUSYBOX_CONFIG_PAM:libpam
+  DEPENDS:=+BUSYBOX_USE_LIBRPC:librpc +BUSYBOX_CONFIG_PAM:libpam +jsonfilter
   MENU:=1
 endef
 
diff --git a/package/utils/busybox/files/sysntpd b/package/utils/busybox/files/sysntpd
index f73bb83..5c663d7 100755
--- a/package/utils/busybox/files/sysntpd
+++ b/package/utils/busybox/files/sysntpd
@@ -7,13 +7,35 @@ USE_PROCD=1
 PROG=/usr/sbin/ntpd
 HOTPLUG_SCRIPT=/usr/sbin/ntpd-hotplug
 
+get_dhcp_ntp_servers() {
+	local interfaces="$1"
+	local filter="*"
+	local network_dump interface ntpservers ntpserver
+
+	network_dump=$(ubus call network.interface dump)
+	for interface in $interfaces; do
+		[ "$filter" = "*" ] && filter="@.interface='$interface'" || filter="$filter, at .interface='$interface'"
+	done
+
+	ntpservers=$(jsonfilter -s "$network_dump" -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'
+		'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0' 'use_dhcp:bool:0' 'dhcp_interface:list(string)'
 }
 
 start_service() {
-	local server enabled enable_server peer
+	local server enabled enable_server use_dhcp dhcp_interface peer
 
 	validate_ntp_section ntp || {
 		echo "validation failed"
@@ -22,6 +44,8 @@ start_service() {
 
 	[ $enabled = 0 ] && return
 
+	[ $use_dhcp = 1 ] && get_dhcp_ntp_servers "$dhcp_interface"
+
 	[ -z "$server" ] && return
 
 	procd_open_instance
@@ -35,8 +59,17 @@ start_service() {
 	procd_close_instance
 }
 
-service_triggers()
-{
-	procd_add_reload_trigger "system"
+service_triggers() {
+	local script name
+
+	script=$(readlink -f "$initscript")
+	name=$(basename ${script:-$initscript})
+
+	procd_open_trigger
+	procd_add_config_trigger "config.change" "system" /etc/init.d/$name reload
+
+	procd_add_raw_trigger "interface.*" 2000 /etc/init.d/$name reload
+	procd_close_trigger
+
 	procd_add_validation validate_ntp_section
 }
-- 
1.9.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


More information about the openwrt-devel mailing list