Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- # Указываем путь к log-файлу
- log="/var/log/routing.log"
- # Задаем периодичность опроса шлюзов.
- # 30s - 30 секунд
- # 10m - 10 минут
- # 1h - 1 час
- check_period="60s"
- # Если log-файл не найден, создаем его, иначе отчищаем
- clear_log ()
- {
- if [ ! -f ${log} ]
- then
- touch ${log}
- else
- cat /dev/null > ${log}
- fi
- }
- # Инициализируем переменные
- init ()
- {
- gw1=$(/usr/sbin/ip ro li dev enp1s6 | grep "default" | head -n 1 | cut -d " " -f 3 | cut -d / -f 1)
- gw2="10.0.0.1"
- prefered_gw=${gw1}
- dev_if1="enp1s6"
- dev_if2="enp0s2f1u1"
- if1=$(/usr/sbin/ip ad li ${dev_if1} | grep "inet" | grep "brd" | awk '{print $2}' | cut -d / -f 1)
- #`ifconfig ${dev_if1} | awk -F ' *|:' '/inet addr/{print $4}'`
- if2=$(/usr/sbin/ip ad li ${dev_if2} | grep "inet" | grep "/24" | awk '{print $2}' | cut -d / -f 1)
- #`ifconfig ${dev_if2} | awk -F ' *|:' '/inet addr/{print $4}'`
- # Текущие статусы шлюзов: 0 - шлюз недоступен, 1 - шлюз работает
- gw1_curr_status=0
- gw2_curr_status=0
- # Текущие потери пакетов на шлюзе
- gw1_curr_packet_loss=0
- gw2_curr_packet_loss=0
- # Максимальный процент потерь пакетов, при превышении данного числа, шлюз считается недоступным
- gw1_max_packet_loss=99
- gw2_max_packet_loss=90
- # не Отчищаем log-файл и сохраняем значения основных переменных
- #clear_log
- echo `date +"%Y.%m.%d %T"`." Init environment OK. Check gateways status every ${check_period}." >> ${log}
- echo `date +"%Y.%m.%d %T"`." ISP1 [if1=${if1}, dev_if1=${dev_if1}, gw1=${gw1}], ISP2 [if2=${if2}, dev_if2=${dev_if2}, gw2=${gw2}]" >> ${log}
- }
- # Данная функция определяет текущее состояние каждого из шлюзов.
- # Если текущий процент потерь меньше максимально допустимого, то считаем, что шлюз доступен.
- get_current_status ()
- {
- echo `date +"%Y.%m.%d %T"`." Get current status ISP gateways." >> ${log}
- if1=$(/usr/sbin/ip ad li ${dev_if1} | grep "inet" | grep "brd" | awk '{print $2}' | cut -d / -f 1)
- gw1=$(/usr/sbin/ip ro li dev enp1s6 | grep "default" | head -n 1 | cut -d " " -f 3 | cut -d / -f 1)
- prefered_gw=${gw1}
- # Get current status default gateway ISP1
- if [ ! "$gw1" ]
- then
- gw1=1.1.1.1
- if1=0.0.0.0
- prefered_gw=1.1.1.1
- fi
- gw1_curr_packet_loss=`ping -I ${dev_if1} -c40 -l10 -q -W3 ${gw1} | grep loss | awk '{print $(NF-4)}' | cut -d"%" -f1`
- if [ ${gw1_curr_packet_loss} -le ${gw1_max_packet_loss} ]
- then
- echo `date +"%Y.%m.%d %T"`. "ISP1. [STATUS - OK]. Current packet loss on ${gw1} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
- gw1_curr_status=1
- else
- echo `date +"%Y.%m.%d %T"`. "ISP1. [STATUS - CRITICAL]. Current packet loss on ${gw1} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
- gw1_curr_status=0
- fi
- # Get current status default gateway ISP2
- gw2_curr_packet_loss=`ping -I ${dev_if2} -c20 -l20 -q -W3 ${gw2} | grep loss | awk '{print $(NF-4)}' | cut -d"%" -f1`
- if [ ${gw2_curr_packet_loss} -le ${gw2_max_packet_loss} ]
- then
- echo `date +"%Y.%m.%d %T"`. "ISP2. [STATUS - OK]. Current packet loss on ${gw2} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
- gw2_curr_status=1
- else
- echo `date +"%Y.%m.%d %T"`. "ISP2. [STATUS - CRITICAL]. Current packet loss on ${gw2} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
- gw2_curr_status=0
- fi
- }
- # Данная функция проиводит переключение шлюза по умолчанию в зависимости от результатов полученных в get_current_status ()
- # На данный момент предпочитаемым шлюзом может быть только ${gw1}
- switch_default_gw ()
- {
- curr_gw=`/sbin/ip route show | grep default | grep 100 | awk '{print $3}'`
- #echo `date +"%Y.%m.%d %T"`. "${curr_gw} - ${prefered_gw} - ${gw1_curr_status} " >> ${log}
- if [ ${curr_gw} = ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
- then
- echo `date +"%Y.%m.%d %T"`. "[STATUS - OK]. Current default gateway is prefered and running up. Nothing to do." >> ${log}
- return
- fi
- if [ ${curr_gw} = ${prefered_gw} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
- then
- echo `date +"%Y.%m.%d %T"`. "Prefered gw ${gw1} is down. Change default gw to ${gw2}" >> ${log}
- echo `date +"%Y.%m.%d %T"`. "ip route replace default via ${gw2} dev ${dev_if2}" >> ${log}
- /sbin/ip ro del default metric 100
- /sbin/ip route add default via ${gw2} dev ${dev_if2} metric 100
- /root/sendemail/sendEmail -f 111@pochta.ru -t 111@gmail.com -u "SKY IS DEAD" -m "Prefered gw ${gw1} is down. Change default gw to ${gw2}" -s smtp.pochta.ru:2525 -xu 111@pochta.ru -xp password
- return
- fi
- if [ ${curr_gw} != ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
- then
- echo `date +"%Y.%m.%d %T"`. "Prefered gw ${prefered_gw} is running up now. Change default gw ${curr_gw} to prefered ${prefered_gw}" >> ${log}
- echo `date +"%Y.%m.%d %T"`. "ip route replace default via ${gw1} dev ${dev_if1}" >> ${log}
- /sbin/ip ro del default metric 100
- /sbin/ip route add default via ${gw1} dev ${dev_if1} metric 100
- /sbin/ip ro del default metric 101
- /sbin/ip route add default via ${gw2} dev ${dev_if2} metric 101
- /root/sendemail/sendEmail -f 111@pochta.ru -t 111@gmail.com -u "SKY IS BACK" -m "Prefered gw ${prefered_gw} is running up now. Change default gw ${curr_gw} to prefered ${prefered_gw}. Curren ip ${if1}." -s smtp.pochta.ru:2525 -xu 111@pochta.ru -xp password
- return
- fi
- if [ ${curr_gw} != ${prefered_gw} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
- then
- echo `date +"%Y.%m.%d %T"`. "Prefered gw ${prefered_gw} is still down. Current default gw is ${gw2}" >> ${log}
- /usr/sbin/ifdown enp1s6
- /usr/sbin/ifup enp1s6
- return
- fi
- if [ ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 ]
- then
- echo "*************************************************************************" >> ${log}
- echo `date +"%Y.%m.%d %T"`. "CRITICAL. Two gateways is down. Try again later." >> ${log}
- echo "*************************************************************************" >> ${log}
- return
- fi
- }
- # Инициализируем переменные
- init
- # "Заходим" в вечный цикл, в котором по очереди вызываем функции get_current_status () и switch_default_gw ()
- # После этого делаем паузу, время паузы задается в переменной ${check_period}
- while [ 1 ]
- do
- get_current_status
- switch_default_gw
- sleep ${check_period}
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement