#!/bin/sh main_device=$1 def_eth0_gateway=$2 def_serverip=$3 add_4g_dns() { DNS_4G_PATH="/tmp/resolv.conf" DNS_PATH="/mnt/usr/etc/resolv.conf" if [ ! -f $DNS_4G_PATH ];then return fi if [ "$(sed -n 1p $DNS_4G_PATH)" == "" ]; then return fi if [ "$(sed -n 1p $DNS_4G_PATH)" == "$(sed -n 2p $DNS_PATH)" ]; then return fi if [ "$(sed -n 1p $DNS_4G_PATH)" == "$(sed -n 1p $DNS_PATH)" ]; then return fi if [ ! -f $DNS_PATH ];then echo $(sed -n 1p $DNS_4G_PATH) > $DNS_PATH echo "nameserver 114.114.114.114" >> $DNS_PATH else echo $(sed -n 1p $DNS_PATH) > $DNS_PATH echo $(sed -n 1p $DNS_4G_PATH) >> $DNS_PATH echo "nameserver 114.114.114.114" >> $DNS_PATH fi } check_route() { add_4g_dns if [ "$(route -n | sed -n '3p;3q' | grep $1 | grep UG)" == "" ];then ppp0_gw=$(route -n | grep ppp0 | grep UG | awk '{print $2}') while [ "$(route -n | grep UG)" != "" ] do route del default done if [ "$2" == "eth1" ];then route add default gw $def_eth0_gateway dev $2 metric 20 else route add default gw $ppp0_gw dev $2 metric 20 fi if [ "$1" == "eth1" ];then route add default gw $def_eth0_gateway dev $1 metric 10 else route add default gw $ppp0_gw dev $1 metric 10 fi fi } set_route_default() { ppp0_gw=$(route -n | grep ppp0 | grep UG | awk '{print $2}') while [ "$(route -n | grep UG)" != "" ] do route del default done if [ "$2" == "eth1" ];then route add default gw $def_eth0_gateway dev $2 metric 20 else route add default gw $ppp0_gw dev $2 metric 20 fi if [ "$1" == "eth1" ];then route add default gw $def_eth0_gateway dev $1 metric 10 else route add default gw $ppp0_gw dev $1 metric 10 fi } sub_device="" main_device_error=0 sub_device_error=0 route_def_flag=0 nothing=0 if [ "$#" -ne "3" ];then echo "usage ./auto_gw_switch " exit 1 fi if [ "$main_device" == "eth1" ]; then echo $main_device elif [ "$main_device" == "ppp0" ]; then echo $main_device else echo "Error: No such Main Dev " exit 1 fi if [ "$main_device" == "eth1" ]; then sub_device="ppp0"; else sub_device="eth1"; fi echo -n $def_serverip > /tmp/4g_ping.txt while true do if [ "$(lsusb | grep -E "ID 05c6:9025|ID 05c6:9059|ID 05c6:905a|ID 2949:8241|ID 2949:8242|ID 2949:8243|ID 19d2:0532|ID 19d2:0536|ID 19d2:0542|ID 19d2:0573|ID 19d2:0579|ID 2c7c:0125|ID 19d2:1476|ID 2c7c:6026|ID 2c7c:6002|ID 2c7c:6005")" != "" ]; then if [ "$(ps | grep udhcpc |grep -v grep)" == "" ]; then echo "nothing" #udhcpc -i ppp0 & fi else if [ "$(ps | grep udhcpc | grep -v grep)" == "" ];then nothing=1 else echo "nothing" #killall udhcpc fi sleep 5 continue fi if [ $route_def_flag == 0 ];then set_route_default $main_device $sub_device route_def_flag=1 fi ping $def_serverip -I $main_device -c 1 -w 1 >> /dev/null if [ "$?" != "0" ]; then #echo "ping main device failed" $main_device_error; let main_device_error++; else main_device_error=0; #echo "change to Main device" check_route $main_device $sub_device sleep 5 fi if [ $main_device_error -gt 5 ];then ping $def_serverip -I $sub_device -c 1 -w 1 >> /dev/null if [ "$?" != "0" ]; then #echo "ping sub device failed" $sub_device_error; let sub_device_error++; else sub_device_error=0; #echo "change to sub device" check_route $sub_device $main_device sleep 5 fi fi if [ $sub_device_error -gt 5 ];then check_route $main_device $sub_device fi done