Skip to content

drpioneer/MikrotikTelegramMessageHandler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 

Repository files navigation

TLGRM - скрипт оповещения в Телеграм и удалённого запуска функций, скриптов и команд RouterOS.

Скрипт предназначен для отправки записей журналов устройств Mikrotik в заданную Telegram-группу и удалённого запуска функций, скриптов и команд RouterOS. Работосопособность скрипта проверялась на актуальных версиях RouterOS 6.49.++ и 7.14.++ . В скрипте использованы идеи и части кода разных авторов, найденные на просторах интернета. Код скрипта содержит в себе всё необходимое для работы и не имеет зависимостей от сторонних функций и скриптов. Для работы, скрипт необходимо добавить в System/Scripts и настроить запуск в System/Sheduler с необходимым периодом, например 1 мин.

Во время работы скрипт взаимодействует с заданной Телеграм-группой и при этом:

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

Особенности работы скрипта:

  • поддерживается отправка текстовых сообщений с кириллическими символами (CP1251)
  • отправляемые текстовые сообщения обрезаются до 4096 байтов
  • скрипт обрабатывает только ПОСЛЕДНЕЕ сообщение в ТГ-группе, по этой причине нет смысла отправлять несколько команд сразу, выполнится только последняя.
  • нарушение работы интернет-канала не влияет на работоспособность скрипта, накопившиеся сообщения будут отосланы после восстановления связи.
  • ход работы скрипта доступен для контроля через терминал устройства: /system script run tlgrm (где 'tlgrm' - имя скрипта)
  • поддерживается индивидуальная и групповая адресация команд
  • регистр символов id устройства игнорируется
  • при отправке только одной записи журнала, эта запись отправляется вместе с id роутера без разделителя в виде символа переноса. Такой подход позволяет читать сообщение на мобильном устройстве в шторке уведомлений не разблокируя устройство
  • трансляция в Телеграм сообщений о подключении/отключении беспроводных клиентов производится скриптом только в случаях, когда для МАС-адреса из строки журнала:
    • отсутствует соответствующий IP-адрес в списке DHCP/Leases
    • назначен динамический IP-адрес в списке DHCP/Leases
    • назначен статический IP-адрес в списке DHCP/Leases и при этом комментарий к нему отсутствует

Отправка команды всем или одному конкретному роутеру, находящемуся в ТГ-группе, подразумевает отправку подготовленного специальным образом сообщения, при этом скрипт должен работать на всех роутерах, которым может быть адресовано сообщение. Для отправки команды конкретному роутеру в ТГ-группе необходимо сформировать текстовое сообщение специальным образом: начало сообщения обозначается символом "/" с указанием имени роутера, которое должно соответствовать /system identity и не должно содержать пробелов, далее через пробел или символ '_' (подчеркивание) указывается команда. Для отправки команды всем роутерам в ТГ-группе, вместо имени необходимо указать 'forall'. В качестве команды могут выступать: имя глобальной функции, имя скрипта или команда RouterOS, например:

  /forall log warning [/system identity get name]
  /mikrotik1 wol
  /mikrotik system reboot

Настройки хранятся вначале скрипта и представляют собой преднастроенные переменные:

  • botID "XXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - идентификатор бота
  • myChatID "-XXXXXXXXX" идентификатор чата
  • broadCast, где false = реакция на команды, предназначенные только этому устройству; true = реакция на все принятые команды
  • launchScr, где true = разрешение исполнения скриптов; false = запрет исполнения скриптов
  • launchFnc, где true = разрешение использования глобальных функций; false = запрет использования функций
  • launchCmd, где true = разрешение выполнения команд RouterOS; false = запрет выполнения команд RouterOS
  • sysInfo, где true = разрешение трансляции в ТГ-чат подозрительных событий журнала устройства; false = запрет трансляции событий журнала устройства
  • userInfo, где true = разрешение трансляции в ТГ-чат сообщений, сформированных по пользовательским условиям; false = запрет трансляции пользовательских сообщений

Минимальная настройка скрипта сводится к указанию идентификаторов бота и группы: botID и myChatID


Для формирования списка команд в Телеграм-группе через бота BotFather необходимо выполнить последовательность действий с BotFather: вводим и отправляем команду: /setcommands выбираем нужного бота, выскочит подсказка:

    command1 - Description
    command2 - Another description

По сути это шаблон с указанием формата ввода команд, в котором каждая команда должна быть оформлена отдельной строкой, в каждой строке слева от дефиса должен находиться текст с командой. Этот текст в дальнейшем и будет отправляться при выборе команды. В каждой строке справа от дефиса пишется краткое описание команды. Оно нужно для того, чтобы не держать в голове все команды. Описание напомнит, что это за команда и что она делает. Следует обратить внимание на важные детали при формировании текстовых строк с командами:

  • текст команды (слева от дефиса) может состоять ТОЛЬКО из цифр, маленьких латинских букв и знака подчёркивания (заглавные буквы, пробелы, спецсимволы и кириллица недопустимы).
  • текст описания (справа от дефиса) может содержать любые символы. Текст обязательно должен быть.
  • при добавлении новых команд, старые команды нужно вбивать вновь... Другими словами: все команды нужно вводить одним списком.

Вводим и отправляем команду по шаблону: имямикротик_имяскрипта - текст с описанием. Если всё сделано правильно, получим ответ: 'Success! Command list updated.' Обратите внимание! В "команду" мы на самом деле запихиваем 'имямикротик' и 'имяскрипта' через символ подчёркивания. Это делается чтобы BotFather не ругался и проглотил эту "команду", в которой на самом деле зашифровано имя роутера с названием скрипта, которые в свою очередь должны быть обработаны TLGRM. А т.к. для наших целей пробелы нужны как минимум для отделения ID маршрутизатора от команды, пришлось заниматься самообманом: отныне скрипт считает пробелы (' ') и знаки подчёркивания ('_') тождественными. Таким образом BotFather тянет за собой зависимость -> ID роутеров и названия скриптов могут состоять только из цифр и маленьких латинских букв (заглавные буквы, пробелы, знаки подчёркивания, спецсимволы и кириллица недопустимы!!!). Теперь, нажав на кнопку "/" в своём чате с ботом, можно посмотреть, какие команды (скрипты) и на каких устройствах нам доступны, а при желании можно выбрать нужную команду и отправить её на исполнение.


Для корректного отображения скриптом 'username' отправителя, в настройках Телеграм должно быть заполнено поле "Имя пользователя", бот должен быть подключен к ГРУППЕ (групповому чату), а не к КАНАЛУ. Опытным путём выяснено, что предпочтителен групповой чат Телеграм с id БЕЗ префикса '-100', в таком чате сообщения от ГРУППЫ роутеров не теряются.

Список литературы:

About

Combined Telegram notification script & remote launch of Mikrotik scripts

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published