#!/bin/sh /etc/rc.common
# Copyright (C) 2016 OpenWrt.org

START=50
USE_PROCD=1

validate_section_addrwatch() {
	uci_load_validate addrwatch addrwatch "$1" "$2" \
		'enabled:bool:0' \
		'interface:list(string):lan' \
		'syslog:bool:0' \
		'output:string' \
		'verbose:bool:0' \
		'ipv4only:bool:0' \
		'ipv6only:bool:0' \
		'blacklist:list(or(ip4addr,ip6addr))' \
		'hashsize:range(1,65536):1'\
		'ratelimit:integer:0'
}

start_instance() {
	local cfg="$1"
	local netdevs=""

	[ "$2" = 0 ] || {
		echo "validation of config $cfg failed"
		return 1
	}
	[ $enabled -eq 1 ] || return 1

	for iface in $interface; do
		local netdev
		network_get_physdev netdev "$iface"
		append netdevs "$netdev"
	done

	procd_open_instance
	procd_set_param command /usr/sbin/addrwatch --quiet
	[ -n "$output" ] && procd_append_param command "--output=$output"
	[ "$verbose" -eq 1 ] && procd_append_param command "--verbose"
	[ "$ipv4only" -eq 1 ] && procd_append_param command "--ipv4-only"
	[ "$ipv6only" -eq 1 ] && procd_append_param command "--ipv6-only"
	[ -n "$hashsize" ] && procd_append_param command "--hashsize=$hashsize"
	[ -n "$ratelimit" ] && procd_append_param command "--ratelimit=$ratelimit"
	for blitem in $blacklist; do
		procd_append_param command "--blacklist=$blitem"
	done
	procd_append_param command $netdevs
	procd_set_param netdev $netdevs
	procd_set_param respawn
	procd_open_trigger
	for iface in $interface; do
		procd_add_interface_trigger "interface.*" $iface /etc/init.d/addrwatch reload
	done
	procd_close_trigger
	procd_close_instance

	[ "$syslog" -eq 1 ] && {
		if [ -x /usr/sbin/addrwatch_syslog ]; then
			procd_open_instance
			procd_set_param command /usr/sbin/addrwatch_syslog
			procd_set_param respawn
			procd_close_instance
		else
			echo "Cannot find /usr/sbin/addrwatch_syslog" >&2
			echo "Install the addrwatch-syslog package to enable syslog output" >&2
		fi
	}
}

start_service() {
	. /lib/functions/network.sh
	config_load 'addrwatch'
	config_foreach validate_section_addrwatch 'addrwatch' start_instance
}

service_triggers() {
	procd_add_reload_trigger 'addrwatch'
	procd_add_validation validate_section_addrwatch
}