четверг, 21 апреля 2016 г.

Мониторим сайт с помощью оборудования Mikrotik.

  Задача: есть сайт, который находится на собственном WEB-сервере за NAT. Работоспособность его нужно мониторить. Пинг для определения работоспособности "сайта" я не использовал. Сервер за NAT-ом, поэтому пинговать внешний интерфейс бессмысленно (он может быть рабочий, а сам WEB-сервер упал). Для проверки был выбран метод скачивания специально подготовленной страницы html с сайта на Микротик через функцию /tool fetch используя метод http. Если страница скачалась через http, мы считаем что сайт в рабочем режиме, если нет, отправляем человеку, который следит за сайтом смс (через сторонний сервис).

  Для начала приведу сам скрипт, он у меня работает на версии RouterOS 6.28:
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 23q
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
:global OFFsite;
:local time [/system clock get time];
:local hour [:pick [/system clock get time] 0 2];
:if ($hour >= 8 and $hour <= 21)  do={
# domain.ru get http
:local result1 none;
:local result2 none;
:do {/tool fetch mode=http address="domain.ru" src-path="/23q.html" dst-path="/23q.html"
:delay 3;
:set result1 [/file get "23q.html" contents]
:delay 3;
/file remove "23q.html"} on-error={:log warning "domain.ru KAPUT"};
:delay 600;
:do {/tool fetch mode=http address="domain.ru" src-path="/23q.html" dst-path="/23q.html"
:delay 3;
:set result2 [/file get "23q.html" contents]
:delay 3;
/file remove "23q.html"} on-error={:log warning "domain.ru KAPUT"};
:if (($result1 = "none") and ($result2 = "none")) do={
:if ($OFFsite = yes) do={} else={
:local smtpserv [:resolve "smtp.yandex.ru"];
:local email "domain@yandex.ru";
:local pass 123456789;
/tool e-mail send server=$smtpserv port=587 user=$email password=$pass start-tls=yes to="sms@massreach.com" cc="admin@domain.ru" from=$email subject="567tyk86u89p6ee670 380666666666,380999999999" body="[SENDER]Domain[/SENDER][SMS]Site domain.ru OFF![/SMS]";
:set OFFsite yes}} else={:if ($OFFsite = no) do={} else={:set OFFsite no}}
};
  В самом начале мы вводим глобальную переменую OFFsite, она нам поможет, если сайт упал, не отправлять постоянно смс администраторам, а отправить ее только один раз. Код
:local time [/system clock get time];
:local hour [:pick [/system clock get time] 0 2];
:if ($hour >= 8 and $hour <= 21)  do={
 нам вычисляет временные рамки, в которых должен срабатывать этот скрипт. Это и есть график "работы" сисадмина, что-бы ночью, даже если сайт лежит, его не беспокоили смс =).   Следующем этапом мы вводим две переменные result1 и result2, от них мы будем отталкиваться при определении скачалась страничка html или нет. Потом непосредственно идет скачивание страницы с сайта.
:do {/tool fetch mode=http address="domain.ru" src-path="/23q.html" dst-path="/23q.html"
:delay 3;
:set result1 [/file get "23q.html" contents]
:delay 3;
/file remove "23q.html"} on-error={:log warning "domain.ru KAPUT"};
:delay 600;
:do {/tool fetch mode=http address="domain.ru" src-path="/23q.html" dst-path="/23q.html"
:delay 3;
:set result2 [/file get "23q.html" contents]
:delay 3;
/file remove "23q.html"} on-error={:log warning "domain.ru KAPUT"};
  Страницу скачиваем по пути http://domain.ru/23q.html. Страница 23q.html представляет собой пустой файл (даже без разметки) html с единственным словом "good", которое присваивается переменным result в случае удачного скачивания. Если же страница не скачалась мы записываем это в лог, и выполняем отправку e-mail на шлюз оператора смс, в определенном формате. Для сервиса AtomPark это письмо с темой 567tyk86u89p6ee670 380666666666,380999999999 (содержит идентификатор и номера рассылки смс), и телом письма [SENDER]Domain[/SENDER][SMS]Site domain.ru OFF![/SMS], где Domain - имя отправителя смс, "Site domain.ru OFF!" - само тело.
   Конструкция ниже этой части скрипта нужна для того, что бы при отвале сайта смс отправилось только один раз. Скачивание 23q.html два раза с интервалом 10 минут, если и первый раз этот файл не доступен и второй через 10 минут, мы считаем что сайт не рабочий. В System/Scheduler ставим задачу с интервалом в 12 минут.

  Этот скрипт лежит на удаленном Mikrotik с хорошей степенью доступности, двумя каналами интернет, поэтому ложных срабатываний минимум.

Подписаться на новые статьи.

4 комментария:

  1. а не проще воспользоваться мониторингом от яндекса? metrika.yandex.ru?
    смс бесплатно, настройка смс информирования по часам и дням настраивается

    ОтветитьУдалить
    Ответы
    1. сервисов много, это пример универсальности RouterOS. Конкретно с Яндекс.Метрика было много ложных срабатываний, особенно когда происходит выгрузка на сайт.

      Удалить
    2. Яндекс метрика поможет если мониторить свой ресурс. А если чужой!? Кстати у меня этот скрипт так и не заработал на прошивке 6.40.3. Я чуть под себя переделал
      :do {
      /tool fetch url="http://НУЖНЫЙСАЙТ.ru/alert.html" mode=http
      :delay 10;
      /file remove "alert.html"
      } on-error={
      log warning ("НУЖНЫЙСАЙТ.ru.ru ypal")
      /tool e-mail send to="куда@шлём.ru" from="от-кого@yandex.ru" subject="MIKROTIK! НУЖНЫЙСАЙТ.ru.RU!" body="NOT WORKING! http://НУЖНЫЙСАЙТ.ru/ urgent action!!"
      }

      В TOOLS-Email у меня уже настроен по умолчанию smtp.yandex.ru

      Удалить
  2. Вопрос: а можно ли заставить Микротик не просто скачать html, а скачать html и найти в нём определённую последовательность символов и вставить её в переменную? Спасибо!

    ОтветитьУдалить