05.10.2008

Автоматизация проверки доступности сети

Друг попросил помочь решить проблему с автоматизацией проверки доступности подсети.

Суть проверки сводилась к тому, что с одного хоста, выступающего в качестве организатора vpn с подсетью предприятия, обычным пингом проверялся заведомо рабочий хост из сети предприятия. Надо было это автоматизировать, а в случае отсутствия доступа к сети, в данном конкретном случае, надо было рестартануть pptpd.

Решение выглядит так:

#!/bin/bash

ip="192.168.4.254"
count=3
attempt=3
file="./time"

result=$(ping -c ${count} ${ip} | tail -2 | head -1 | awk '{print $4}')

if [ $result -eq 0 ]; then
if [ -f ${file} ]; then
f=$(cat ${file})
if [ ${f} -eq ${attempt} ]; then
rm ${file}
/etc/init.d/pptpd restart
else
att=$(expr ${f} + 1)
fi
else
att=1
fi

if [ ! -z ${att} ]; then
echo ${att} > ${file}
fi
else
if [ -f ${file} ]; then
rm ${file}
fi
fi

Что делает этот скрипт? Рассмотрим подробнее:

1. Переменные:
* ip - ip-адрес хоста, который будем пинговать
* count - количество пакетов, отсылаемых ping'ом
* attempt - количество безуспешных попыток "достучаться" до хоста
* file - полное имя файла, в котором будет храниться количество безуспешных попыток
* result - количество пакетов, прошедших в результате выполнения ping
2. Логика:
1. $result -eq 0 - если не вернулось ни одного пакета, значит, связи нет и надо это дело обработать:
1. -f ${file} - файл есть (не впервые обнаруживаем отсутствие связи), считаем значение количества попыток из файла (f=$(cat ${file})):
1. Если количество попыток ещё не равно заданному допустимому значению, увеличиваем количество попыток и значение помещаем в переменную (att=$(expr ${f} + 1));
2. Если количество попыток уже равно заданному допустимому значению (${f} -eq ${attempt}), удаляем файл и выполняем необходимую команду или скрипт (/etc/init.d/pptpd restart);
2. Если файла нет (значит это первая попытка обнаружившая пропажу связи), поместим значение 1 в переменную для использования в дальнейшем и будем знать, что один раз уже было :)
3. Если есть хоть какое-то непустое значение переменной (! -z ${att}), поместим его в файл (echo ${att} > ${file})
2. если связь есть или она появилась с момента последней проверки и присутствует файл, файл надо удалить

Источник: http://www.f-notes.info