#!/bin/sh

. /lib/functions.sh
. /lib/functions/network.sh

proto="4"
#[ -f /proc/net/ipv6_route ] && proto="4 6"

config_load freifunk-policyrouting
config_get enable pr enable
config_get fallback pr fallback
config_get strict pr strict
config_get zones pr zones

if [ "$ACTION" = "ifup" ] && [ "$enable" = "1" ]; then
	case $(uci get network.${INTERFACE}.proto) in none)
		# ubus status/netifd does not output ip4addr if proto=none
		net=$(ip -4 addr show dev ${DEVICE} scope global|sed -n '2s,^[[:space:]]\+inet \([^[:space:]]\+\).*,\1,p')
		#net6=$(ip -6 addr show dev ${DEVICE} scope global|sed -n '2s,^[[:space:]]\+inet6 \([^[:space:]]\+\).*,\1,p')
	;;*)
		network_get_subnet net $INTERFACE
		#network_get_subnet6 net6 $INTERFACE
	;;esac

	if [ "$net" != "" -a -n "${DEVICE}" ]; then
		eval $(/bin/ipcalc.sh $net)
		if [ "$PREFIX" != "0" -a "$NETWORK" != "127.0.0.0" ]; then
			if [ ! "$(ip route show table localnets |grep "$NETWORK/$PREFIX dev")" ]; then
				cmd="ip route add $NETWORK/$PREFIX dev ${DEVICE} table localnets"
				$cmd
				if [ "$?" = 0 ]; then
					logger -s -t policyrouting "Add route: $cmd"
				else
					logger -s -t policyrouting "Error! Could not add route: $cmd"
				fi
			fi
			if [ ! "$(ip route show table olsr |grep "$NETWORK/$PREFIX dev")" ]; then
				cmd="ip route add $NETWORK/$PREFIX dev ${DEVICE} table olsr"
				$cmd
				if [ "$?" = 0 ]; then
					logger -s -t policyrouting "Add route: $cmd"
				else
					logger -s -t policyrouting "Error! Could not add route: $cmd"
				fi
			fi

		fi

		if [ -n "$net6" ]; then
			cmd="ip -6 route add $net6 dev ${DEVICE} table localnets"
			$cmd 2>&1 > /dev/null
			if [ "$?" = 0 ]; then
				logger -s -t policyrouting "Add route: $cmd (IPv6)"
			fi

		fi

		networks=""
		for z in $zones; do
			network_zone="$(uci -q get firewall.zone_${z}.network)"
			if [ -z "$network_zone" ]; then
				network_zone="$z"
			fi
			networks="$networks $network_zone"
		done
		for n in $networks; do
			if [ "$INTERFACE" = "$n" ]; then
				for p in $proto; do
					logger -s -t policyrouting "Use mesh gateway for interface ${DEVICE} (IPv$p)"

					# add olsr-tunnel rule (SmartGateway tunnel) if not present
					if [ ! "$(ip -$p rule show | egrep "from all iif ${DEVICE} (\[detached\] )?lookup olsr-tunnel")" ]; then
						ip -$p rule add dev "${DEVICE}" lookup olsr-tunnel prio 19999
					fi

					# add olsr-default rule (Default route from mesh) if not present
					if [ ! "$(ip -$p rule show | egrep "from all iif ${DEVICE} (\[detached\] )?lookup olsr-default")" ]; then
						ip -$p rule add dev "${DEVICE}" lookup olsr-default prio 20000
					fi

					# add unreachable rules (prevents using router's default route (without VPN))
					if [ "$strict" != 0 ] && [ ! "$(ip -$p rule show | egrep "from all iif ${DEVICE} (\[detached\] )?unreachable")" ]; then
						ip -$p rule add dev "${DEVICE}" unreachable prio 20001
					fi

					# uci stuff
					if [ -z "$(uci -P /var/state get freifunk-policyrouting.${INTERFACE})" ]; then
						uci -P /var/state set freifunk-policyrouting.${INTERFACE}="state"
					fi
					uci -P /var/state set freifunk-policyrouting.${INTERFACE}.device="${DEVICE}"

				done
			fi
		done
	fi
fi
