Advertisement
Guest User

Untitled

a guest
May 23rd, 2016
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 7.19 KB | None | 0 0
  1. #!/bin/sh
  2.  
  3. # Указываем путь к log-файлу
  4. log="/var/log/routing.log"
  5.  
  6. # Задаем периодичность опроса шлюзов.
  7. # 30s - 30 секунд
  8. # 10m - 10 минут
  9. # 1h - 1 час
  10. check_period="60s"
  11.  
  12. # Если log-файл не найден, создаем его, иначе отчищаем
  13. clear_log ()
  14. {
  15. if [ ! -f ${log} ]
  16. then
  17.     touch ${log}
  18. else
  19.     cat /dev/null > ${log}
  20. fi
  21. }
  22.  
  23. # Инициализируем переменные
  24. init ()
  25. {
  26.     gw1=$(/usr/sbin/ip ro li dev enp1s6 | grep "default" | head -n 1 | cut -d " " -f 3 | cut -d / -f 1)
  27.     gw2="10.0.0.1"
  28.     prefered_gw=${gw1}
  29.  
  30.     dev_if1="enp1s6"
  31.     dev_if2="enp0s2f1u1"
  32.  
  33.     if1=$(/usr/sbin/ip ad li ${dev_if1} | grep "inet" | grep "brd" | awk '{print $2}' | cut -d / -f 1)
  34. #`ifconfig ${dev_if1} | awk -F ' *|:' '/inet addr/{print $4}'`
  35.     if2=$(/usr/sbin/ip ad li ${dev_if2} | grep "inet" | grep "/24" | awk '{print $2}' | cut -d / -f 1)
  36. #`ifconfig ${dev_if2} | awk -F ' *|:' '/inet addr/{print $4}'`
  37.  
  38. # Текущие статусы шлюзов: 0 - шлюз недоступен, 1 - шлюз работает
  39.     gw1_curr_status=0
  40.     gw2_curr_status=0
  41.  
  42. # Текущие потери пакетов на шлюзе
  43.     gw1_curr_packet_loss=0
  44.     gw2_curr_packet_loss=0
  45.  
  46. # Максимальный процент потерь пакетов, при превышении данного числа, шлюз считается недоступным
  47.     gw1_max_packet_loss=99
  48.     gw2_max_packet_loss=90
  49.  
  50. # не Отчищаем log-файл и сохраняем значения основных переменных
  51.     #clear_log
  52.     echo `date +"%Y.%m.%d %T"`." Init environment OK. Check gateways status every ${check_period}." >> ${log}
  53.     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}
  54. }
  55.  
  56. # Данная функция определяет текущее состояние каждого из шлюзов.
  57. # Если текущий процент потерь меньше максимально допустимого, то считаем, что шлюз доступен.
  58. get_current_status ()
  59. {
  60.     echo `date +"%Y.%m.%d %T"`." Get current status ISP gateways." >> ${log}
  61.     if1=$(/usr/sbin/ip ad li ${dev_if1} | grep "inet" | grep "brd" | awk '{print $2}' | cut -d / -f 1)
  62.     gw1=$(/usr/sbin/ip ro li dev enp1s6 | grep "default" | head -n 1 | cut -d " " -f 3 | cut -d / -f 1)
  63.     prefered_gw=${gw1}
  64.  
  65. # Get current status default gateway ISP1
  66.     if [ ! "$gw1" ]
  67.     then
  68.         gw1=1.1.1.1
  69.         if1=0.0.0.0
  70.         prefered_gw=1.1.1.1
  71.     fi
  72.  
  73.     gw1_curr_packet_loss=`ping -I ${dev_if1} -c40 -l10 -q -W3 ${gw1} | grep loss | awk '{print $(NF-4)}' | cut -d"%" -f1`
  74.     if [ ${gw1_curr_packet_loss} -le ${gw1_max_packet_loss} ]
  75.     then
  76.         echo `date +"%Y.%m.%d %T"`. "ISP1. [STATUS - OK]. Current packet loss on ${gw1} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
  77.         gw1_curr_status=1
  78.     else
  79.         echo `date +"%Y.%m.%d %T"`. "ISP1. [STATUS - CRITICAL]. Current packet loss on ${gw1} via ${dev_if1} is ${gw1_curr_packet_loss}%." >> ${log}
  80.         gw1_curr_status=0
  81.     fi
  82.  
  83. # Get current status default gateway ISP2
  84.     gw2_curr_packet_loss=`ping -I ${dev_if2} -c20 -l20 -q -W3 ${gw2} | grep loss | awk '{print $(NF-4)}' | cut -d"%" -f1`
  85.     if [ ${gw2_curr_packet_loss} -le ${gw2_max_packet_loss} ]
  86.     then
  87.         echo `date +"%Y.%m.%d %T"`. "ISP2. [STATUS - OK]. Current packet loss on ${gw2} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
  88.         gw2_curr_status=1
  89.     else
  90.         echo `date +"%Y.%m.%d %T"`. "ISP2. [STATUS - CRITICAL]. Current packet loss on ${gw2} via ${dev_if2} is ${gw2_curr_packet_loss}%." >> ${log}
  91.         gw2_curr_status=0
  92.     fi
  93. }
  94.  
  95. # Данная функция проиводит переключение шлюза по умолчанию в зависимости от результатов полученных в get_current_status ()
  96. # На данный момент предпочитаемым шлюзом может быть только ${gw1}
  97. switch_default_gw ()
  98. {
  99.     curr_gw=`/sbin/ip route show | grep default | grep 100 | awk '{print $3}'`
  100.     #echo `date +"%Y.%m.%d %T"`. "${curr_gw} - ${prefered_gw} - ${gw1_curr_status} " >> ${log}
  101.  
  102.     if [ ${curr_gw} = ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
  103.     then
  104.         echo `date +"%Y.%m.%d %T"`. "[STATUS - OK]. Current default gateway is prefered and running up. Nothing to do." >> ${log}
  105.         return
  106.     fi
  107.  
  108.     if [ ${curr_gw} = ${prefered_gw} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
  109.     then
  110.         echo `date +"%Y.%m.%d %T"`. "Prefered gw ${gw1} is down. Change default gw to ${gw2}" >> ${log}
  111.         echo `date +"%Y.%m.%d %T"`. "ip route replace default via ${gw2} dev ${dev_if2}" >> ${log}
  112.         /sbin/ip ro del default metric 100
  113.         /sbin/ip route add default via ${gw2} dev ${dev_if2} metric 100
  114.         /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
  115.         return
  116.     fi
  117.  
  118.     if [ ${curr_gw} != ${prefered_gw} -a ${gw1_curr_status} -eq 1 ]
  119.     then
  120.         echo `date +"%Y.%m.%d %T"`. "Prefered gw ${prefered_gw} is running up now. Change default gw ${curr_gw} to prefered ${prefered_gw}" >> ${log}
  121.         echo `date +"%Y.%m.%d %T"`. "ip route replace default via ${gw1} dev ${dev_if1}" >> ${log}
  122.         /sbin/ip ro del default metric 100
  123.         /sbin/ip route add default via ${gw1} dev ${dev_if1} metric 100
  124.         /sbin/ip ro del default metric 101
  125.         /sbin/ip route add default via ${gw2} dev ${dev_if2} metric 101
  126.         /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
  127.         return
  128.     fi
  129.  
  130.     if [ ${curr_gw} != ${prefered_gw} -a ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 1 ]
  131.     then
  132.         echo `date +"%Y.%m.%d %T"`. "Prefered gw ${prefered_gw} is still down. Current default gw is ${gw2}" >> ${log}
  133.         /usr/sbin/ifdown enp1s6
  134.         /usr/sbin/ifup enp1s6
  135.         return
  136.     fi
  137.  
  138.     if [ ${gw1_curr_status} -eq 0 -a ${gw2_curr_status} -eq 0 ]
  139.     then
  140.         echo "*************************************************************************" >> ${log}
  141.         echo `date +"%Y.%m.%d %T"`. "CRITICAL. Two gateways is down. Try again later." >> ${log}
  142.         echo "*************************************************************************" >> ${log}
  143.         return
  144.     fi
  145. }
  146.  
  147. # Инициализируем переменные
  148. init
  149.  
  150. # "Заходим" в вечный цикл, в котором по очереди вызываем функции get_current_status () и switch_default_gw ()
  151. # После этого делаем паузу, время паузы задается в переменной ${check_period}
  152. while [ 1 ]
  153. do
  154.     get_current_status
  155.     switch_default_gw
  156.     sleep ${check_period}
  157. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement