[OpenWrt-Devel] [PATCH] busybox: sysntpd - use NTP servers received via DHCP

Felix Fietkau nbd at openwrt.org
Wed Jan 20 07:51:38 EST 2016


On 2016-01-20 13:34, amine ahd wrote:
> 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/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
This is all way more complex than it needs to be. There's a simple solution -
just replace the sysntpd init script service_triggers function with this:

service_triggers() {
	local script=$(readlink "$initscript")
	local name=$(basename ${script:-$initscript})

	procd_open_trigger
	procd_add_raw_trigger "interface.*" 2000 /etc/init.d/$name reload
	procd_close_trigger

	procd_add_reload_trigger "system"
	procd_add_validation validate_ntp_section
}

You can drop the hotplug script entirely.
What this will do is it will instruct procd to run the init script,
whenever an interface up/down event arrives (waiting for up to 2 seconds
before starting the script instead of starting it once for every single
event). procd will ensure that the sysntpd daemon is only restarted if
the command line actually changed, so you don't have to add any code
to compare the old and the new ntp server list.

- Felix
_______________________________________________
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