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
