JSON парсер JParse для Mikrotik

Автоматизация при помощи встроенного скриптового языка и RouterOS API
Ответить
Chupakabra303
Сообщения: 16
Зарегистрирован: 24 янв 2017, 11:57

JSON парсер JParse для Mikrotik

Сообщение Chupakabra303 » 23 июн 2017, 15:43

Делюсь JSON парсером на скриптовом языке Mikrotik. И примером Telegram bot-а, понимающего команды. Вообще, JSON чудно парсится в ассоциативный массив, что и было проделано. Как использовать: смотрите пример бота. http://www.embest.ru/mikrotik/json-parser-script

Изображение
Последний раз редактировалось Chupakabra303 27 июн 2018, 16:47, всего редактировалось 3 раза.

Sertik
Сообщения: 2
Зарегистрирован: 15 мар 2018, 18:07

Re: JSON парсер JParse для Mikrotik

Сообщение Sertik » 15 мар 2018, 18:31

Chupakabra303, простите, сломал себе голову, но так и не понял, какое практическое использование есть у Вашего парсера ?
Что он реально делать может под Микротиком ? (Никогда с такими штуками дел не имел, простите, за глупый вопрос, объясните, пожалуйста, подробнее).

Аватара пользователя
Chupaka
Сообщения: 1034
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: JSON парсер JParse для Mikrotik

Сообщение Chupaka » 16 мар 2018, 14:04

Там же написано: можно бота сделать, который будет реагировать на команды и делать что-нибудь с роутером :)

Sertik
Сообщения: 2
Зарегистрирован: 15 мар 2018, 18:07

Re: JSON парсер JParse для Mikrotik

Сообщение Sertik » 22 мар 2018, 17:35

1. Бот делается в сервисе Телеграмм ?
2. Команды пишутся в бот, Ваш парсер с Микротика его "отслеживает" и ... что он делает - устанавливает глобальные переменные в окружении реппозитория Микротика, которые потом могут отслеживаться другими скриптами через Планировщик - я правильно понимаю или нет ?
3. Какие команды "понимает" парсер ?
4. Есть ли поподробнее "разжеванная" инструкция по применению "для чайников" ?
5. Планируете ли Вы его развитие ?

Заранее спасибо и благодарности автору от меня лично и (думаю не ошибусь если так напишу) всего сообщества пользователей Микротик !
А также с большим уважением, (если скрипты писали Вы, видно по коду скриптов и конструкциям, что Вы профи ...)

P/S. Понимаю, как "старый" немножко программист, что Вам легче написать парсер, чем инструкцию к нему, но все же Ваш парсер пользовался бы огромной популярностью, если бы была инструкция ... Или это коммерческий вопрос ?

Chupakabra303
Сообщения: 16
Зарегистрирован: 24 янв 2017, 11:57

Re: JSON парсер JParse для Mikrotik

Сообщение Chupakabra303 » 18 апр 2018, 14:19

Доброго времени суток.
1. Бот делается в телеграме.
2. Команды отсылаются стандартно боту в чат в телеграм-клиенте.
У меня реализовано 2 варианта, простой и c webhook.
Простой:
Cкрипт просто периодически читает (вызывается из планировщика) getUpdates api telegram, после разбора ответа делает if-else выбор действия по переменной $v->"message"->"text":
:if ($v->"message"->"text" ~ "uptime") do={
/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$[/system resource get uptime]" keep-result=no
} else={
:if ($v->"message"->"text" ~ "ip") do={
/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$[/ip dhcp-client print as-value]" keep-result=no
} else={
:if ($v->"message"->"text" ~ "parse") do={
/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$[$fJParsePrintVar]" keep-result=no
} else={
/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$($v->"message"->"text")" keep-result=no
}
Нужны какие-то свои функции - просто добавляете else-if. К сожалению нет switch-case стуктуры, чтобы это упростить в языке mikrotik.
Минус: скорость ответа микротика на запрос определяется частотой вызова скрипта, при каждом вызове происходит чтение getUpdates api telegram, парсинг, в общем, полный цикл запроса-анализа, что нагружает процессор. Чтобы избавиться от этих минусов есть вариант скрипта webhook, т.е. когда api telegram сам "долбится" по заданному адресу, чтобы прислать новые сообщения. Продолжение следует.
Последний раз редактировалось Chupakabra303 19 апр 2018, 12:35, всего редактировалось 1 раз.

Chupakabra303
Сообщения: 16
Зарегистрирован: 24 янв 2017, 11:57

Re: JSON парсер JParse для Mikrotik

Сообщение Chupakabra303 » 19 апр 2018, 12:35

Продолжение.
Второй вариант скрипта Telegram bot-а на базе Webhook. Mikrotik, конечно, не умеет делать пользовательский web server внутри себя, который требуется для полноценной работы Webhook уведомлений от API Telegram. Но можно хитро обойти эту проблему. Для этого нужно мониторить некий несуществующий TCP сокет, в который будет "долбиться" Webhook, это делается с помощью Mangle правила. В API Telegram включается работа с Webhook, указывается IP mikrotik-а и TCP порт, SSL сертификат тут роли не играет никакой! По значению счетчика пакетов Mangle правила можно понять, что в несуществующий TCP порт "долбится" Webhook (или что-то другое ;), но можно отсечь фильтром src-address=149.154.167.192/26). Затем в API Telegram отключаются Webhook-и и делается чтение и обработка сообщений как в первом варианте скрипта (polling), затем опять включается Webhook и по новой. Я накидал небольшую диаграмму работы скрипта.
Минусы: Для Webhook нужен реальный IP адрес mikrotik, желательно привязанный к домену (у меня работает с динамическим IP и сервисом динамического DNS).
Плюсы: Основная часть скрипта фактически спит все время, ожидая входящий пакетов на суррогатный сокет. Если скрипт вызывать часто (у меня раз в секунду), то Webhook-и отрабатываются очень быстро, как в нормальных Telegram ботах.
MikrotikTelegramBorAlgorithm.png
MikrotikTelegramBorAlgorithm.png (69.58 КБ) 1374 просмотра
Продолжение следует.

Chupakabra303
Сообщения: 16
Зарегистрирован: 24 янв 2017, 11:57

Re: JSON парсер JParse для Mikrotik

Сообщение Chupakabra303 » 20 апр 2018, 13:23

3. Парсер не понимает никакие команды, команды "понимает" бот, использующий данные на выходе парсера. Парсер же просто извлекает данные из JSON строки и формирует из них ассоциативный массив, который удобно использовать в скриптах Mikrotik. Команды - это как бы пользовательский уровень уже, тут каждый сам решает, какие функции управления ему реализовать. Вот, например, у меня есть команда, которая добавляет на 10 минут IP адрес в разрешающий список адресов ExtAccessIPList.
:if ($v->"message"->"text" ~ "add") do={
:local addIP [:toip [:pick ($v->"message"->"text") 4 [:len ($v->"message"->"text")]]]
:if ([:typeof $addIP] = "ip") do={
:do {/ip firewall address-list add address=$addIP list=ExtAccessIPList timeout=10m comment="temp"} on-error={:put "ip in list error"}
}
:local Str1 ""
:foreach item in=[/ip firewall address-list print as-value where list=ExtAccessIPList and dynamic] do={:set Str1 ($Str1 . "$($item->"address") $($item->"timeout") $($item->"comment")\r\n")}
:do {/tool fetch url="https://api.telegram.org/bot$TToken/sen ... d=$TChatId" http-method=post http-data="text=$Str1" keep-result=no} on-error={:put "sendmessage error"}

Пример запроса и ответа в telegram, последняя строка это уже добавленный в IP List временный адрес:
>add 1.1.1.1
>> 90.0.0.97 h*******
100.0.0.157 6*******
90.0.0.2 i*******.ru
100.0ю0.66 b*******.ru
1.1.1.1 00:10:00 temp

4. Инструкции в классическом понимании не будет скорее всего. Но на вопросы готов ответить.
5. Активное развитие не планирую, текущий результат меня устраивает, но готов рассмотреть предложения по усовершенствованию.

Winand
Сообщения: 1
Зарегистрирован: 29 июл 2018, 00:13

Re: JSON парсер JParse для Mikrotik

Сообщение Winand » 29 июл 2018, 00:26

Это просто великолепно.) ...когда разберёшься как пользоваться. До этого я использовал apify, чтобы выдрать из json одно значение. Теперь можно делать так:

Код: Выделить всё

#Load file "tmp" to JSONIn variable
:global JSONIn [/file get tmp contents]
#initialize environment
/system script run "JParseFunctions"
#parse JSONIn then get ParsedResults[0].ParsedText value
:global fJParse
:local response [([$fJParse]->"ParsedResults"->0->"ParsedText")]
#trim value
:local password [:pick $response 0 [:find $response " "]]
:log info "Current VPNBook password is $password"
#Remove "tmp" file
/file remove tmp

Ответить