busybox: sysntpd - Support for NTP servers received via DHCP(v6)
The busybox ntpd utility currently uses ntp servers specified in uci.
This patch allows the ntpd utility to use NTP servers received via DHCP(v6)
Following uci parameters have been added:
    use_dhcp : enables NTP server config via DHCP(v6)
    dhcp_interface : use NTP servers received only on the specified DHCP(v6) interfaces; if empty all interfaces are considered
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
			
			
This commit is contained in:
		 Hans Dedecker
					Hans Dedecker
				
			
				
					committed by
					
						 Jo-Philipp Wich
						Jo-Philipp Wich
					
				
			
			
				
	
			
			
			 Jo-Philipp Wich
						Jo-Philipp Wich
					
				
			
						parent
						
							2ac21bd793
						
					
				
				
					commit
					6707d9750a
				
			| @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk | ||||
|  | ||||
| PKG_NAME:=busybox | ||||
| PKG_VERSION:=1.24.2 | ||||
| PKG_RELEASE:=1 | ||||
| PKG_RELEASE:=2 | ||||
| PKG_FLAGS:=essential | ||||
|  | ||||
| PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 | ||||
| @@ -42,7 +42,7 @@ define Package/busybox | ||||
|   MAINTAINER:=Felix Fietkau <nbd@openwrt.org> | ||||
|   TITLE:=Core utilities for embedded Linux | ||||
|   URL:=http://busybox.net/ | ||||
|   DEPENDS:=+BUSYBOX_USE_LIBRPC:librpc +BUSYBOX_CONFIG_PAM:libpam | ||||
|   DEPENDS:=+BUSYBOX_USE_LIBRPC:librpc +BUSYBOX_CONFIG_PAM:libpam +BUSYBOX_CONFIG_NTPD:jsonfilter | ||||
|   MENU:=1 | ||||
| endef | ||||
|  | ||||
|   | ||||
| @@ -7,13 +7,34 @@ USE_PROCD=1 | ||||
| PROG=/usr/sbin/ntpd | ||||
| HOTPLUG_SCRIPT=/usr/sbin/ntpd-hotplug | ||||
|  | ||||
| get_dhcp_ntp_servers() { | ||||
| 	local interfaces="$1" | ||||
| 	local filter="*" | ||||
| 	local interface ntpservers ntpserver | ||||
|  | ||||
| 	for interface in $interfaces; do | ||||
| 		[ "$filter" = "*" ] && filter="@.interface='$interface'" || filter="$filter,@.interface='$interface'" | ||||
| 	done | ||||
|  | ||||
| 	ntpservers=$(ubus call network.interface dump | jsonfilter -e "@.interface[$filter]['data']['ntpserver']") | ||||
|  | ||||
| 	for ntpserver in $ntpservers; do | ||||
| 		local duplicate=0 | ||||
| 		local entry | ||||
| 		for entry in $server; do | ||||
| 			[ "$ntpserver" = "$entry" ] && duplicate=1 | ||||
| 		done | ||||
| 		[ "$duplicate" = 0 ] && server="$server $ntpserver" | ||||
| 	done | ||||
| } | ||||
|  | ||||
| validate_ntp_section() { | ||||
| 	uci_validate_section system timeserver "${1}" \ | ||||
| 		'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0' | ||||
| 		'server:list(host)' 'enabled:bool:1' 'enable_server:bool:0' 'use_dhcp:bool:1' 'dhcp_interface:list(string)' | ||||
| } | ||||
|  | ||||
| start_service() { | ||||
| 	local server enabled enable_server peer | ||||
| 	local server enabled enable_server use_dhcp dhcp_interface peer | ||||
|  | ||||
| 	validate_ntp_section ntp || { | ||||
| 		echo "validation failed" | ||||
| @@ -22,6 +43,8 @@ start_service() { | ||||
|  | ||||
| 	[ $enabled = 0 ] && return | ||||
|  | ||||
| 	[ $use_dhcp = 1 ] && get_dhcp_ntp_servers "$dhcp_interface" | ||||
|  | ||||
| 	[ -z "$server" ] && return | ||||
|  | ||||
| 	procd_open_instance | ||||
| @@ -35,8 +58,32 @@ start_service() { | ||||
| 	procd_close_instance | ||||
| } | ||||
|  | ||||
| service_triggers() | ||||
| { | ||||
| 	procd_add_reload_trigger "system" | ||||
| service_triggers() { | ||||
| 	local script name use_dhcp | ||||
|  | ||||
| 	script=$(readlink -f "$initscript") | ||||
| 	name=$(basename ${script:-$initscript}) | ||||
|  | ||||
| 	procd_open_trigger | ||||
| 	procd_add_config_trigger "config.change" "system" /etc/init.d/$name reload | ||||
|  | ||||
| 	config_load system | ||||
| 	config_get use_dhcp ntp use_dhcp 1 | ||||
|  | ||||
| 	[ $use_dhcp = 1 ] && { | ||||
| 		local dhcp_interface | ||||
| 		config_get dhcp_interface ntp dhcp_interface | ||||
|  | ||||
| 		if [ -n "$dhcp_interface" ]; then | ||||
| 			for n in $dhcp_interface; do | ||||
| 				procd_add_interface_trigger "interface.*" $n /etc/init.d/$name reload | ||||
| 			done | ||||
| 		else | ||||
| 			procd_add_raw_trigger "interface.*" 1000 /etc/init.d/$name reload | ||||
| 		fi | ||||
| 	} | ||||
|  | ||||
| 	procd_close_trigger | ||||
|  | ||||
| 	procd_add_validation validate_ntp_section | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user