amine ahd
2015-12-22 16:00:35 UTC
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.
ntpd will restart whenever the list of NTP servers is changed.
Signed-off-by: amine hamed <***@gmail.com>
---
package/utils/busybox/Makefile | 3 +++
package/utils/busybox/files/sysntpd | 15 +++++++++--
.../package/utils/busybox/files/sysntpd.hotplug | 31 ++++++++++++++++++++++
3 files changed, 47 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..fbe1838 100755
--- a/package/utils/busybox/files/sysntpd
+++ b/package/utils/busybox/files/sysntpd
@@ -1,12 +1,12 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2011 OpenWrt.org
+. /lib/functions.sh
START=98
USE_PROCD=1
PROG=/usr/sbin/ntpd
HOTPLUG_SCRIPT=/usr/sbin/ntpd-hotplug
-
validate_ntp_section() {
uci_validate_section system timeserver "${1}" \
'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0'
@@ -15,6 +15,8 @@ validate_ntp_section() {
start_service() {
local server enabled enable_server peer
+ #get the list of ntp servers from DHCP using ubus.
+ ntpservers=`ubus call network.interface dump | grep "ntpserver" | cut -d":" -f2 | tr -d '"'`
validate_ntp_section ntp || {
echo "validation failed"
return 1
@@ -22,12 +24,20 @@ start_service() {
[ $enabled = 0 ] && return
- [ -z "$server" ] && return
+ [ -z "$server" ] && [ "$ntpservers" == "" ] && 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"
+
+ #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
@@ -38,5 +48,6 @@ start_service() {
service_triggers()
{
procd_add_reload_trigger "system"
+
procd_add_validation validate_ntp_section
}
diff --git a/package/utils/busybox/files/sysntpd.hotplug b/package/utils/busybox/files/sysntpd.hotplug
new file mode 100755
index 0000000..de2946a
--- /dev/null
+++ b/package/utils/busybox/files/sysntpd.hotplug
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+. /lib/functions.sh
+
+[ "$ACTION" = ifup ] || exit 0
+
+handle_default_ntp_servers() {
+ local server="$1"
+ # append the server to the list
+ new_ntp_servers="$new_ntp_servers $server"
+}
+
+local proto=`uci get network.$INTERFACE.proto`
+
+#get the list of ntp servers returned from DHCP, remote leading and trailing whitespaces as well as string quotes
+dhcp_ntp_servers=`ubus call network.interface dump | grep "ntpserver" | cut -d":" -f2 | sed 's/\"//g;s/^[ \t]*//;s/[ \t]*$//'`
+
+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
+current_ntp_servers=`ubus call service get_data '{"name":"sysntpd"}' | grep "ntp_servers" | cut -d":" -f2 | sed 's/\"//g;s/^[ \t]*//;s/[ \t]*$//'`
+
+#if its an up action, the iface uses DHCP and the new list of ntp servers is different from the old, restart sysntpd
+[ "$proto" == "dhcp" ] && [ "$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
from the static file /etc/config/system.
This patch allows ntpd to get NTP servers from DHCP.
ntpd will restart whenever the list of NTP servers is changed.
Signed-off-by: amine hamed <***@gmail.com>
---
package/utils/busybox/Makefile | 3 +++
package/utils/busybox/files/sysntpd | 15 +++++++++--
.../package/utils/busybox/files/sysntpd.hotplug | 31 ++++++++++++++++++++++
3 files changed, 47 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..fbe1838 100755
--- a/package/utils/busybox/files/sysntpd
+++ b/package/utils/busybox/files/sysntpd
@@ -1,12 +1,12 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2011 OpenWrt.org
+. /lib/functions.sh
START=98
USE_PROCD=1
PROG=/usr/sbin/ntpd
HOTPLUG_SCRIPT=/usr/sbin/ntpd-hotplug
-
validate_ntp_section() {
uci_validate_section system timeserver "${1}" \
'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0'
@@ -15,6 +15,8 @@ validate_ntp_section() {
start_service() {
local server enabled enable_server peer
+ #get the list of ntp servers from DHCP using ubus.
+ ntpservers=`ubus call network.interface dump | grep "ntpserver" | cut -d":" -f2 | tr -d '"'`
validate_ntp_section ntp || {
echo "validation failed"
return 1
@@ -22,12 +24,20 @@ start_service() {
[ $enabled = 0 ] && return
- [ -z "$server" ] && return
+ [ -z "$server" ] && [ "$ntpservers" == "" ] && 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"
+
+ #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
@@ -38,5 +48,6 @@ start_service() {
service_triggers()
{
procd_add_reload_trigger "system"
+
procd_add_validation validate_ntp_section
}
diff --git a/package/utils/busybox/files/sysntpd.hotplug b/package/utils/busybox/files/sysntpd.hotplug
new file mode 100755
index 0000000..de2946a
--- /dev/null
+++ b/package/utils/busybox/files/sysntpd.hotplug
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+. /lib/functions.sh
+
+[ "$ACTION" = ifup ] || exit 0
+
+handle_default_ntp_servers() {
+ local server="$1"
+ # append the server to the list
+ new_ntp_servers="$new_ntp_servers $server"
+}
+
+local proto=`uci get network.$INTERFACE.proto`
+
+#get the list of ntp servers returned from DHCP, remote leading and trailing whitespaces as well as string quotes
+dhcp_ntp_servers=`ubus call network.interface dump | grep "ntpserver" | cut -d":" -f2 | sed 's/\"//g;s/^[ \t]*//;s/[ \t]*$//'`
+
+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
+current_ntp_servers=`ubus call service get_data '{"name":"sysntpd"}' | grep "ntp_servers" | cut -d":" -f2 | sed 's/\"//g;s/^[ \t]*//;s/[ \t]*$//'`
+
+#if its an up action, the iface uses DHCP and the new list of ntp servers is different from the old, restart sysntpd
+[ "$proto" == "dhcp" ] && [ "$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
2.5.0