0. Введение

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

В какой-то момент началось флапинг радиоканала и OSPF начал перестраиваться каждые несколько секунд. Закончилось все это дело загрузкой CPU в 100% у большинства устройств, а были и такие которые наглухо зависли.

Значит нужно отслеживать данные перебои и оповещать всех админов о данной неприятности. Для этого написал небольшой скрипт который отслеживает количество LSA и при их изменении пишет сообщение в лог.

1. Принцип работы и возможности

  • Скрипт отслеживает количество LSA и ВСЕГДА оповещает в лог файл с важностью warning если их количество изменилось. Отмечается синим цветом.
  • Если пороговое значение (переменная threshold) изменений превышается в течении заданного количества проверок (переменная checks). Отправляется сообщение в лог с важностью error. Отмечается красным цветом.
  • Имеется возможность отправки оповещения в Telegram, для этого требуется включить данную опцию изменив переменную tgalerts на true. Далее указать Telegram bot token и chat id. Токен для бота можно получить у @BotFather Узнать свой chat id можно у любого бота, благо таких много, например @GetMyChatID_Bot Если создаете бота не забудьте зайти к нему в личные сообщения нажать "Старт" и написать что-нибудь. Это даст возможность боту отправлять вам сообщения в будущем.

2. Как использовать

  1. В WinBox зайти в System -> Scripts
  2. Создать новый скрипт с любым именем и скопировать туда код
  3. Настроить требуемые параметры
  4. Зайти в System -> Scheduler
  5. Создать новую задачу и периодичность запуска скрипта. В тело вставьте название скрипта которые придумали в пункте 2
  6. Убедиться в работоспособности скрипта любым способов изменив количество LSA.
:global checks 5; # Number of checks
:global threshold 2; # Threshold value
#Telegram
:local tgalerts false # Enable - true / Disable - flse, notifications in Telegram
:local telegramToken "BOT_TOKEN"
:local chatId "YOUR_CHAT_ID"


:global counter
:global trcount
:global lsa

:if ([:typeof $counter] = "nothing") do={ :global counter 0 }
:if ([:typeof $lsa] = "nothing") do={ :global lsa 0 }
:if ([:typeof $trcount] = "nothing") do={ :global trcount 0 }

:if ($counter < $checks) do={
  :local loclsa [/routing ospf lsa print detail count-only]
  :set $counter ($counter + 1)
  :if ($lsa != $loclsa) do={
    :set $trcount ($trcount + 1);
    :local message ("OSPF-MONITOR: Detect LSA changes now " . $loclsa . " last check " . $lsa)
    :log warning ($message)
    :set lsa $loclsa
  } else={ :log info "OSPF-MONITOR: LSA Not changes, but it works"}
  :if ($threshold <= $trcount) do={
    :local message ("OSPF-MONITOR: More than " . $threshold . " differences are found in " . $counter . " checks")
      :if ($tgalerts=true) do={
        /tool fetch url=("https://api.telegram.org/bot$telegramToken/sendMessage?chat_id=$chatId&text=$message") keep-result=no
        :log error ($message . " + Send Telegram Alerts")
      } else={:log error ($message)}
    :global trcount 0
    :global counter 0
  } else={}
} else={
  :global counter 0
  :global trcount 0
}