MikroTik, Scripts — отправка сообщений в Телеграм

Нашел список скриптов, которые уведомляют вас через Telegram или E-mail о различных событиях произошедших в вашей сети, на маршрутизаторе(Микротик).

Первые два скрипта отвечают непосредственно за отправку сообщений в Телеграм или на почту, остальные нумерованные просматривают лог, подготавливают сообщение и передают информацию первым двум. Такая логика работы призвана упростить внесение изменений в случае смены реквизитов Телеграм-бота или почтового сервера.

  1. Failed login attempt notification
  2. Device Login Notification
  3. Bandwidth excess notification
  4. Bulk create VPN users from a file
  5. Device processor overload notification
  6. Device overheating notification
  7. Notification when the external IP address of the router changes
  8. Notification of device connection to the network
  9. Discover Unknown DHCP Server on the Network
  10. Sending power on notification to Telegram

Процесс настройки отправки сообщений в Телеграм состоит из 2х этапов:
1) создания и настройки Бота в Телеграм. Нам понадобится TokenID(ключ для отправки сообщенийй от имени бота) и ChatID(идентификатор того чата, в который вы хотите чтобы бот отправлял сообщения),

2) непосредственно прописывания скриптов на маршрутизаторе и привязке каждому из них в расписании(DHCP тригере) времени(периода) запуска.

1. Создаем бота

Находим в Телеграме пользователя @BotFather(он создает ботов):

Пишем ему сообщение(команду) /newbot:

следуя подсказкам создаем бота и получаем его TokenID

Создаем группу в Телеграм, добавляем туда нашего бота. В итоге сообщения от ботов(с разных маршрутизаторов) объединим в одной группе.

Теперь узнаем ChatID нашей группы, куда мы добавили бота. В адресную строку браузера копируем:

https://api.telegram.org/bot1854512345:AAEZC5eocQGosZUOuGirnWL1eTCphvgEzLw/getUpdates

браузер должен отобразить информацию, среди который будет ChatID нужной нам группы:

2. Настройка микротика

Создаем первый скрипт(System -> Script), чтобы он работал нужно задать ему следующие права:

[System] -> [Scripts] -> [+] -> [Name: CheckPowerOn] -> [Policy: read, write, policy, test]

Пишем ему Имя, Права задаем, вставляем сам Скрипт, меняем значения TokenID ChatID на свои и жмем ОК:

Код скрипта:

# Func: Telegram send message
:local TGSendMessage do={
    :local tgUrl "https://api.telegram.org/bot$Token/sendMessage?chat_id=$ChatID&text=$Text&parse_mode=html";
    /tool fetch http-method=get url=$tgUrl keep-result=no;
}

# Constants
:global RebootStatus;
:local TelegramBotToken "987654321:AAFJIVTAWodBwzGX2CLne6-PK4RFNSy-8OY";
:local TelegramChatID "987654321";
:local DeviceName [/system identity get name];

:local TelegramMessageText "\F0\9F\9F\A2 <b>$DeviceName:</b> start after Power Off.";

# Program
:if ($RebootStatus != true)  do={
    $TGSendMessage Token=$TelegramBotToken ChatID=$TelegramChatID Text=$TelegramMessageText;
    :set RebootStatus true;
    :log info "Script CheckPowerOn send Telegram message."
}

Добавляем строку для запуска нашего скрипта в планировщик

Чтобы скрипт планировщика работаел ему также нужно проставить следующие права: read, write, policy, test.

[System] -> [Schedule] -> [+] -> [Name: CheckPowerOn script] - > [Interval: 00:05:00] -> [Policy: read, write, policy, test]

Добавляем следующую команду, которая будет каждые 5минут запускать наш скрипт:

/system script run CheckPowerOn

Теперь каждые 5 минут микротик будет проверять свой лог на наличие записи о перезагрузке роутера, и в случае обнаружения таковой отправит вам в чат сообщение.

Логика скрипта

Помимо параметров время события, текст события, MikroTik использует уникальный параметр id события, который мы будем использовать (.id уникален до перезапуска устройства, потом отчет начинается заново, с 0).

  • Обозначаем глобальную переменную ParseLogAccountEndArrayID — хранит последний проверенный .id сообщения;
  • Собираем в массив IDsEventsAccount все .id сообщений, в теме которых встречается «account» — (события: успешный вход на устройство, завершение сессии пользователя). Стандартное ограничение журнала лога 1000 строк, это не вызовет значимой нагрузки на устройство;
  • Получаем LenArrayIDs — количество элементов массива, StartArrayID — номер элемента с которого начнем перебор (это как раз ID последнего запуска), и EndArrayID — номер последнего элемента массива минус 1(массив начинается с элемента с индексом 0).
  • Если последний элемент .id массива (IDsEventsAccount) не равен последнему проверенному .id (ParseLogAccountEndArrayID) (т.е. появились новые события «account») и последний элемент (ParseLogAccountEndArrayID) — не пустой (первый запуск/в журнале нет событий авторизации) начинаем формировать и отправлять сообщения;
  • Если в журнале присутствуют необработанные события «account», начинаем перебор ключей в массиве (IDsEventsAccount) по их номерам, начиная с «последнего +1» (чтобы не отправлять вновь предыдущее последнее событие) до «последнего -1» (т.к. индекс начинается с 0);
  • Получаем .id сообщения (IDMessage) по его номеру в массиве;
  • Формируем текст email, записывая новой строкой сообщение журнала MikroTik;
  • Формируем текст Telegram сообщения, используя %0D%0A для переноса строки;
  • Отправляем сформированное сообщение на email;
  • Отправляем сформированное сообщение в Telegram;
  • Записываем в ParseLogAccountEndArrayID последний ID сообщения с темой «account» (EndArrayID).

Возможные темы сообщений в журнале устройства, можно увидеть попытавшись создать правило Logging:

[System] -> [Logging] -> [Rules] -> [+] -> [Topics]

Для парсинга текста сообщений используйте регулярные выражения и команду вида:

[/log find where message ~ «log»]

Установив более частое время проверки скрипта, вы можете выполнить дополнительные действия при входе/выходе пользователя, например автоматическое создание резервной копии (для тех кто любит править Firewall в пятницу вечером, забывая устанавливать MikroTik Safe Mode) или что еще подскажет воображение.

Мой скрипт выглядит проще, чем что я находил в интернете и доступен к оптимизации, если вы любите оптимизировать код в минимальное количество строк.

Если вы используете множество скриптов на вашем устройстве, указывать параметры почты и Telegram бота, в каждом из скриптов нерационально, особенно если возникнет необходимость изменить параметры. Я использую в своих скриптах вызов скриптов функций: «Отправить Email» и «Отправить сообщение Telegram«, возможно и Вам это тоже будет полезно, упрощая управление устройством MikroTik.

Работа скрипта проверена на: hAP ac lite, RouterOS 6.47.8 (stable), 951UI.

UPD 11.12.2020: Выставляйте права на запуск скрипта в Scheduler и на сам скрипт, как указано в статье: read, write, test, policy. Излишние права (выставляются по умолчанию новому скрипту) могут привести к появлению ошибки «could not run script ParseLogAccountEvents: not enough permissions«. Проверяйте журнал устройства.

Источник: https://mhelp.pro/tag/mikrotik-scripts/
https://habr.com/ru/post/532086/

Довольны?
[Оценок: 0 средняя: 0]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *