22 мая 2015 г.

Bash: Inet switcher

Для сохранности оставлю здесь скрипт автопереключалки инета для трех провайдеров с проверкой доступности ресурсов. Правда, в рабочем порядке он еще не испробован, поэтому применять с осторожностью.

#!/bin/bash

##
## /etc/iproute2/rt_tables:
## 101     fc
## 102     adsl
## 103     gsm
##

##

##Localnet
L1_IF="eth77"
L1_IP="192.168.77.250"
L1_NET="192.168.77.0/24"

##FC
P1_IF="eth77"
P1_GW="192.168.77.159"
P1_TBL="fc"

##ADSL
P2_IF="ppp200"
P2_GW="`ifconfig ppp200 |egrep -o 'addr:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | awk -F: '{ print $2}'`"
P2_TBL="adsl"

##Cellular 3G
P3_IF="eth77"
P3_GW="192.168.77.200"
P3_TBL="gsm"

## hosts to ping
TEST1="77.88.8.8"
TEST2="8.8.8.8"

##Default for fallback feature
DEF=${P1_GW}

## fullfill iproute2 tables
function fill_p1
        {
                /bin/ip r flush table ${P1_TBL}
                /bin/ip r a default via ${P1_GW} table ${P1_TBL}
                /bin/ip r a ${L1_NET} dev ${L1_IF} src ${L1_IP} scope link table ${P1_TBL}
                /bin/ip rule a fwmark 1 lookup ${P1_TBL}
        }

function fill_p2
        {
                /bin/ip r flush table ${P2_TBL}
                /bin/ip r a default dev ${P2_IF} table ${P2_TBL}
                /bin/ip r a ${L1_NET} dev ${L1_IF} src ${L1_IP} scope link table ${P2_TBL}
                /bin/ip rule a fwmark 2 lookup ${P2_TBL}
        }
function fill_p3
        {
                /bin/ip r flush table ${P3_TBL}
                /bin/ip r a default via ${P3_GW} table ${P3_TBL}
                /bin/ip r a ${L1_NET} dev ${L1_IF} src ${L1_IP} scope link table ${P3_TBL}
                /bin/ip rule a fwmark 3 lookup ${P3_TBL}
        }

## checking internet availability via different providers
function get_status
        {
                CUR_GW=`/bin/ip r sh | grep def | egrep -o [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+`

                /bin/ping -W 1 -i 0.5 -c 2 -m 1 ${TEST1} > /dev/null
                P1_STAT="$?"

                /bin/ping -W 1 -i 0.5 -c 2 -m 2 ${TEST1} > /dev/null
                P2_STAT="$?"

                /bin/ping -W 1 -i 0.5 -c 2 -m 3 ${TEST1} > /dev/null
                P3_STAT="$?"

                if [ "$P1_STAT" -ne "0" ] && [ "$P2_STAT" -ne "0" ] && [ "$P3_STAT" -ne "0" ]
                        then
                               echo "${TEST1} failed, trying ${TEST2}"
                                /bin/ping -W 1 -i 0.5 -c 2 -m 1 ${TEST2} > /dev/null
                                P1_STAT="$?"

                                /bin/ping -W 1 -i 0.5 -c 2 -m 2 ${TEST2} > /dev/null
                                P2_STAT="$?"

                                /bin/ping -W 1 -i 0.5 -c 2 -m 3 ${TEST2} > /dev/null
                                P3_STAT="$?"
                fi

        }

##main

echo "filling rt_tables"
fill_p1
fill_p2
fill_p3

echo "cheking gateways"
get_status
echo "P1: $P1_STAT P2: $P2_STAT P3: $P3_STAT"

echo "action: "
if [ "$P1_STAT" -eq "0" ] && [ "$CUR_GW" = "$DEF" ]
        then
               echo "do nothing"
                exit 0
fi

if [ "$P1_STAT" -eq "0" ] && [ "$CUR_GW" != "${DEF}" ]
        then
               echo "restoring to $P1_TBL"
              /sbin/ip r ch default via ${P1_GW}
                exit 0
fi

if [ "$P2_STAT" -eq "0" ] && [ -n "$P2_GW" ]
        then
               echo "switching to $P2_TBL"
              /bin/ip r ch default via ${P2_GW}
                exit 0
fi
if [ "$P3_STAT" -eq "0" ]
        then
               echo "switching to $P3_TBL"
              /bin/ip r ch default via ${P3_GW}
                exit 0
        else
               echo "swag!"
fi