diff mbox

[OpenWrt-Devel] use NTP server received via DHCP

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

Commit Message

amine ahd Jan. 19, 2016, 8:02 a.m. UTC
---
 package/utils/busybox/Makefile              |  3 ++
 package/utils/busybox/files/sysntpd         | 33 +++++++++++++++---
 package/utils/busybox/files/sysntpd.hotplug | 54 +++++++++++++++++++++++++++++
 3 files changed, 86 insertions(+), 4 deletions(-)
 create mode 100644 package/utils/busybox/files/sysntpd.hotplug

Comments

Bastian Bittorf Jan. 19, 2016, 9:21 a.m. UTC | #1
* amine ahd <amine.ahd@gmail.com> [19.01.2016 10:12]:
>  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)"
> +	

please remove whitespaces in the line above,
otherwise it looks fine to me.

bye, bastian
John Crispin Jan. 19, 2016, 9:35 a.m. UTC | #2
On 19/01/2016 10:21, Bastian Bittorf wrote:
> * amine ahd <amine.ahd@gmail.com> [19.01.2016 10:12]:
>>  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)"
>> +	
> 
> please remove whitespaces in the line above,
> otherwise it looks fine to me.
> 
> bye, bastian


the subject prefix is also missing

	John
David Lang Jan. 27, 2016, 8:04 a.m. UTC | #3
Just a side note while you are working in this area.

all the documentation for udhcpc (including it's default config settings) says 
that it uses one default file path, but when it's run that path gets overridden 
on the command line and a different file is used instead.

The default in the config should be changed to what's actually used and the 
extra copy should be eliminated.

David Lang
diff mbox

Patch

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..118c3e3 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