---
 package/utils/busybox/Makefile             |  3 ++
 package/utils/busybox/files/sysntpd        | 26 ++++++++++-
 package/utils/busybox/files/sysntpd.hotplug    | 53 ++++++++++++++++++++++
 3 files changed, 80 insertions(+), 2 deletions(-)
 create mode 100755 package/utils/busybox/files/sysntpd.hotplug

diff --git a/package/utils/busybox/Makefile b/package/utils/busybox/Makefile
index 9571d48..3c33246 100644
--- a/package/utils/busybox/Makefile
+++ b/package/utils/busybox/Makefile
@@ -112,6 +112,9 @@ define Package/busybox/install
        $(INSTALL_BIN) ./files/cron $(1)/etc/init.d/cron
        $(INSTALL_BIN) ./files/telnet $(1)/etc/init.d/telnet
        $(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..cc75cf9 100755
--- a/package/utils/busybox/files/sysntpd
+++ b/package/utils/busybox/files/sysntpd
@@ -1,6 +1,8 @@
 #!/bin/sh /etc/rc.common
 # Copyright (C) 2011 OpenWrt.org
 
+. /lib/functions.sh
+. /usr/share/libubox/jshn.sh
 START=98
 
 USE_PROCD=1
@@ -22,12 +24,32 @@ start_service() {
 
        [ $enabled = 0 ] && return
 
-       [ -z "$server" ] && 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"
+
+       local use_dhcp="$(uci -q get system.ntp.use_dhcp)"
+       local dhcp_ifaces="$(uci -q get system.ntp.dhcp_ifaces)"
+       [ "$use_dhcp" = 1 ] && {
+               if [ -z "$dhcp_ifaces" ]; then
+                       local dump=$(ubus call network.interface dump)
+                       ntpservers=$(jsonfilter -s "$dump" -e 
'$["interface"][*]["data"]["ntpserver"]')
+               else
+                       for iface in $dhcp_ifaces; do
+                               local status=$(ubus call 
network.interface.$iface status)
+                               local 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 100755
index 0000000..c0d0f37
--- /dev/null
+++ b/package/utils/busybox/files/sysntpd.hotplug
@@ -0,0 +1,53 @@
+#!/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
+}
+
+local proto="$(uci get network.$INTERFACE.proto)"
+local use_dhcp="$(uci -q get system.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_ifaces="$(uci -q get system.ntp.dhcp_ifaces)"
+if [ -z "$dhcp_ifaces" ]; then
+       local dump=$(ubus call network.interface dump)
+       local dhcp_ntp_servers=$(jsonfilter -s "$dump" -e 
'$["interface"][*]["data"]["ntpserver"]')
+else
+       for iface in $dhcp_ifaces; do
+               local status=$(ubus call network.interface.$iface status)
+               local 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_load system
+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
-- 
2.5.0
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to