Скрипт, заменяющий Wachdog

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Аватара пользователя
podarok66
Модератор
Сообщения: 4358
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

В течение некоторого времени я пытался использовать штатную утилиту Wachdog. Данная утилита пингует указанный при настройке IP-адрес и при отсутствии ответа выполняет перезагрузку роутера. Но далеко не всё в работе данной утилиты меня устраивало. Пинг лишь одного адреса, малая гибкость в настройках заставили меня искать другое решение. Большую часть кода подсказала статья на Хабрхабре (автору спасибо), добавлять пришлось лишь пару команд.
Итак создаю скрипт Ping_con :

Код: Выделить всё

#Задаём переменную, определяющую количество запросов на каждый адрес
:local PingCount 3

#Задаём локальные переменные - IP адреса для пинга. У меня второй адрес - внутренний адрес сервера провайдера.
:local Google 8.8.8.8
:local Iphome 10.201.10.1
:local mail  94.100.180.201

#Локальные переменные, содержащие количество удачных ответов на пинги. Интерфейс ether2 - у меня смотрит в интернет.
:local ResultGoogle [/ping count=$PingCount $Google interface=ether2]
:local ResultIphome [/ping count=$PingCount $Iphome interface=ether2]
:local ResultMail [/ping count=$PingCount $mail interface=ether2]

#Самое вкусное. Переменная MainIfInetOk - есть ложное утверждение. Далее изменяем его, подставляя сравнение.
#Сумма полученных удачных ответов должна быть не меньше 2/3 от общего числа запросов.
:local MainIfInetOk false;
:set MainIfInetOk (($ResultGoogle + $ResultIphome + $ResultMail) >= (2 * $PingCount))
:put "MainIfInetOk=$MainIfInetOk"

#Теперь делаем выводы на основании полученных вычислений.
if (!$MainIfInetOk) do={
/log error "Bad connect"
/system reboot
}
if ($MainIfInetOk) do={
/log info "Connect OK"
}



В шедулере создаю две новых записи.
Первая Ping:

Код: Выделить всё

/system script run Ping_con



Исполнение каждые 5 минут, начало исполнения startup, состояние в начале тестирования disable
Вторая Time:

Код: Выделить всё

:delay 100;
/system scheduler disable Ping
:delay 3500;
/system scheduler enable Ping


Исполнение по нулям, пусть запускается единожды, начало исполнения startup, состояние в начале тестирования enable.

После перезагрузки запускается Time, который ждет один час, потом запускает шедулер Ping, запускающий скрипт Ping_con. Теперь проверка будет выполнятся каждые 5 минут. Если интернет пропадет, скрипт даст команду на перезагрузку. После перезагрузки начнет отрабатывать шедулер Time и цикл повторится. На время тестирования в скрипте Ping_con строку

Код: Выделить всё

/system reboot
можно закоментировать, ориентируясь в работе скрипта по логу. После наладки можно закоментировать строку

Код: Выделить всё

/log info "Connect OK"
, а строку

Код: Выделить всё

/system reboot
раскоментировать.

Такой подход позволяет перезагрузить устройство при обрыве связи с внешним миром в течение 5 минут, но не дергать его перезагрузкой каждые 5 минут, если провайдер временно отключил соединение с сетью.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
винчестер
Сообщения: 3
Зарегистрирован: 08 авг 2013, 18:42

не могу понять как его прописать ! Может кто подскажет ?


Аватара пользователя
podarok66
Модератор
Сообщения: 4358
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

В смысле? Как все скрипты.
System=>Scripts там на плюсик и вставляем в окно тело скрипта, чекбоксы должны стоять все, поле Name заполняем Ping_con
System=>Scheduler там тоже на плюсик и создаем запись Ping, как описывал. Потом еще плюсик и вторую запись Time.
При старте системы срабатывает Time (эта запись срабатывает единожды за цикл) , временно останавливает запись Ping, по истечение часа он ее запускает. Теперь зпись Ping будет запускать скрипт Ping_con каждые пять минут, пока не оборвется интернет-соединение. При обрыве интернет-соединения скрипт запустит перезагрузку системы. И цикл повторится заново.
Вообще, данный скрипт не панацея, он сидит на ресурсах роутера и при зависании системы не может заменить Wachdog. Всё-таки хардварная утилита в этих случаях понадежнее должна срабатывать. Этот скрипт обязан своим рождение тому обстоятельству, что у меня Wachdog весьма и весьма капризно работает и иногда живет своей жизнью. Поэтому я и сподвигнулся на эти эксперименты.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
BLOODER
Сообщения: 156
Зарегистрирован: 02 окт 2013, 18:38
Откуда: г.Краснодар
Контактная информация:

скрипт подкорректировал, /system reboot закоментировал, запустил а в лог фаиле ничего нет совсем про исполнение его ??? почему??? :? может где то поднакосячил??

Код: Выделить всё

:local PingCount 3
:local google 8.8.8.8
:local yandex 77.88.8.8
:local mail 94.100.180.201
:local ResultGoogle [/ping count=$PingCount $Google interface=ether1]
:local Resultyandex [/ping count=$PingCount $ yandex interface=ether1]
:local ResultMail [/ping count=$PingCount $mail interface=ether1]
:local MainIfInetOk false;
:set MainIfInetOk (($ResultGoogle + $Result yandex + $ResultMail) >= (2 * $PingCount))
:put "MainIfInetOk=$MainIfInetOk"
if (!$MainIfInetOk) do={
/log error "Bad connect"
#/system reboot
}
if ($MainIfInetOk) do={
/log info "Connect OK"
}




и как задать время чтоб он запускался не через час а через 5 минут после включения я так понимаю надо в Time

Код: Выделить всё

 :delay 100;
/system scheduler disable Ping
:delay 3500;
/system scheduler enable Ping
надо поменять на
:delay 100;
/system scheduler disable Ping
:delay (150 к примеру???);
/system scheduler enable Ping


Аватара пользователя
BLOODER
Сообщения: 156
Зарегистрирован: 02 окт 2013, 18:38
Откуда: г.Краснодар
Контактная информация:

о))) скрипт заработал!!! оказалось что были лишние пробелы и одна буква вместо английской русская :D

Код: Выделить всё

:local PingCount 3
:local google 8.8.8.8
:local yandex 77.88.8.8
:local mail  94.100.180.201
:local ResultGoogle [/ping count=$PingCount $Google interface=yota]
:local Resultyandex [/ping count=$PingCount $yandex interface=yota]
:local ResultMail [/ping count=$PingCount $mail interface=yota]
:local MainIfInetOk false;
:set MainIfInetOk (($ResultGoogle + $Resultyandex + $ResultMail) >= (2 * $PingCount))
:put "MainIfInetOk=$MainIfInetOk"
if (!$MainIfInetOk) do={
/log error "Bad connect"
#/system reboot
}
if ($MainIfInetOk) do={
/log info "Connect OK"
}

остается вопрос по времени запуска скрипта после старта???


Аватара пользователя
podarok66
Модератор
Сообщения: 4358
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Есть решение, вечерком обнародую, на работе никак. Над душой висят, змеи-тугарины, требуют исполнения договора работного :lol:


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
yreks
Сообщения: 47
Зарегистрирован: 07 авг 2013, 09:42

Watchdog, роутер начинает личную жизнь, иногда трудноуправляемую из-вне

К сожалению это правда ....У меня на RB450G тоже такая болезнь была... Микротик периодически делал ложные перезагрузки. При выключении Watchdog он все равно продолжал работать....
Сейчас у меня настроено так;
Первым запускается скрипт перезапуска интерфейса WAN, поставил периодичность проверки 5мин. Вторым - 12мин, поставил вышеописанный скрипт podarok66.
Решил все же оставить и Watchdog, только настроил его, что б он пинговал сам себя, 192.168.1.1 и увеличил время этого пинга.
Обычно до срабатывания Watchdog и не доходит...
Так сказать тройная защита.

P.s. Кстати и на RB750 такое наблюдалось.....


DES
Сообщения: 91
Зарегистрирован: 08 авг 2013, 21:12

У вас русские комменты в скриптах проходят ?
А зачем пинговать себя же? Какой в этом смысл?


RB750UP with Firmware:3.19 && RouterOS:6.23
Аватара пользователя
podarok66
Модератор
Сообщения: 4358
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Комменты для тех, кто не понимает, но хочет разобраться, как скрипт работает. В рабочем варианте на маршрутизаторе нет никаких, мне и так понятно, откуда и куда.
Мы же уже тут на форуме разбирались и выяснили, что если не проставить адрес пинга, Watchdog опрашивает сам себя и в случае зависания системы делает ребут. Потому и ценен...


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Аватара пользователя
podarok66
Модератор
Сообщения: 4358
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Теперь рассмотрим следующую ситуацию. Имеется подключение к провайдеру, изредка оно падает по каким-то причинам. Изредка провайдер проводит какие-то работы на линии. В обоих случаях, естественно пропадает интернет. У вас работает скрипт, проверяющий доступность каких-то узлов в сети с периодичностью например 5 минут, и перезагружающий роутер при отсутствии ответа от пингуемых узлов. Но...
Если интернет пропал по вине провайдера, глупый шедулер продолжит перезагружать роутер каждые 5 минут. Чего не хотелось бы. Да и вообще, по-моему мнению если перезагрузка не помогла в восстановлении линии, значит и не стоит пока скрипту отрабатывать, пусть подождет некоторое время. Счетчик тоже не очень хорошо запускать на целый час, если роутер и так занят раздачей интернета. Буду мудрить:
1. Создаю скрипт ping_time

Код: Выделить всё

:local deltaH 1;
:local deltaM 00;
:local deltaS 00;

:local MyTime1 ([:pick [/system clock get time] 0 2]+$deltaH);
:local MyTime2 ([:pick [/system clock get time] 3 5]+$deltaM);
:local MyTime3 ([:pick [/system clock get time] 6 8]+$deltaS);

:if ($MyTime3>="60")  do={ :set MyTime3 ($MyTime3 - 60); :set MyTime2 ($MyTime2 + 1);} else={:if ($MyTime3<"0") do={ :set MyTime3 ($MyTime3 + 60); :set MyTime2 ($MyTime2 + 1);}};

:if ($MyTime2>="60")  do={ :set MyTime2 ($MyTime2 - 60); :set MyTime1 ($MyTime1 + 1);} else={:if ($MyTime2<"0") do={ :set MyTime2 ($MyTime2 + 60); :set MyTime1 ($MyTime1 - 1);}};

:if ($MyTime1>="24")  do={ :set MyTime1 ($MyTime1 - 24)} else={:if ($MyTime1<"0") do={ :set MyTime1 ($MyTime1 + 24)}};


:local TimePlus  [:totime ($MyTime1.$Mysymbol.$MyTime2.$Mysymbol.$MyTime3)];
:log info $TimePlus;
:delay 10;
:local PingCount 3;
:local Globaltime1 93.180.6.3;
:local Globaltime2 194.33.191.69;
:local ResultGlobaltime1 [/ping count=$PingCount $Globaltime1 interface=WAN];
:local ResultGlobaltime2 [/ping count=$PingCount $Globaltime2 interface=WAN];
:if ($ResultGlobaltime1=0 && $ResultGlobaltime2=0) do={/log info "Global network no, start simple timer";
:delay 3600;
/system scheduler enable Ping;
} else={:local sche [/system scheduler find comment="Ping"];
/log info "Retrieved world time, start scheduler Ping in 1 hour.";
/system scheduler set $sche start-time=$TimePlus;
/system scheduler enable $sche};

2. Создаю скрипт ping_con

Код: Выделить всё

:local PingCount 3
:local google 8.8.8.8
:local yandex 77.88.8.8
:local mail  94.100.180.201
:local ResultGoogle [/ping count=$PingCount $Google interface=WAN]
:local Resultyandex [/ping count=$PingCount $yandex interface=WAN]
:local ResultMail [/ping count=$PingCount $mail interface=WAN]
:local MainIfInetOk false;
:set MainIfInetOk (($ResultGoogle + $Resultyandex + $ResultMail) >= (2 * $PingCount))
:put "MainIfInetOk=$MainIfInetOk"
if (!$MainIfInetOk) do={
/log error "Bad connect"
/system reboot
}
if ($MainIfInetOk) do={
#/log info "Connect OK"
}

3. Пишем шедулер Ping с интервалом 5 минут и реальным временем начала работы например Aug/01/2013 14:58:52:

Код: Выделить всё

/system script run Ping_con;

4. Пишем шедулер Time без интервала и началом работа startup:

Код: Выделить всё

:delay 100;
/system scheduler disable Ping;
/system script run ping_time;

Теперь после перезагрузки проверяется наличие связи с серверами времени, если нет связи, то запускается счетчик, если есть, то меняется время старта шедулера Ping. При любом раскладе скрипт ping_time стартует только после восстановления связи с интернетом и выставления правильного времени на роутере.
Заморочено, конечно, но так мысль пошла. Жуть самого брала, пока не выстроил всю схему.
P.S.: В скрипте ping_time время можно выставлять разное, подробнее в соседней теме описывал его.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Ответить