Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

ИО Капитана Очевидности


Contributor


Сообщения: 5387
Благодарности: 1105

Профиль | Отправить PM | Цитировать


PhilB, спасибо. Правда, во второй строке была небольшая ошибка, вызванная использованием символа '/' для разделения цифр. Пришлось добавить дополнительную замену

В общем, получилось следующее
читать дальше »
Код: Выделить весь код
#!/bin/bash

# Адрес маршрутизатора второго канала связи
gateway=192.168.1.254
# Адрес маршрутизатора второго провайдера
provider=*.*.*.*
# Адрес сервера в сети интернет, по которому проводится проверка
testserver=8.8.8.8
# Максимально допустимое время прохождения сигнала по второму каналу (в микросекундах)
maxpingtime=500000
# Максимально допустимый процент потери пакетов
maxpinglost=50
# Количество пакетов, используемых для проверки прохождения сигнала
countping=10
# Имя временного файла, в который выводятся результаты проверки (создаётся на RAM-диске)
testpingfile=/tmp/ramdrive/testping
# Имя временного файла, наличие которого означает изменение маршрутов (создаётся на RAM-диске)
usingroutesfile=/tmp/ramdrive/chroutelock
# Имя файла протокола переключения маршрутов
logfile=/var/log/chroute.log
# Флаг хорошей связи (пустое значение означает ложность)
goodlink=
# Файл списка сайтов, работа с которыми будет выполняться по дополнительному каналу (автоматически создаётся при необходимости)
newfilehostlist=/etc/chroute/hosts.lst
[ -a $newfilehostlist ] || touch $newfilehostlist
# Копия файла списка сайтов на RAM-диске (автоматически создаётся при необходимости)
oldfilehostlist=/tmp/ramdrive/chroutehosts.lst
[ -a $oldfilehostlist ] || touch $oldfilehostlist
# Список новых сайтов
newhostlist=$(cat $newfilehostlist | grep -v \#)
# Список действующих сайтов
hostlist=$(cat $oldfilehostlist | grep -v \#)
echo $newhostlist
echo $hostlist

## Функция проверки качества линии связи
testroute()
{
   route add -host $testserver gw $gateway metric 1
   ping $testserver -c $countping | tee $testpingfile 2>&1
   route del -host $testserver
   testpinglost=$(grep "packets transmitted" $testpingfile | sed 's/[^0-9 ]//g;q' | awk '{print $3;}')
   testpingtime=$(grep "rtt min/avg/max/mdev" $testpingfile | sed 's%\/%\ %g' | sed 's/[^0-9 ]//g;q' | awk '{print $2;}' )
   if [[ $testpinglost -gt $maxpinglost ]]
   then
      echo "Обнаружено $testpinglost потерянных пакетов, связь по данному каналу неустойчива"
   elif [[ $testpingtime -gt $maxpingtime ]]
   then
      echo "Время прохождения пакетов по данному каналу $testpingtime превышает разрешённое $maxpingtime"
   else
      goodlink=true
      echo "Канал связи работает"
   fi
}

## Функция добавления маршрутов по списку $hostlist
addroutes()
{
   for hostname in $hostlist
   do
      echo "Добавляется маршрут к $hostname"
      route add -host $hostname gw $gateway metric 1
   done
   touch $usingroutesfile
}

## Функция удаления маршрутов по списку $hostlist
delroutes()
{
   for hostname in $hostlist
   do
      echo "Удаляется маршрут к $hostname"
      route delete -host $hostname
   done
   rm $usingroutesfile
}

## Функция обновления маршрутов
syncroutes()
{
# Если связь была хорошая, то удалить старые маршруты
   [ -a $usingroutesfile ] && delroutes
# Обновить список маршрутов (во временном файле и в памяти)
   if [ -a $newfilehostlist ]
   then
      cp $newfilehostlist $oldfilehostlist
   else
      rm $oldfilehostlist
   fi
   hostlist=$newhostlist
# Если связь хорошая, то добавить новые маршруты
   [ $goodlink ] && addroutes
}

## Основной код программы

# добавляется маршрут до узла провайдера (при необходимости)
[[ $( route -n | grep $provider | wc -l ) > 0 ]] || route add -host $provider gw $gateway metric 1

testroute
if [[ "$hostlist" != "$newhostlist" ]]
then
   echo $(date +%F\ %T)": Изменён файл списка сайтов, производится обновление маршрутов" | tee -a $logfile
   syncroutes
elif [[ $goodlink  &&  ! -a $usingroutesfile ]]
then   
   echo $(date +%F\ %T)": Связь по дополнительному каналу работает, производится добавление маршрутов" | tee -a $logfile
   addroutes
elif [[ ! $goodlink && -a $usingroutesfile ]]
then
   echo $(date +%F\ %T)": Проблемы связи по дополнительному каналу, производится удаление маршрутов" | tee -a $logfile
    delroutes
fi

exit


Если кто найдёт и поможет исправить ошибку, буду очень признателен.
Желающим использовать этот скрипт в работе, использование и дальнейшую модификацию разрешаю

-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)

Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:06, 20-10-2011 | #3