#!/bin/sh

[ -x /usr/bin/ip ] || exit 4
[ -x /usr/sbin/ipset ] || exit 5
[ -x /usr/sbin/iptables ] || exit 6
[ -x /usr/sbin/ip6tables ] || exit 7
[ -x /usr/bin/logger ] || exit 8

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

help()
{
	cat <<EOF
Syntax: mwan3 [command]

Available commands:
	start           Load iptables rules, ip rules and ip routes
	stop            Unload iptables rules, ip rules and ip routes
	restart         Reload iptables rules, ip rules and ip routes
        ifup <iface>    Load rules and routes for specific interface
        ifdown <iface>  Unload rules and routes for specific interface
        interfaces      Show interfaces status
        policies        Show currently active policy
	connected	Show directly connected networks
        rules           Show active rules
        status          Show all status

EOF
}

ifdown()
{
	if [ -z "$1" ]; then
		echo "Error: Expecting interface. Usage: mwan3 ifdown <interface>" && exit 0
	fi

	if [ -n "$2" ]; then
		echo "Error: Too many arguments. Usage: mwan3 ifdown <interface>" && exit 0
	fi

	ACTION=ifdown INTERFACE=$1 /sbin/hotplug-call iface

	if [ -e /var/run/mwan3track-$1.pid ] ; then
		kill $(cat /var/run/mwan3track-$1.pid)
		rm /var/run/mwan3track-$1.pid
	fi
}

ifup()
{
	local device enabled

	config_load mwan3

	if [ -z "$1" ]; then
		echo "Expecting interface. Usage: mwan3 ifup <interface>" && exit 0
	fi

	if [ -n "$2" ]; then
		echo "Too many arguments. Usage: mwan3 ifup <interface>" && exit 0
	fi

	config_get enabled "$1" enabled 0

	device=$(uci -p /var/state get network.$1.ifname) &> /dev/null

	if [ -n "$device" ] ; then
		[ "$enabled" -eq 1 ] && ACTION=ifup INTERFACE=$1 DEVICE=$device /sbin/hotplug-call iface
	fi
}

interfaces()
{
	config_load mwan3

	echo "Interface status:"
	config_foreach mwan3_report_iface_status interface
	echo -e
}

policies()
{
	echo "Current ipv4 policies:"
	mwan3_report_policies_v4
	echo "Current ipv6 policies:"
	mwan3_report_policies_v6
}

connected()
{
	echo "Directly connected ipv4 networks:"
	mwan3_report_connected_v4
	echo -e
	echo "Directly connected ipv6 networks:"
	mwan3_report_connected_v6
	echo -e
}

rules()
{
	echo "Active ipv4 user rules:"
	mwan3_report_rules_v4
	echo -e
	echo "Active ipv6 user rules:"
	mwan3_report_rules_v6
	echo -e
}

status()
{
	interfaces
	policies
	connected
	rules
}

start()
{
	config_load mwan3
	config_foreach ifup interface
}

stop()
{
	local ipset route rule table IP IPT

	killall mwan3track &> /dev/null
	rm /var/run/mwan3track-* &> /dev/null

	for IP in "$IP4" "$IP6"; do

		for route in $($IP route list table all | sed 's/.*table \([^ ]*\) .*/\1/' |  awk '{print $1}' | awk '{for(i=1;i<=NF;i++) if($i+0>0) if($i+0<255) {print;break}}'); do
			$IP route flush table $route &> /dev/null
		done

		for rule in $($IP rule list | egrep '^[1-2][0-9]{3}\:' | cut -d ':' -f 1); do
			$IP rule del pref $rule &> /dev/null
		done
	done

	for IPT in "$IPT4" "$IPT6"; do

		$IPT -D PREROUTING -j mwan3_hook &> /dev/null
		$IPT -D OUTPUT -j mwan3_hook &> /dev/null

		for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
			$IPT -F $table &> /dev/null
		done

		for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
			$IPT -X $table &> /dev/null
		done
	done

	for ipset in $($IPS -n list | sort | grep mwan3); do
		$IPS destroy $ipset
	done
}

restart() {
	stop
	start
}

case "$1" in
	ifup|ifdown|interfaces|policies|connected|rules|status|start|stop|restart)
		$*
	;;
	*)
		help
	;;
esac

exit 0
