#!/bin/sh

clear_restricted_gw()
{
	local state="$1"
	local iface
	local ifname
	local ipaddr
	local netmask
	local gateway

	config_get iface "$state" iface

	if [ "$iface" = "$INTERFACE" ]; then
		config_get ifname "$state" ifname
		config_get ipaddr "$state" ipaddr
		config_get netmask "$state" netmask
		config_get gateway "$state" gateway

		logger -t firewall.freifunk "removing local restriction to $iface($gateway)"
		iptables -D "zone_${INTERFACE}_ACCEPT" -i ! $ifname -o $ifname -d $ipaddr/$netmask -j REJECT
		iptables -D "zone_${INTERFACE}_ACCEPT" -i ! $ifname -o $ifname -d $gateway -j ACCEPT

		uci_revert_state firewall "$state"
	fi
}

get_enabled()
{
	local name
	config_get name "$1" name

	if [ "$name" = "$ZONE" ]; then
		config_get_bool local_restrict "$1" local_restrict
	fi
}

if [ "$ACTION" = add ]; then
	local enabled
	local ipaddr
	local netmask
	local gateway

	include /lib/network
	scan_interfaces

	config_get ipaddr "$INTERFACE" ipaddr
	config_get netmask "$INTERFACE" netmask
	config_get gateway "$INTERFACE" gateway

	if [ -n "$gateway" ] && [ "$gateway" != 0.0.0.0 ]; then
		config_load firewall

		local_restrict=0
		config_foreach get_enabled zone

		if [ "$local_restrict" = 1 ]; then
			logger -t firewall.freifunk "restricting local access to $DEVICE($gateway)"
			iptables -I "zone_${INTERFACE}_ACCEPT" -i ! $DEVICE -o $DEVICE -d $ipaddr/$netmask -j REJECT
			iptables -I "zone_${INTERFACE}_ACCEPT" -i ! $DEVICE -o $DEVICE -d $gateway -j ACCEPT

			local state="restricted_gw_${INTERFACE}"
			uci_set_state firewall "$state" "" restricted_gw_state
			uci_set_state firewall "$state" iface "$INTERFACE"
			uci_set_state firewall "$state" ifname "$DEVICE"
			uci_set_state firewall "$state" ipaddr "$ipaddr"
			uci_set_state firewall "$state" netmask "$netmask"
			uci_set_state firewall "$state" gateway "$gateway"
		fi
	fi

elif [ "$ACTION" = remove ]; then
	config_load firewall
	config_foreach clear_restricted_gw restricted_gw_state	 
fi

