#!/bin/sh

echo "****************Start of ping-netgear********************" > /dev/console
INTERVAL=10
traffic_previous_status=0
ping_previous_status=0
internet_status=0
old_route_status=""
route_status=""
INTERNET_INDICATE="/tmp/internet_status"
xcloud_region_set_file="/tmp/xcloud_region_set_file"

net_detect ()
{
    if [ "$wait_time" != "30" ];then
	[ "$route_status" = "$old_route_status" ] && return
    fi

    sleep 2 # route is ready, wait sometime for dns resolve.
    echo "do ping..." > /dev/console
    ping -c 2 www.netgear.com > /tmp/ping_netgear_result 2> /dev/null

    result=`cat /tmp/ping_netgear_result`

    traffic_previous_status=0
	internet_status=0
    if [ "x$result" = "x" ];then
        if [ "$ping_previous_status" = "0" ];then
            ping_previous_status=1
        fi

		internet_status=1
		old_disconnetion=`/bin/config get internetDisconnDuration`
		let old_disconnetion=old_disconnetion+5
		/bin/config set internetDisconnDuration=$old_disconnetion
    else
		if [ "x$(echo $result |grep "100% packet loss")" != "x" ]; then
			internet_status=1
			old_disconnetion=`/bin/config get internetDisconnDuration`
			let old_disconnetion=old_disconnetion+5
			/bin/config set internetDisconnDuration=$old_disconnetion
		fi
	wanport_status=`cat /tmp/port_status`
	if [ "$wanport_status" = "1" ];then
            ping_previous_status=0
	fi
    fi
}

wait_time="0"
wan_down_time="0"
while true
do
    wps_status=`cat /tmp/wps_process_state` 2> /dev/null
    hijack_status=`/bin/config get dns_hijack` 2> /dev/null
    traffic_status=`/bin/config get traffic_warning_limit` 2> /dev/null
    wanproto_status=`/bin/config get wan_proto` 2> /dev/null
    wandod_status=`/bin/config get wan_endis_dod` 2> /dev/null
    wanport_status=`cat /tmp/port_status` 2> /dev/null
    route_status=`route -n |grep UG`
    apmode_status=`/bin/config get ap_mode` 2> /dev/null
    brmode_status=`/bin/config get bridge_mode` 2> /dev/null

    if [ "$wps_status" = "start" ];then
        traffic_previous_status=0
        ping_previous_status=0

    elif [ "$hijack_status" = "1" ];then
        ping_previous_status=0
        if [ "$traffic_status" = "1" -o "$traffic_status" = "2" ];then
            traffic_previous_status=0
	
        else
            if [ "$traffic_previous_status" = "0" ];then
                traffic_previous_status=1
            fi
        fi
        if [ "$wanport_status" != "1" ];then
            internet_status=1
        else
            internet_status=0
        fi
    
    elif [ "$wanport_status" != "1" ];then
        if [ "$apmode_status" != "1" -a "$brmode_status" != "1" ]; then
			internet_status=1
		fi
        if [ "$ping_previous_status" = "0" ];then
            traffic_previous_status=0
            ping_previous_status=1
        fi
		wan_down_time=$(( $wan_down_time + 1 ))
	   if [ "$wan_down_time" -gt "30" ];then
			if [ "$wanproto_status" = "pppoe" -o "$wanproto_status" = "pptp" -o "$wanproto_status" = "l2tp" ] && [ "$wandod_status" = "1" ] && [ "$apmode_status" = "0" ] && [ "$brmode_status" = "0" ]; then
				wan_down_time=0
			elif [ "$apmode_status" = "1" -o "$brmode_status" = "1" ]; then
				net_detect
			else
				wan_down_time=0
				old_disconnetion=`/bin/config get internetDisconnDuration`
				old_disconnetion=$(($old_disconnetion+5))
				/bin/config set internetDisconnDuration=$old_disconnetion
			fi
		fi
    else
        if [ "$wanproto_status" = "pppoe" -o "$wanproto_status" = "pptp" -o "$wanproto_status" = "l2tp" ] && [ "$apmode_status" = "0" ] && [ "$brmode_status" = "0" ]; then
			# If connetion mode is dial-on-demand, then get connection status from file instead of pinging Internet.
            if [ "$wandod_status" = "1" ];then
				ppp_status=`cat /tmp/ppp/ppp0-status`
				if [ "x$ppp_status" = "x1" ];then
					traffic_previous_status=0
					ping_previous_status=0
					internet_status=0
				else
					ping_previous_status=1
					internet_status=1
				fi
            else
                net_detect
            fi
        else
            net_detect
        fi
    fi

    echo $internet_status > $INTERNET_INDICATE
	artmtd_region="$(artmtd -r region | grep REGION | awk '{print $2}')"
	if [ "$artmtd_region" = "PA" -o "$artmtd_region" = "NA" -o "$artmtd_region" = "CA" ];then
		if [ "$internet_status" = "0" ]; then
			if [ -z "$(config get xcloud_region_set_done)" -o ! -f "$xcloud_region_set_file" ];then
				/sbin/set_xcloud_region
			fi
		else
			if [ "$(config get xcloud_region_set_done)" = "0" ];then
				config set xcloud_region_set_done=""
				config commit
				rm -rf /tmp/xcloud_retry_times
			fi
		fi
	fi
    sleep $INTERVAL
    wait_time=$(( $wait_time + 1 ))
    [ "$wait_time" -gt "30" ] && wait_time=0
    old_route_status="$route_status"

done
echo "****************Stop of ping-netgear********************" > /dev/console
