URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 3954
[ Назад ]

Исходное сообщение
"Тематический каталог: Пример скрипта для переключения выделенок, при падении. (leased trouble script example)"

Отправлено auto_topic , 06-Июл-04 16:39 
Обсуждение статьи тематического каталога: Пример скрипта для переключения выделенок, при падении. (leased trouble script example)

Ссылка на текст статьи: http://www.opennet.me/base/net/leased_degluk.txt.html


Содержание

Сообщения в этом обсуждении
"Пример скрипта для переключения выделенок, при падении. (leased trouble script example)"
Отправлено samid , 06-Июл-04 16:39 
а вот на 3 канала переделано! но теперь без ошибок ;))

#!/bin/sh
PATH="/sbin:/usr/bin"

ISP1="*.*.*.*"

ISP2="*.*.*.*"

ISP3="*.*.*.*"


OVER_ISP1="*.*.*.*"
OVER_ISP2="*.*.*.*"
OVER_ISP3="*.*.*.*"

netstat -nr | grep ${OVER_ISP1} >/dev/null 2>&1
if [ $? != 0 ]; then
        echo "Add static route to ${OVER_ISP1} via ${ISP1}"
        route add ${OVER_ISP1} ${ISP1} -static
fi
netstat -nr | grep ${OVER_ISP2} >/dev/null 2>&1
if [ $? != 0 ]; then
         echo "Add static route to ${OVER_ISP2} via  ${ISP2}"
         route add ${OVER_ISP2} ${ISP2} -static
fi

netstat -nr | grep ${OVER_ISP3} >/dev/null 2>&1
if [ $? != 0 ]; then
         echo "Add static route to ${OVER_ISP3} via  ${ISP3}"
         route add ${OVER_ISP3} ${ISP3} -static

fi

current_now=`netstat -nr | grep default | awk '{print $2}'`

echo -n "ping ISP1:"
ping -c 2 ${OVER_ISP1} >/dev/null 2>&1
if [ $? -eq 0 ]; then
                echo " [OK]"
                ISP1_stat=0
                else
                echo " [FAILED]"
                ISP1_stat=1
fi

echo -n "ISP2:"
ping -c 1 ${OVER_ISP2} >/dev/null 2>&1
if [ $? -eq 0 ]; then
                echo " [OK]"
               ISP2_stat=0
                else
                echo " [FAILED]"
                ISP2_stat=1
fi

echo -n "ping ISP3:"
ping -c 1 ${OVER_ISP3} >/dev/null 2>&1
if [ $? -eq 0 ]; then
                echo " [OK]"
                ISP3_stat=0
                else
                echo " [FAILED]"
                ISP3_stat=1
fi


if [ ${ISP1_stat} -eq 1 -a ${ISP2_stat} -eq 0 -a  ${current_now} = ${ISP1} ]; then
                echo "ISP1 suck"
                route delete default
                route add default ${ISP2}
fi

if [ ${ISP1_stat} -eq 1 -a ${ISP2_stat} -eq 1 -a ${ISP3_stat} -eq 0 -a  ${current_now} != ${ISP3} ]; then
                echo "ISP1 ISP2 suck"
                route delete default
                route add default ${ISP3}
fi

if [ ${ISP1_stat} -eq 0 -a ${current_now} != ${ISP1} ]; then
                echo "Back to ISP1"
                route delete default
                route add default ${ISP1}
fi


"Пример скрипта для переключения выделенок, при падении. (leased trouble script example)"
Отправлено nagoHaK , 17-Сен-04 13:12 
У меня этот скрипт так и не пошёл, написал свой на основе этого первого из приведенных:
#!/bin/sh
#----------------------------------------------------------------------
# Description: Channel emergency switching script
# Author: Britvin Danila <>
# Computer: router
# System: FreeBSD 5.2.1-RELEASE on i386
#----------------------------------------------------------------------

# Variables
#### First channel description
FRST="1.1.1.1"
FRSTGW="gw1.gw1.gw1.gw1"
FRSTIF="if0"
#### Second channel description
SCND="2.2.2.2"
SCNDGW="gw2.gw2.gw2.gw2"
SCNDIF="if1"
#Target for ping
TGT="194.226.96.8"             #ns4.ripn.net
#### Reading current channel
netstat -rn | grep default > /log.txt
if [ $? -ne 0 ];then
    current_link="gw1.gw1.gw1.gw1"
else
    current_link=`awk '{print $2}' /log.txt`
    rm /log.txt
fi
echo "Current link is $current_link"

#### Pinging target via first GW
route delete $TGT
route add -host $TGT $FRSTGW -static
ping -c 3 $TGT >/dev/null 2>&1
if [ $? -ne 0 ];then
    echo "Ping on first channel: [ BAD ]"
    frst_status=bad
else
    echo "Ping on first channel: [ OK ]"
    frst_status=good
fi
#### Pinging target via second GW
route delete $TGT
route add -host $TGT $SCNDGW -static
ping -c 3 $TGT >/dev/null 2>&1
if [ $? -ne 0 ];then
    echo "Ping on second channel: [ BAD ]"
    scnd_status=bad
else
    echo "Ping on second channel: [ OK ]"
    scnd_status=good
fi

#### Switching channel
#### All good
if [ "good" = $frst_status  -a "good" = $scnd_status -a $current_link = $FRSTGW ];then
    echo "All good."
exit
fi
if [ $current_link = $SCNDGW -a "bad" = $frst_status -a "good" = $scnd_status ];then
echo "First channel is still down =("
exit
fi
#### First channel is UP!
if [ "good" = $frst_status -a $current_link = $SCNDGW ];then
    echo First channel is UP now, switching. Current time `date`
    EXT=$FRST
    EXTGW=$FRSTGW
    EXTIF=$FRSTIF
    NATD="natd"
fi
#### If first channel is down
if [ "bad" = $frst_status  -a "good" = $scnd_status -a $current_link = $FRSTGW ];then
    echo First channel is going down, switching. Current time `date`
    EXT=$SCND
    EXTGW=$SCNDGW
    EXTIF=$SCNDIF
    NATD="8678"
fi
#### If both channels down
if [ "bad" = $frst_status  -a "bad" = $scnd_status ];then
    echo "Both channels down... How we can live without net?!?!?! "
    echo "I will try to find live channel again"
    echo `date`
exit
fi
route delete default 2>&1
route add default $EXTGW 2>&1
/sbin/ipfw -q flush
#генерим новые правила для ipfw
####### VARIABLES #######
ext=$EXTIF         #External interface
int="dc0"        #Internal Interface
intip="192.168.0.10"    #Internal IP
extip="$EXT"        #External IP
dnsfwd="193.138.70.2"    #Forward DNS server
fw="/sbin/ipfw"        #Path to IPFW
echo $ext "is an external interface"
echo $int "is an internal interface"
echo "Applying IPFW settings"
####### GLOBAL RULES #######
## Allow rules
${fw} add 20000 allow icmp from $intip/24 to any via $int #Allow ping requests from intranet
## Deny rules
${fw} add 40000 deny ip from $intip/24 to $extip via $int
# ну и далее как вам нужно . . . . .
##NATD
#Главное не забыть вот это ! ! !
${fw} add 60000 divert $NATD ip from any to any via $ext #Enable natd
#В запуск системы поставить два natd –
#natd –s –n if0
#natd –s –p 8678 if1

.......................................................................
Поставил этот скрипт в крон на каждые пять минут
*/5 * * * 1-7 root //usr/local/etc/cron-scripts/switch.sh

В принципе, могу порекомендовать удалить все эхо про пинг и прочее типа "Done" и оставить только в случе переключения а то кроновские репорты достанут =)
Не судите строго сей скрипт - он у меня первенький =), но факт что работает...


"Пример скрипта для переключения выделенок, при падении. (lea..."
Отправлено Jury Danilov , 08-Дек-04 20:08 
>Не судите строго сей скрипт - он у меня первенький =), но
>факт что работает...

Работает, говоришь... :-)
а попробуй выдерни из второй карты провод и подожди 5 мин...

у тебя и работающий ляжет...

...Подсказка

route delete default 2>&1
route add default $EXTGW 2>&1

Этот случай в if не попадает, поэтому переменная $EXTGW , которая там определяется остается неопределенной
default удаляется, а нового то и нету...


"Пример скрипта для переключения выделенок, при падении. (lea..."
Отправлено CHe , 10-Фев-10 12:15 
подскажите плиз, что если основной шлюз
#роутер основного пройдера
ISP1="xxx.xxx.xxx.xxx"  
может измениться, как нужно написать скрипт, что бы он автоматом менялся и в скрипте?