aboutsummaryrefslogtreecommitdiff
path: root/package/utils/busybox/files/sysntpd
blob: 074f14b8f8a9f0b9e8305660434386aab2ee8f17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/sh /etc/rc.common
# Copyright (C) 2011 OpenWrt.org

START=98

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_load_validate system timeserver "$1" "$2" \
		'dhcp_interface:list(string)' \
		'enable_server:bool:0' \
		'enabled:bool:1' \
		'interface:string' \
		'server:list(host)' \
		'use_dhcp:bool:1'
}

start_ntpd_instance() {
	local peer

	[ "$2" = 0 ] || {
		echo "validation failed"
		return 1
	}

	[ $enabled = 0 ] && return

	[ $use_dhcp = 1 ] && get_dhcp_ntp_servers "$dhcp_interface"

	[ -z "$server" -a "$enable_server" = "0" ] && return

	procd_open_instance
	procd_set_param command "$PROG" -n -N
	if [ "$enable_server" = "1" ]; then
		procd_append_param command -l
		[ -n "$interface" ] && {
			local ifname

			network_get_device ifname "$interface" || \
				ifname="$interface"
			procd_append_param command -I "$ifname"
			procd_append_param netdev "$ifname"
		}
	fi
	[ -x "$HOTPLUG_SCRIPT" ] && procd_append_param command -S "$HOTPLUG_SCRIPT"
	for peer in $server; do
		procd_append_param command -p $peer
	done
	procd_set_param respawn
	[ -x /sbin/ujail -a -e /etc/capabilities/ntpd.json ] && {
		procd_add_jail ntpd ubus
		procd_add_jail_mount "$HOTPLUG_SCRIPT"
		procd_add_jail_mount "/usr/share/libubox/jshn.sh"
		procd_add_jail_mount "/usr/bin/env"
		procd_add_jail_mount "/usr/bin/jshn"
		procd_add_jail_mount "/bin/ubus"
		procd_set_param capabilities /etc/capabilities/ntpd.json
		procd_set_param user ntp
		procd_set_param group ntp
		procd_set_param no_new_privs 1
	}
	procd_close_instance
}

start_service() {
	. /lib/functions/network.sh
	validate_ntp_section ntp start_ntpd_instance
}

service_triggers() {
	local script name use_dhcp enable_server interface

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

	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
	}

	config_get_bool enable_server ntp enable_server 0
	config_get interface ntp interface

	[ $enable_server -eq 1 ] && [ -n "$interface" ] && {
		local ifname

		network_get_device ifname "$interface" || \
			ifname="$interface"
		procd_add_interface_trigger "interface.*" "$ifname" \
			/etc/init.d/"$name" reload
	}

	procd_add_validation validate_ntp_section
}