summaryrefslogtreecommitdiffstats
path: root/package/base-files/files/etc/hotplug.d/iface/40-rdate
blob: c5abaf011e205e86f464f89866f18211640dcd46 (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
IFACE_GLOBAL=$(uci_get "system.@rdate[0].interface")
SERVERS=
MAX=0
SYNCED=

do_rdate()
{
	local server="$1"

	rdate -s "$server" >/dev/null 2>/dev/null && {
		logger -t rdate "Synced with $server"
		SYNCED="$server"
	} || {
		logger -t rdate "Failed to sync with $server"
	}
}

add_server()
{
	local section="$1"

	local server
	config_get server "$section" hostname
	[ -z "$server" ] && return

	local iface
	config_get iface "$section" interface
	[ -z "$iface" ] && iface=$IFACE_GLOBAL
	[ -n "$iface" ] && {
		[ "$iface" = "$INTERFACE" ] || return
	}

	SERVERS="${SERVERS} $server"; : $((MAX++))
}

sync_time()
{
	local server
	server=$(uci_get_state "network.$INTERFACE.lease_timesrv")
	[ -n "$server" ] && do_rdate "$server"
	[ -n "$SYNCED" ] && return

	config_load timeserver
	config_foreach add_server timeserver

	local servers
	while [ $MAX -gt 0 ] && [ -z "$SYNCED" ]; do
		unset servers; random=$(awk "BEGIN { srand(); print int(rand() * $MAX + 1); }")
		for server in $SERVERS; do
			[ $((--random)) -eq 0 ] && { do_rdate "$server"; continue; }
			servers="${servers} $server"
		done
		SERVERS="${servers}"; : $((MAX--))
	done

	[ -z "$SYNCED" ] && logger -t rdate "No usable time server for $INTERFACE found"
}

case "${ACTION:-ifup}" in
	ifup)
		sync_time
	;;
esac