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