Root/package/base-files/files/etc/hotplug.d/iface/40-rdate

1IFACE_GLOBAL=$(uci_get "system.@rdate[0].interface")
2SERVERS=
3MAX=0
4SYNCED=
5
6do_rdate()
7{
8    local server="$1"
9
10    rdate -s "$server" >/dev/null 2>/dev/null && {
11        logger -t rdate "Synced with $server"
12        SYNCED="$server"
13    } || {
14        logger -t rdate "Failed to sync with $server"
15    }
16}
17
18add_server()
19{
20    local section="$1"
21
22    local server
23    config_get server "$section" hostname
24    [ -z "$server" ] && return
25
26    local iface
27    config_get iface "$section" interface
28    [ -z "$iface" ] && iface=$IFACE_GLOBAL
29    [ -n "$iface" ] && {
30        [ "$iface" = "$INTERFACE" ] || return
31    }
32
33    SERVERS="${SERVERS} $server"; : $((MAX++))
34}
35
36sync_time()
37{
38    local server
39    server=$(uci_get_state "network.$INTERFACE.lease_timesrv")
40    [ -n "$server" ] && do_rdate "$server"
41    [ -n "$SYNCED" ] && return
42
43    config_load timeserver
44    config_foreach add_server timeserver
45
46    local servers
47    while [ $MAX -gt 0 ] && [ -z "$SYNCED" ]; do
48        unset servers; random=$(awk "BEGIN { srand(); print int(rand() * $MAX + 1); }")
49        for server in $SERVERS; do
50            [ $((--random)) -eq 0 ] && { do_rdate "$server"; continue; }
51            servers="${servers} $server"
52        done
53        SERVERS="${servers}"; : $((MAX--))
54    done
55
56    [ -z "$SYNCED" ] && logger -t rdate "No usable time server for $INTERFACE found"
57}
58
59case "${ACTION:-ifup}" in
60    ifup)
61        sync_time
62    ;;
63esac
64

Archive Download this file



interactive