Admin
Регистрация: 01.12.2005
Проживание: Москва
Сообщения: 69
|
Раздупляем openvpn или как писать скрипты под линукс
Итак я налабал скрипт который проверяет работтоспособность впн и в случае отсуцтвия онной перезапускает этот самый впн
vpns="192.168.7.1/openvpn_tracker 192.168.1.17/openvpn_mpk"
for d in $vpns
do
host=`echo $d |cut -d/ -f1`
script_name=`echo $d |cut -d/ -f2`
#echo $host
#echo $script_name
r=`ping -c1 $host |grep transmitted | awk '{print(\$4)}'`
str=`route -n|grep $host |sed q1`
lll=`expr length "$str"`
if [ $r -ne 1 ] || [ $lll -lt 1 ]; then
echo "restarting $script_name"
kil=`ps -ef |grep $script_name |grep -v grep | awk '{print(\$2)}'`
#echo $kil
lll=`expr length "$kil"`
[ $lll -gt 1 ] && kill $kil
/etc/init.d/$script_name zap
/etc/init.d/$script_name start
fi
done
|
Admin
Регистрация: 01.12.2005
Проживание: Москва
Сообщения: 69
|
Раздупляем openvpn или как писать скрипты под линукс
ну а теперь по пунктам
vpns="192.168.7.1/openvpn_tracker 192.168.1.17/openvpn_mpk"
присваеваем переменной список того что нам надо проверить, причем слешем у нас разделены хост на той стороне и название срипта у нас.
for d in $vpns
do
цикл в переменную d попадают строчки разделенные пробелом
host=`echo $d |cut -d/ -f1`
в переменную хост берем то что в d до черты, обратите внимание на кавычки, это специальные кавычки находящиеся на букве Ё которые заставляют инепритатор выполнить скрипт.
r=`ping -c1 $host |grep transmitted | awk '{print(\$4)}'`
в этой конструкции мы пингуем одним пакетом хост, потом грепаем только строку где должны быть результаты потом берем 4 поле из расчета что разделитель пробел, там по идеи у нас должно быть сколько пакетом принято.
str=`route -n|grep $host |sed q1`
сдесь я навсякий пожарный поставил проверку роутинга, местатми у нас есть впн-ны напрямую и впн общей сети, пинг может уйти по большому кругу если нет прямого роутинга, ладно теперь конкретика
route -n возвращает список маршрутов, отрезаем только те строки где есть наш хост, sed q1 отберет только первую строку из выборки
lll=`expr length "$str"`
измерение длины строки str где у нас строка роутинга
if [ $r -ne 1 ] || [ $lll -lt 1 ]; then
проверка условий, дословно здесь написанно если r(где у нас пакетов принято) не равно 1 или lll(где у нас длина строки роутинга, а еслироутинга нет то она равна 0) меньше 1 тогда
kil=`ps -ef |grep $script_name |grep -v grep | awk '{print(\$2)}'`
ps -ef - возвращает список процессов
grep $script_name - отрезает только те строки что содержат $script_name
grep -v grep - исключит строки где есть grep
awk '{print(\$2)} - возьмет второе поле ввыборке гдеу нас пид выполняемого процесса
|