488 слов
2 минуты
Mikrotik + Telegram

Вступление#

С помощью скриптов и расписания в Mikrotik можно настроить уведомления через Telegram. Меня интересуют две важных задачи: уведомление о новых версиях ПО и уведомления о неудачных попытках входа в админ панель.

Скрипты создаются через меню System > Scripts

Готовые скрипты

scripts


SendToTG#

Универсальный скрипт, который будут использовать другие скрипты для отправки сообщений в Телеграм. Извне скрипт принимает сообщение и отправляет его пользователю. Для настройки необходимо поменять токен бота и ID клиента пользователя которому будут приходить уведомления, других разрешений скрипт не требует

:local BotToken "YOUR_BOT_TOKEN"; :local ChatID "YOUR_TG_ID"; :local ParseMode "html"; :local DisableWebPagePreview True; :local SendText $MessageText; :local tgUrl "https://api.telegram.org/bot$BotToken/sendMessage?chat_id=$ChatID&text=$SendText&parse_mode=$ParseMode&disable_web_page_preview=$DisableWebPagePreview"; /tool fetch http-method=get url=$tgUrl keep-result=no; :log info "Send Telegram Message: $MessageText";

CheckUpdates#

Скрипт для проверки новых версий RouterOS

:local DeviceName [/system identity get name]; :local Date [/system clock get date]; :local Time [/system clock get time]; :local CheckUpdate [/system package update check-for-updates as-value]; :local Channel ($CheckUpdate -> "channel"); :local InstalledVersion ($CheckUpdate -> "installed-version"); :local LatestVersion ($CheckUpdate -> "latest-version"); :log info "Script CheckUpdateFunctions - Run."; :if ($InstalledVersion != $LatestVersion) do={     :local TelegramMessageText "MikroTik RouterOS - New version $LatestVersion is available! %0D%0A Installed version $InstalledVersion, channel $Channel. %0D%0A <a href=\"https://mikrotik.com/download/changelogs\">Changelogs</a>";     :log info "Script CheckUpdateFunctions - New version is available, send notify.";     # START SEND TELEGRAM MESSAGE     :local  SendText "\F0\9F\8C\9F <b>Update for $DeviceName! [$Date $Time]:</b> %0D%0A $TelegramMessageText";     :local SendTelegramMessage [:parse [/system script  get SendToTG source]];      $SendTelegramMessage MessageText=$SendText;     # END SEND TELEGRAM MESSAGE     } else={ :log info "Script CheckUpdateFunctions - System is already up to date."; }; :delay 1; :log info "Script CheckUpdateFunctions - Completed.";

Чтобы проверка запускалась автоматически, переходим в System > Scheduler и создаём задание на срабатывание, например каждые 24 часа и вводим команду:

/system script run CheckUpdates

Пример работы уведомления о новых версиях ПО

example


ParseLogLoginFailure#

Этот скрипт проверяет системный лог на наличие ошибок связанных с неудачными попытками входа

:local DeviceName [/system identity get name]; :local Time [/system clock get time]; :local Date [/system clock get date]; :local TelegramMessageText; :global ParseLogLoginEndArrayID; :local IDsEvents [/log find where topics~"critical" message~"login failure"]; :local LenArrayIDs [:len $IDsEvents]; :local StartArrayID [:find $IDsEvents $ParseLogLoginEndArrayID]; :local EndArrayID ($IDsEvents -> ($LenArrayIDs-1)); #:log info "Script ParseLogLoginFailure: running."; :if ($EndArrayID != $ParseLogLoginEndArrayID and [:tobool $ParseLogLoginEndArrayID] ) do={     #:log info "Script ParseLogLoginFailure: new events found.";     :for KeyArray from=($StartArrayID+1) to=($LenArrayIDs-1) do={         :local IDMessage ($IDsEvents ->$KeyArray );         :set TelegramMessageText "$TelegramMessageText %0D%0A$[/log get number=$IDMessage time] - $[/log get number=$IDMessage message];";         }     :set ParseLogLoginEndArrayID $EndArrayID;     #:log info "Script ParseLogLoginFailure: events processed. Sending notifications.";     # START SEND TELEGRAM     :local MessageText "\F0\9F\A4\AC <b>$DeviceName authentication error!</b> $TelegramMessageText";     :local SendTelegramMessage [:parse [/system script get SendToTG source]];     $SendTelegramMessage MessageText=$MessageText;     # END SEND TELEGRAM } else={ #:log info "Script ParseLogLoginFailure: no new messages found."; }; #:log info "Script ParseLogLoginFailure: script completed successfully."; :set ParseLogLoginEndArrayID $EndArrayID;

Аналогично создаём задание например на каждые 5 минут:

/system script run ParseLogLoginFailure

Пример работы уведомлений о неудачных попытках входа

example2

Mikrotik + Telegram
https://guilliman.ru/posts/mikrotik_telegram/
Автор
Herman Guilliman
Опубликовано
2024-10-24
Лицензия
CC BY-NC-SA 4.0