[OpenWrt-Devel] [PATCH] use NTP server received via DHCP
amine ahd
amine.ahd at gmail.com
Wed Jan 20 04:04:17 EST 2016
The current state of NTP is to load the list of NTP servers
from the static file /etc/config/system.
This patch allows ntpd to get NTP servers from DHCP.
Changes from V1:
-Users could choose not to use DHCP by setting "use_dhcp" to 0 in /etc/config/system under the ntp section.
-Users could specify which interfaces to use to get NTP servers from.
-Sysntpd will exit if no servers are specified in the static list and the DHCP option is disabled.
-Sysntpd will restart only if all of the following conditions are met:
*The user allowed DHCP to be used for NTP.
*The iface action is UP.
*The iface is specified in the list.
*The protocol in use is either DHCP or DHCPv6.
-Code improvements.
Signed-off-by: amine hamed <amine.ahd at gmail.com>
---
package/utils/busybox/Makefile | 3 ++
package/utils/busybox/files/sysntpd | 31 +++++++++++++++--
package/utils/busybox/files/sysntpd.hotplug | 54 +++++++++++++++++++++++++++++
3 files changed, 85 insertions(+), 3 deletions(-)
create mode 100644 package/utils/busybox/files/sysntpd.hotplug
diff --git a/package/utils/busybox/Makefile b/package/utils/busybox/Makefile
index 5ca4363..3066a85 100644
--- a/package/utils/busybox/Makefile
+++ b/package/utils/busybox/Makefile
@@ -111,6 +111,9 @@ define Package/busybox/install
$(CP) $(PKG_INSTALL_DIR)/* $(1)/
$(INSTALL_BIN) ./files/cron $(1)/etc/init.d/cron
$(INSTALL_BIN) ./files/sysntpd $(1)/etc/init.d/sysntpd
+ $(INSTALL_DIR) $(1)/etc/hotplug.d
+ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface
+ $(INSTALL_BIN) ./files/sysntpd.hotplug $(1)/etc/hotplug.d/iface/30-sysntpd
$(INSTALL_BIN) ./files/ntpd-hotplug $(1)/usr/sbin/ntpd-hotplug
-rm -rf $(1)/lib64
endef
diff --git a/package/utils/busybox/files/sysntpd b/package/utils/busybox/files/sysntpd
index f73bb83..c5dac8b 100755
--- a/package/utils/busybox/files/sysntpd
+++ b/package/utils/busybox/files/sysntpd
@@ -1,6 +1,9 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2011 OpenWrt.org
+. /lib/functions.sh
+. /usr/share/libubox/jshn.sh
+
START=98
USE_PROCD=1
@@ -13,21 +16,43 @@ validate_ntp_section() {
}
start_service() {
- local server enabled enable_server peer
+ local server enabled enable_server peer ntpservers iface status ntpserver dump
+ local dhcp_ifaces="$(uci -q get system.ntp.dhcp_ifaces)"
+ config_load system
+ config_get_bool "use_dhcp" "ntp" "use_dhcp"
validate_ntp_section ntp || {
echo "validation failed"
return 1
}
[ $enabled = 0 ] && return
-
- [ -z "$server" ] && return
+ [ -z "$server" ] && [ "$use_dhcp" = 0 ] && return
procd_open_instance
procd_set_param command "$PROG" -n
[ "$enable_server" = "1" ] && procd_append_param command -l
[ -x "$HOTPLUG_SCRIPT" ] && procd_append_param command -S "$HOTPLUG_SCRIPT"
+
+ [ "$use_dhcp" = 1 ] && {
+ if [ -z "$dhcp_ifaces" ]; then
+ dump="$(ubus call network.interface dump)"
+ ntpservers=$(jsonfilter -s "$dump" -e '$["interface"][*]["data"]["ntpserver"]')
+ else
+ for iface in $dhcp_ifaces; do
+ status="$(ubus call network.interface.$iface status)"
+ ntpserver=$(jsonfilter -s "$status" -e '$["data"]["ntpserver"]')
+ [ -n "$ntpserver" ] && \
+ ntpservers="$ntpservers $ntpserver"
+ done
+ fi
+ # add this data so we can use it in the sysntpd hotplug script.
+ procd_set_param data ntp_servers="$ntpservers $server"
+ for ntpserver in $ntpservers; do
+ procd_append_param command -p $ntpserver
+ done
+ }
+
for peer in $server; do
procd_append_param command -p $peer
done
diff --git a/package/utils/busybox/files/sysntpd.hotplug b/package/utils/busybox/files/sysntpd.hotplug
new file mode 100644
index 0000000..34a2f7a
--- /dev/null
+++ b/package/utils/busybox/files/sysntpd.hotplug
@@ -0,0 +1,54 @@
+#!/bin/sh
+
+. /lib/functions.sh
+. /usr/share/libubox/jshn.sh
+
+is_valid_interface() {
+ local list="$(uci get system.ntp.dhcp_ifaces)"
+ [ -z "$list" ] && return 0
+
+ case " $list " in
+ *" $INTERFACE "*)
+ return 0
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+}
+
+config_load system
+local proto="$(uci get network.$INTERFACE.proto)"
+config_get_bool "use_dhcp" "ntp" "use_dhcp"
+[ "$use_dhcp" = 1 ] && [ "$ACTION" = ifup ] && is_valid_interface && [ "$proto" = dhcp -o "$proto" = dhcp6 ] || exit 0
+
+handle_default_ntp_servers() {
+ local server="$1"
+ new_ntp_servers="$new_ntp_servers $server"
+}
+
+local dhcp_ntp_servers iface status ntpserver dump
+local dhcp_ifaces="$(uci -q get system.ntp.dhcp_ifaces)"
+if [ -z "$dhcp_ifaces" ]; then
+ dump="$(ubus call network.interface dump)"
+ dhcp_ntp_servers=$(jsonfilter -s "$dump" -e '$["interface"][*]["data"]["ntpserver"]')
+else
+ for iface in $dhcp_ifaces; do
+ status="$(ubus call network.interface.$iface status)"
+ ntpserver=$(jsonfilter -s "$status" -e '$["data"]["ntpserver"]')
+ [ -n "$ntpserver" ] && \
+ dhcp_ntp_servers="$dhcp_ntp_servers $ntpserver"
+ done
+fi
+
+new_ntp_servers="$dhcp_ntp_servers"
+#get the default list of ntp servers from the config file and append it to the new list
+config_list_foreach "ntp" "server" handle_default_ntp_servers
+
+#get the current list of ntp servers in the running instance
+local current_ntp_servers=$(ubus call service list '{"name":"sysntpd", "verbose":true}' | jsonfilter -e '$["sysntpd"]["instances"][*]["data"]["ntp_servers"]')
+#if its an up action, the iface uses DHCP and the new list of ntp servers is different from the old, restart sysntpd
+[ "$current_ntp_servers" != "$new_ntp_servers" ] || exit 0
+
+logger -t sysntpd "Reloading sysntpd due to $ACTION of interface $INTERFACE and a change of NTP servers"
+/etc/init.d/sysntpd enabled && /etc/init.d/sysntpd reload
\ No newline at end of file
--
2.5.0
_______________________________________________
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