#!/bin/sh

# Global Variables
primary_interface_name=wan
secondary_interface_name=wan2
ping_hosts="192.228.79.201 192.33.4.12 128.8.10.90 192.5.5.241" # Normal Health Check
#ping_hosts="198.41.0.4" # Complete Failure
#ping_hosts="192.228.79.201 198.41.0.4" # Partial Failure
ping_hosts="172.29.1.1" # Quick Pass

fn_test_connection () {
  failed=0
  total=0
  failed_hosts=""
  # a.root-servers.net 198.41.0.4 - Doesn't ping
  # b.root-servers.net 192.228.79.201
  # c.root-servers.net 192.33.4.12
  # d.root-servers.net 128.8.10.90
  # e.root-servers.net 192.203.230.10 - Doesn't ping
  # f.root-servers.net 192.5.5.241

  for hn in $ping_hosts
  do
      total=$(($total + 1))
      ping -c 2 $hn  > /dev/null 2>&1
      if [ $? -ne 0 ]; then
        failed_hosts="$failed_hosts $hn"
        failed=$(($failed + 1))
      fi
  done
  echo Total: $total Failed: $failed
  if [ $total -eq $failed ]; then
    echo "check_inet Health check failed all hosts down" #| logger
    false
  else
    if [ $failed -gt 0 ]; then
      echo "check_inet Health Check partially failed; hosts${failed_hosts} down" #| logger
    fi
    true
  fi
}

fn_switch_isp () { 
  down=1
  count=0
  while ( $down -eq 1 -a $count -lt 3 ); do
    # Health check primary_interface
    interface=`nvram get ${primary_interface_name}_ifname`
    ifconfig $interface | grep -q "inet addr"
    if [ $? -eq 0 ]; then
      echo "check_inet Primary Interface ${primary_interface_name} appears to be active, switching to secondary" #| logger
      ifdown ${primary_interface_name}
      sleep 2
      ifup ${secondary_interface_name}
      sleep 5
      fn_test_connection
      if [ $? -eq 0 ]; then
        down=0
        echo "check_inet Connectivity Restored" #| logger
      fi
    else
      interface=`nvram get ${secondary_interface_name}_ifname`
      ifconfig $interface | grep -q "inet addr"              
      if [ $? -eq 0 ]; then
        echo "check_inet Secondary Interface ${secondary_interface_name} appears to be active, switching to primary" #| logger
        ifdown ${secondary_interface_name}
        sleep 2
        ifup ${primary_interface_name}
        sleep 5
        fn_test_connection
        if [ $? -eq 0 ]; then
          down=0
          echo "check_inet Connectivity Restored" #| logger
        fi
      else
        echo "check_inet No Interface appears to be active, trying primary" #| logger
        ifdown ${primary_interface_name}
        ifdown ${secondary_interface_name}
        sleep 2
        ifup ${primary_interface_name}
        sleep 5
        fn_test_connection
        if [ $? -eq 0 ]; then
          down=0
          echo "check_inet Connectivity Restored" #| logger
        fi
      fi
    fi
    count=$(($count +1))
  done
}

#Main
#fn_test_connection 
false
if [ $? -ne 0 ]
then
  echo "check_inet Attempting to switching ISPs" #| logger
  fn_switch_isp  
fi
