#!/bin/sh

wan_disable=$(uci -q get network.wan.disable 2>/dev/null || echo 0)
voipwan_disable=$(uci -q get network.voipwan.disable 2>/dev/null || echo 1)
iptvwan_disable=$(uci -q get network.iptvwan.disable 2>/dev/null || echo 1)
mngtwan_disable=$(uci -q get network.mngtwan.disable 2>/dev/null || echo 1)
if [ "$wan_disable" == "1" -a "$voipwan_disable" == "1" -a "$iptvwan_disable" == "1" -a "$mngtwan_disable" == "1" ]; then
	exit 0;
fi

now=$(cat /proc/uptime | awk 'FS="[.]+" {print $1}')
wan_mode=$(uci -q get network.wan.proto)
backup=$(uci -q get network.3gwan.backup)
if [ "$wan_mode" = "LTE" ]; then
	exit 0;
fi

if [ "$wan_mode" != "3g" ]; then
	VDSL=$(ls /dev/vdsl > /dev/null 2>&1 && echo 1 || echo 0)
	if [ "$VDSL" != "1" ]; then
		killall -0 rapi_client 2>/dev/null || /sbin/rapi_client -p | grep -E -q "^1.*Down" && {
			ps | grep pppd | grep -qv grep && /sbin/ifdown_allwan >/dev/null
			exit
		}
	else
		echo -e "util phystatus 1\nexit" | vdslcli 2>/dev/null | grep -q -i "SHOWTIME" || {
			ps | grep pppd | grep -qv grep && /sbin/ifdown_allwan >/dev/null
			exit
		}
	fi
fi

[ "$wan_disable" == "1" ] || {
	runtime=$(uci -q -P /var/state get network.wan.ifup_running 2>/dev/null)
	upt=$(uci -q -P /var/state get network.wan.uptime 2>/dev/null)
	uptime=$(echo $upt | awk 'FS="[.]+" {print $1}')
	if [ $wan_mode == "3g" ]; then
		waittime=60
	else
		waittime=30
	fi
	if [ $now -ge 100 ]; then
		[ -n "$runtime" ] && { 
			DIFF=$(($now - $runtime))
			if [ $DIFF -le $waittime ]; then
				logger -p 160.5 "[WAN Check]ifup is running.......skip check_pppwan"
				return
			fi
		}
		[ -n "$uptime" ] && { 	
			DIFF2=$(($now - $uptime))
			if [ "$DIFF2" -le "$waittime" ]; then
				logger -p 160.5 "[WAN Check]wan just up ......skip check_pppwan"
				return
			fi
		}
	fi

	#If WAN mode=3g, reset it with "3G" input.(every 300 sec)
	#if [ "$wan_mode" != "3g" -o "$1" = "3G" ]; then
		defroute=$(route -n | grep '^0.0.0.0' -c 2>/dev/null)
		if [ "$defroute" != "1" ]; then
			[ "$defroute" == "2"  -a $(route -n | grep '^0.0.0.0' | grep -c 'ppp1' 2>/dev/null) == "1" ] && return
			logger -p 160.5 "[WAN Check] check default route failed:($defroute), revert WAN state and ifup wan..."
			uci -q -P /var/state revert network.wan
			/sbin/ifup wan
		else
			[ $(route -n | grep '^0.0.0.0' | grep -c 'ppp1' 2>/dev/null) == "1" -a "$wan_mode" != "static" ] && {
				logger -p 160.5 "[WAN Check] In backup mode, try to recover the Primary WAN ..."
				/sbin/ifup wan
			}	
		fi
	#fi
	
	if [ "$wan_mode" == "l2tp" -o "$wan_mode" == "pptp" ]; then
		deifc=$(route -n | grep '^0.0.0.0' | grep ppp -c 2>/dev/null)
		if [ "$defroute" == "1" -a "$deifc" != "1" ]; then
			logger -p 160.5 "[WAN Check] check default route failed:($defroute), revert $wan_mode WAN state and ifup wan..."
			uci -q -P /var/state revert network.wan
			/sbin/ifup wan
		fi
	fi
}

for iface in mngtwan iptvwan voipwan ; do 
	local DOWN_TIME=""
	local wan_disable=$(uci -q get network.$iface.disable 2>/dev/null || echo 1)
	[ "$wan_disable" == "1" ] && continue
	local wan_up=$(uci -q -P /var/state get network.$iface.up 2>/dev/null || echo 0)
	[ "$wan_up" == "1" ] && continue

	[ "$iface" == "mngtwan" ] && DOWN_TIME=`uci -q -P /var/state get network.mngt_down 2>/dev/null || uci -q -P /var/state set network.mngt_down="$now"`
	[ "$iface" == "iptvwan" ] && DOWN_TIME=`uci -q -P /var/state get network.iptv_down 2>/dev/null || uci -q -P /var/state set network.iptv_down="$now"`
	[ "$iface" == "voipwan" ] && DOWN_TIME=`uci -q -P /var/state get network.voip_down 2>/dev/null || uci -q -P /var/state set network.voip_down="$now"`
	DOWN_TIME="${DOWN_TIME:-$now}"
	DIFF=$(($now - $DOWN_TIME))
	if [ $DIFF -ge 30 ]; then
			logger -p 160.5 "[WAN Check] Revert $iface state and start $iface ..."
			[ "$iface" == "mngtwan" ] && uci -q -P /var/state revert network.mngt_down
			[ "$iface" == "iptvwan" ] && uci -q -P /var/state revert network.iptv_down
			[ "$iface" == "voipwan" ] && uci -q -P /var/state revert network.voip_down
			uci -q -P /var/state revert network.$iface		# revert failed in ifdown ???
			/sbin/ifup $iface
	fi
done
