[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