mikrotik
October 24

Mikrotik + Telegram

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

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

System > 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
Пример работы уведомления о новых версиях ПО

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
Пример работы уведомлений о неудачных попытках входа