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