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

Сообщения: 5387
Благодарности: 1105
|
Профиль
|
Отправить PM
| Цитировать
Итак, предлагаю вашему вниманию исправленную и доработанную версию скрипта, который автоматически переключает маршруты к определённым сайтам. Распространение приветсвуется
читать дальше »
Код: 
#!/bin/bash
# Адрес маршрутизатора второго канала связи
gateway=192.168.1.254
# Адрес маршрутизатора второго провайдера
provider=x.x.x.x
# Адрес сервера в сети интернет, по которому проводится проверка
testserver=8.8.8.8
# Максимально допустимое время прохождения сигнала по второму каналу (в микросекундах)
maxpingtime=1000000
# Максимально допустимый процент потери пакетов
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" производится поиск имени хоста среди списка имён.
# Список имён формируется в процессе обратной расшифровки адресов в имена.
# Если в результате обратной расшифровки возвращается имя, отличное от исходного,
# то команда удаления найти маршрут по исходному имени не может
# Посему приходится сначала определять IP-адрес по имени сайта, а потом удалять маршрут по этому IP-адресу
ip=$(ping $hostname -c 1 | head -n 1 | sed '/[^(]*(\([^ ]*\)).*/s//\1/g')
echo "Для сайта $hostname IP-адрес равен $ip"
route del -host $ip
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)": Изменён файл списка сайтов, производится обновление маршрутов" >> $logfile
syncroutes
# Если связь хорошая и нет файла-флага добавленных маршрутов
elif [[ $goodlink && ( ! -a $usingroutesfile ) ]]
then
echo $(date +%F\ %T)": Связь по дополнительному каналу работает, производится добавление маршрутов" >> $logfile
addroutes
# Если связь плохая и есть флаг-файл добавленных маршрутов
elif [[ ! $goodlink && ( -a $usingroutesfile ) ]]
then
echo $(date +%F\ %T)": Проблемы связи по дополнительному каналу, производится удаление маршрутов" >> $logfile
delroutes
fi
# Комбинации состояний "связь хорошая, маршруты уже добавлены" и "связь плохая, маршруты уже удалены" действий не требуют
exit
Монтирование RAM-диска производится через файл /etc/fstab
Код: 
tmpfs /tmp/ramdrive tmpfs nosuid,nodev,noatime,nodiratime 0 0
|
-------
Самое совершенное оружие, которым забиты арсеналы богатых и процветающих наций, может легко уничтожить необразованного, больного, бедного и голодного. Но оно не может уничтожить невежество, болезнь, нищету и голод. (Фидель Кастро)
Почему всех осужденных за измену Родине при Сталине реабилитировали при Горбачёве по отсутствию состава преступления? Потому что при Горбачёве измену Родине перестали считать преступлением.
Отправлено: 03:38, 03-11-2011
| #6
|