Mikrotik + Telegram
С помощью скриптов и расписания в Mikrotik можно настроить уведомления через Telegram. Меня интересуют две важных задачи: уведомление о новых версиях ПО и уведомления о неудачных попытках входа в админ панель.
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
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