Добрый день, дорогие читатели! Вчера я обещал выложить скрипт мониторинга внешних ресурсов с оповещением, чем и займусь в этой статье.
Кто то из вас мог уже прочитать мою предыдущую статью, где я представил скрипт для роутеров MikroTik на базе RouterOS для мониторинга подключенного ПК и перезагрузки LAN порта в случае необходимости. Сегодня речь пойдет о мониторинге домашнего интернета и любого внешнего узла, например вашего сервера, причем с оповещением по СМС или в Телеграм.
Для начала рассмотрим скрипт по частям:
:global inetdown
:global vdsdown
:local checkdns [/ping 8.8.8.8 count=5]
:local checkvds [/ping 0.0.0.0 count=5]
:local time [/sys clock get time]
:local downsms "VDS+0.0.0.0+is+DOWN+$time"
:local upsms "VDS+0.0.0.0+is+UP+$time"
Здесь мы объявили глобальные переменные – IP публичного Google DNS, IP вашего сервера, время и шаблоны текстов для СМС. Для мониторинга интернета вы можете использовать любой DNS – просто замените IP. Также вам нужно заменить IP 0.0.0.0 на IP вашего сервера.
:if (checkdns = 0) do={
:if ($inetdown != true) do={
/log error "INTERNET is DOWN"
:set $inetdown true
}
Здесь пингуется DNS и если он недоступен, переменная отсутствия интернета принимает значение true и пишется запись в лог.
else={
:if ($inetdown = true) do={
/log warning "INTERNET is UP"
:set $inetdown false
}
Далее, если пинг DNS успешено, но до этого не был успешен, переменная изменяет значение и делается запись в лог INTERNET is UP.
:if (checkvds = 0) do={
:if ($vdsdown != true) do={
/log error "VDS 0.0.0.0 is DOWN"
/tool fetch url="http://sms.ru/sms/send?api_id=YOUR_API_KEY&to=79012345678&text=$downsms" keep-result=no
:set $vdsdown true
}
}
В коде выше начинается самое интересное – если DNS доступны, т.е. интернет есть, но ваш сервер не пингуется, то в лог пишется сообщение, а вам отправляется СМС. Здесь вам нужно заменить 0.0.0.0 на IP вашего сервера, YOUR_API_KEY на ваш API ключ на сайте SMS.RU и 79012345678 на ваш номер телефона. После регистрации на сайте SMS.RU вы получите свой API ключ и сможете бесплатно отправлять 5 СМС в день на свой номер телефона (тот, который использовали для регистрации). Очень полезный сервис.
Кстати строка текста сообщения не поддерживает пробелы, так что в переменных downsms и upsms используйте знак “+” вместо пробела, как показано в коде моего скрипта. При этом на телефон вам будет приходить СМС с пробелами, вместо знака “+”.
else={
:if ($vdsdown = true) do={
/log warning "VDS 0.0.0.0 is UP"
/tool fetch url="http://sms.ru/sms/send?api_id=YOUR_API+KEY&to=79012345678&text=$upsms" keep-result=no
:set $vdsdown false
}
В последней части кода, если ваш сервер был недоступен (глобальная переменная помнит об этом), но снова стал пинговаться, отправляется СМС на ваш номер с оповещением об этом событии. Что тут нужно заменить вы уже знаете.
Для использования оповещения в Телеграм вместо СМС, вам просто необходимо создать бота, получить chat_id с вашим аккаунтом и вместо запроса к API сервиса SMS.RU прописать запрос к API Телеграм бота:
/tool fetch url=”https://api.telegram.org/bot153358077:AAF4qYdUNIcWfp-SLtduVR18DuzqtXwEQAs/sendMessage?chat_id=-175202495&text=VDS_0.0.0.0_is_DOWN”
Более детально процесс создания бота в Телеграм для использования в роутерах Микротик описан в этой статье.
Полный текст скрипта:
:global inetdown
:global vdsdown
:local checkdns [/ping 8.8.8.8 count=5]
:local checkvds [/ping 0.0.0.0 count=5]
:local time [/sys clock get time]
:local downsms "VDS+0.0.0.0+is+DOWN+$time"
:local upsms "VDS+0.0.0.0+is+UP+$time"
:if (checkdns = 0) do={
:if ($inetdown != true) do={
/log error "INTERNET is DOWN"
:set $inetdown true
}
} else={
:if ($inetdown = true) do={
/log warning "INTERNET is UP"
:set $inetdown false
}
:if (checkvds = 0) do={
:if ($vdsdown != true) do={
/log error "VDS 0.0.0.0 is DOWN"
/tool fetch url="http://sms.ru/sms/send?api_id=YOUR_API_KEY&to=79012345678&text=$downsms" keep-result=no
:set $vdsdown true
}
} else={
:if ($vdsdown = true) do={
/log warning "VDS 0.0.0.0 is UP"
/tool fetch url="http://sms.ru/sms/send?api_id=YOUR_API_KEY&to=79012345678&text=$upsms" keep-result=no
:set $vdsdown false
}
}
}
Если у вас несколько серверов, вы можете разделить скрипт и сделать один скрипт для мониторинга домашнего интернета с логированием на роутере и другой скрипт для мониторинга IP адресов ваших серверов. Для удобства используйте циклы и массивы.
Полный текст скрипта после редактирования добавляете в System->Scripts и даете ему название. Для запуска скрипта каждую минуту или другой удобный вам промежуток времени добавляете его в System->Scheduler.
В On Event пишете: system script run inet-vds
, где inet-vds – название вашего скрипта, указанное в System->Scripts.
P.S. Как вы понимаете, Микротик не может отправить вам СМС, о том что пропал интернет, ведь интернета нет и к API SMS.RU обратиться не получится. Вы можете дописать в скрипт сохранение времени, когда интернет пропал в глобальную переменную и отправку СМС после появления интернета, с указанием промежутка времени, когда интернет отсутствовал. Но я предпочитаю мониторить домашний интернет с оповещением по СМС со своего VDS, ведь это удобно: Микротик мониторит VDS, а VDS мониторит Микротик. В этом случае вы 100% будете мгновенно оповещены о проблемах. Об этом я напишу в следующей статье.
UPD 2022: проверено, работает и на RouterOS 7.