#!/bin/sh

. /lib/functions.sh
. /lib/functions/network.sh
. /lib/mwan3/mwan3.sh
. /usr/share/libubox/jshn.sh

[  "$ACTION" == "disconnected" -o "$ACTION" == "connected" -o "$ACTION" == "ifupdate" -o "$ACTION" == "ifup" -o "$ACTION" == "ifdown" ] || exit 1
[ -n "$INTERFACE" ] || exit 2

if [ "$ACTION" == "ifup" ]; then
	[ -n "$DEVICE" ] || exit 3
fi

if [ "$INTERFACE" == "cellular_6_4" -o "$device" == "x-cellular_6_4" -o "$device" == "x-wan6_4" -o "$device" == "wwan6_4" ]; then
	exit 0
fi

if [[ "$INTERFACE" == "wan6_4" || "$INTERFACE" == "wwan6_4" ]]; then
        /usr/bin/logger -t services -p debug "464xlat mwan3 $ACTION $INTERFACE. Will ignore"
        exit 0
fi

config_load mwan3
config_get_bool enabled globals 'enabled' '0'
[ ${enabled} -gt 0 ] || exit 0

MAIN_INTERFACE="`echo -n $INTERFACE | sed 's/_6//' | sed 's/_4//'`"
mwan3_lock "$ACTION" "$MAIN_INTERFACE"
mwan3_init
mwan3_set_connected_iptables
mwan3_set_custom_ipset
mwan3_unlock "$ACTION" "$MAIN_INTERFACE"

config_get initial_state $MAIN_INTERFACE initial_state "online"
config_get_bool enabled $MAIN_INTERFACE 'enabled' '0'
[ "${enabled}" -eq 1 ] || {
	mwan3_unlock "$ACTION" "$MAIN_INTERFACE"
	exit 0
}

if [ "$ACTION" = "ifup" ]; then
	config_get family $MAIN_INTERFACE family ipv4
	if [ "$family" = "ipv4" ]; then
		ubus call network.interface.${MAIN_INTERFACE}_4 status &>/dev/null
		if [ "$?" -eq "0" ]; then
			network_get_ipaddr src_ip ${MAIN_INTERFACE}_4
		else
			network_get_ipaddr src_ip ${MAIN_INTERFACE}
		fi
		[ -n "$src_ip" ] || src_ip="0.0.0.0"
	elif [ "$family" = "ipv6" ]; then
		ubus call network.interface.${MAIN_INTERFACE}_6 status &>/dev/null
		if [ "$?" -eq "0" ]; then
			network_get_ipaddr6 src_ip ${MAIN_INTERFACE}_6
		else
			network_get_ipaddr6 src_ip ${MAIN_INTERFACE}
		fi
		[ -n "$src_ip" ] || src_ip="::"
	elif [ "$family" = "ipv4v6" ]; then 
		ubus call network.interface.${MAIN_INTERFACE}_4 status &>/dev/null
		if [ "$?" -eq "0" ]; then
			network_get_ipaddr src_ip4 ${MAIN_INTERFACE}_4
		else
			network_get_ipaddr src_ip4 ${MAIN_INTERFACE}
		fi
		[ -n "$src_ip4" ] || src_ip4="0.0.0.0"
		ubus call network.interface.${MAIN_INTERFACE}_6 status &>/dev/null
		if [ "$?" -eq "0" ]; then
			network_get_ipaddr6 src_ip6 ${MAIN_INTERFACE}_6
		else
			network_get_ipaddr6 src_ip6 ${MAIN_INTERFACE}
		fi
		[ -n "$src_ip6" ] || src_ip6="::"
		src_ip="$src_ip4,$src_ip6"
	fi

	#exit if no src_ip found
	[ "$src_ip" != "0.0.0.0" -a "$src_ip" != "::" -a "$src_ip" != "0.0.0.0,::" ] || {
	$LOG notice "$INTERFACE src_ip:$src_ip Invalid"
	exit
	}

	if [ "$initial_state" = "offline" ]; then
		status=$(cat $MWAN3TRACK_STATUS_DIR/$MAIN_INTERFACE/STATUS 2>/dev/null || echo unknown)
		[ "$status" = "online" ] || status=offline
	else
		status=online
	fi
fi

mwan3_lock "$ACTION" "$MAIN_INTERFACE"
$LOG notice "Execute "$ACTION" event on main_interface $MAIN_INTERFACE interface $INTERFACE (${DEVICE:-unknown})"

case "$ACTION" in
	ifup )
		mwan3_set_general_rules
		mwan3_set_general_iptables
		mwan3_create_iface_iptables $MAIN_INTERFACE $DEVICE
		mwan3_create_iface_rules $MAIN_INTERFACE $DEVICE
		mwan3_create_iface_route $MAIN_INTERFACE $DEVICE
		if [ "${status}" = "online" ]; then
			$LOG notice "Starting tracker on interface $MAIN_INTERFACE (${DEVICE:-unknown})"
			mwan3_set_iface_hotplug_state $MAIN_INTERFACE "online"
			mwan3_track $MAIN_INTERFACE $DEVICE "online" "$src_ip"
		else
			$LOG notice "Starting tracker on interface $MAIN_INTERFACE (${DEVICE:-unknown})"
			mwan3_set_iface_hotplug_state $MAIN_INTERFACE "offline"
			mwan3_track $MAIN_INTERFACE $DEVICE "offline" "$src_ip"
		fi
		mwan3_set_policies_iptables
		mwan3_set_user_rules
	;;
	ifdown)
		mwan3_set_iface_hotplug_state $MAIN_INTERFACE "offline"
		mwan3_delete_iface_ipset_entries $MAIN_INTERFACE
		mwan3_track_signal $MAIN_INTERFACE $DEVICE
		mwan3_set_policies_iptables
		mwan3_set_user_rules
		if [ "${PROCESS}" != "mwan3track" ]; then
			mwan3_track_kill $MAIN_INTERFACE $DEVICE
		fi
	;;
#	connected)
#		$LOG notice "Device is online"
#	;;
#	disconnected)
#		$LOG notice "Device disconnected event received"
#	;;
#	ifupdate)
#		$LOG notice "ifupdate event received"
#	;;
esac

mwan3_unlock "$ACTION" "$MAIN_INTERFACE"

exit 0
