uci_get_one() { for var in "$@"; do uci -P /var/state get "$var" 2>/dev/null && break done } rand() { random=$(awk 'BEGIN { srand(); print int(rand() * 10 + 1); }') } sync_rdate() { local servers=$(uci_get_one "network.$INTERFACE.lease_timesrv" \ "system.@rdate[0].server") if [ -n "$servers" ]; then match=0 tries=3 rand while [ $match = 0 ] && [ $tries != 0 ]; do for server in $servers; do if [ $((--random)) = 0 ]; then rdate -s $server >/dev/null 2>/dev/null && { logger -t rdate "Synced with $server" match=1 } || { logger -t rdate "Failed to sync with $server" let tries="$tries - 1" rand } break fi done done else logger -t rdate "No usable time server found" fi } case "$ACTION" in ifup) route -n | grep -q ^0.0.0.0 && sync_rdate;; esac