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