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