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

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

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


Contributor


Сообщения: 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