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. Как использовать
- В WinBox зайти в System -> Scripts
- Создать новый скрипт с любым именем и скопировать туда код
- Настроить требуемые параметры
- Зайти в System -> Scheduler
- Создать новую задачу и периодичность запуска скрипта. В тело вставьте название скрипта которые придумали в пункте 2
- Убедиться в работоспособности скрипта любым способов изменив количество 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
}