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
|