diff mbox

[OpenWrt-Devel,1/1] use NTP server received via DHCP

Message ID 1452179042-29379-1-git-send-email-amine.ahd@gmail.com
State Changes Requested
Headers show

Commit Message

amine ahd Jan. 7, 2016, 3:04 p.m. UTC
---
 package/utils/busybox/Makefile             |  3 ++
 package/utils/busybox/files/sysntpd        | 28 +++++++++++-
 .../package/utils/busybox/files/sysntpd.hotplug    | 53 ++++++++++++++++++++++
 3 files changed, 82 insertions(+), 2 deletions(-)
 create mode 100755 package/utils/busybox/files/sysntpd.hotplug

Comments

Bastian Bittorf Jan. 7, 2016, 6:49 p.m. UTC | #1
* amine ahd <amine.ahd@gmail.com> [07.01.2016 19:41]:
> ---
>  package/utils/busybox/Makefile             |  3 ++
>  package/utils/busybox/files/sysntpd        | 28 +++++++++++-
>  .../package/utils/busybox/files/sysntpd.hotplug    | 53 ++++++++++++++++++++++

the path for "sysntpd.hotplug" is wrong, it should be:
package/utils/busybox/files/sysntpd.hotplug

> +	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.$int status)

please test if your code really runs.
you have renamed "int" to "iface", but not everywhere

> +				[ -n "$ntpserver" ] &&
> +					ntpservers="$ntpservers $ntpserver"

here is a '\' at line end missing, is'nt it?

>  service_triggers()
>  {
>  	procd_add_reload_trigger "system"
> +
>  	procd_add_validation validate_ntp_section
> +
>  }

are these newlines really needed?

> +. /lib/functions.sh
> +. /usr/share/libubox/jshn.sh
> +
> +is_valid_interface() {
> +	local list=$(uci get system.ntp.dhcp_ifaces)
> +	[ -z "$list" ] && return 0;

the ";" is unneeded

> +
> +	case "$list" in
> +		*"$INTERFACE"*)
> +			return 0

please use the spaces like i wrote:
" $list "
and
*" $INTERFACE "*

> +		[ -n "$ntpserver" ] &&
> +			dhcp_ntp_servers="dhcp_ntp_servers $ntpserver"

here is also a "\" missing 

please: before sending this patch to the mailinglist, try
to manually apply it to a fresh git-checkout of openwrt.
after applying, test the resulting files with "shellcheck.net".

bye, bastian.
diff mbox

Patch

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..b36afdb 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.$int 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
@@ -38,5 +60,7 @@  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..e0ba6cf
--- /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.$int 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