Страница 1 из 9

RegExp как API

Добавлено: 10 авг 2022, 12:19
Inner
Всем доброго дня!
На днях, вдохновившись этим постом подумал, что можно было бы быстро отправлять на микротик команды для запуска скриптов хоть с чайника. Но не тут-то было. Как утверждают на официальной Wiki микротика, начиная с версии 6.45.1 изменён синтаксис встроенного API. Поэтому, все API библиотеки для PHP не работают должным образом или даже вовсе не срабатывают. Из мультиплатформенных методов всё так же остаётся браузер. Но писать нужно уже на Python. А вот с ним я ниразу не сталкивался и даже приблизительно не представляю как с этим работать.
И тут у меня начались поиски. На ум сразу же пришел API Телеграмма. Боты же умеют не только писать, но и читать. Верно же? Забрал скрипт с этого топика и да, с телеги всё работает. Но что если у человека нет телеграма или по какой-то причине не пользуется им? Что ж. Казалось бы, есть решение. Два бота в группу. Один пишет команду за счёт
 API через URL

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

https://api.telegram.org/botХХХХХХ:ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ/sendMessage?chat_id=-012345678&text=<имя_скрипта>
другой читает и выполняет. Но не тут-то было. Оказалось, что у телеги есть ограничение и боты не читают сообщения друг друга. Разочарованный и раздосадованный я всё же продолжил искать выход из ситуации.
И наткнулся на это чудо. Это просто Вау. Что телега и так умеет, я даже и не думал. И вот тут у меня появилвсь идея. А что, если совместить всё воедино?

То есть, при вводе строки в браузер

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

http://<IP микротика или его DDNS>/<Уникальный ключ для безопасности>/<имя_скрипта>
микротик должен понять что нужно запустить скрипт <имя скрипта>.
RegExp работает на input. Это я проверял. Но самый сок в другом. Как написать правило так, чтобы он вылавливал тот самы <Уникальный ключ для безопасности> и <имя_скрипта>?
Буду честен. Не силён в RegExp, а мануалов мало.

P.S.: Прошу прощение за много букв. Неделю уже пытаюсь придумать что-то простое для конечного пользователя и при этом гибкое и не требовательное к оборудованию. Накипело. Нужно было выговориться.

Re: RegExp как API

Добавлено: 10 авг 2022, 12:47
Brook
На мой взгляд автор поднял очень интересную тему.

В первом приближении видится такой алгоритм действий.

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

Пишем правило в Layer7 типа:

ip firewall layer7-protocol add name=scriptName regexp=".*secureKey\\/scriptName"
Далее в Firewall Rules его отлавливаем и пишем в лог что-то типа "command = scriptName"

Остается только прочитать скриптом лог микротика, найти там эту строку и выполнить скрипт с именем scriptName
Это на вскидку...

Думаю для автора будет полезен этот ресурс. Это построитель regexp выражений с проверкой синтаксиса.

Re: RegExp как API

Добавлено: 10 авг 2022, 13:45
Inner
Brook писал(а): 10 авг 2022, 12:47 На мой взгляд автор поднял очень интересную тему.

В первом приближении видится такой алгоритм действий.

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

Пишем правило в Layer7 типа:

ip firewall layer7-protocol add name=scriptName regexp=".*secureKey\\/scriptName"
Далее в Firewall Rules его отлавливаем и пишем в лог что-то типа "command = scriptName"

Остается только прочитать скриптом лог микротика, найти там эту строку и выполнить скрипт с именем scriptName
Это на вскидку...

Думаю для автора будет полезен этот ресурс. Это построитель regexp выражений с проверкой синтаксиса.
Попробовал. Не срабатывает. Покачто эксперементирую с регулярными выражениями. Касательно вытаскивания из логов. На момент тестирований сделал чтобы создавался адрес лист по сурс адресу. Думаю, и скрипт в итоге будет стартовать каждые пару секунд и проверять наличие этого адрес листа, а в случае обнаружения выполнять действия. Но в любом случае спасибо. Мне сейчас важны любые идеи и наводки на этот счет. Я уже замечаю, что в размышлениях начал ходить кругами. А за ссылку вдвойне спасибо. Проверка синтаксиса облегчилась в разы

Re: RegExp как API

Добавлено: 10 авг 2022, 14:32
Brook
Inner писал(а): 10 авг 2022, 13:45
Попробовал. Не срабатывает. Покачто эксперементирую с регулярными выражениями. Касательно вытаскивания из логов. На момент тестирований сделал чтобы создавался адрес лист по сурс адресу. Думаю, и скрипт в итоге будет стартовать каждые пару секунд и проверять наличие этого адрес листа, а в случае обнаружения выполнять действия. Но в любом случае спасибо. Мне сейчас важны любые идеи и наводки на этот счет. Я уже замечаю, что в размышлениях начал ходить кругами. А за ссылку вдвойне спасибо. Проверка синтаксиса облегчилась в разы
А что конкретно пробовали? У меня все завелось. Отправляю через браузер строку http://myip/securekey/scriptname и микротик ловит пакеты в Firewall Rules.

Предварительно надо в IP->Services включить правило www, иначе в цепочке input не поймает.

Re: RegExp как API

Добавлено: 10 авг 2022, 15:26
Inner
Brook писал(а): 10 авг 2022, 14:32
Inner писал(а): 10 авг 2022, 13:45
Попробовал. Не срабатывает. Покачто эксперементирую с регулярными выражениями. Касательно вытаскивания из логов. На момент тестирований сделал чтобы создавался адрес лист по сурс адресу. Думаю, и скрипт в итоге будет стартовать каждые пару секунд и проверять наличие этого адрес листа, а в случае обнаружения выполнять действия. Но в любом случае спасибо. Мне сейчас важны любые идеи и наводки на этот счет. Я уже замечаю, что в размышлениях начал ходить кругами. А за ссылку вдвойне спасибо. Проверка синтаксиса облегчилась в разы
А что конкретно пробовали? У меня все завелось. Отправляю через браузер строку http://myip/securekey/scriptname и микротик ловит пакеты в Firewall Rules.

Предварительно надо в IP->Services включить правило www, иначе в цепочке input не поймает.
Ох :du_ma_et: Обещаю, однажды я стану внимательнее. Именно www я и не включил. А ведь это логично. Как ловить, если сам сервис выключен. Включил и всё заработало. Невероятно огромное спасибо. Теперь всё отрабатывает как должно

Re: RegExp как API

Добавлено: 10 авг 2022, 22:52
Inner
И так. Думаю нужно подвести более или менее, красиво оформленный, итог того что есть на данный момент.
В первую очередь, огромная благодарность Brook за проявленный интерес и неоценимую помощь в реализации.
Во вторую очередь, я делал под свои нужды, но подчеркиваю всё очень гибко настраивается практически под любые задачи. Мне требовалось быстро и с минимумом затрачиваемых ресурсов выполнять один конкретный скрипт с максимально большого количества устройств.

А теперь к делу.

Из RegExp можно сделать подобие API и довольно серьёзное. Работа пока что на самом старте и дополняться/дорабатывать будет по мере запросов пользователей в этой ветке.

Для начала создаём правило RegExp

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

/ip firewall layer7-protocol
add name=<Имя правила L7> regexp=.*<Ключ>/<Имя скрипта>
По сути <Ключ>/<Имя скрипта> воспринимается как нечто цельное. То есть, это тоже самое что и <Ключ/Имя скрипта>
Но никто же не запретит создать два правила и более? Тут на Ваше усмотрение.

Затем правило в мангал

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

/ip firewall mangle
add action=add-src-to-address-list address-list=<Имя адреслиста> address-list-timeout=none-dynamic chain=input layer7-protocol=<Имя правила L7>
Не забываем про

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

set www disabled=no
Иначе любая ссылка ссылающаяся на Ваш Микротик будет проигнорирована ещё до мангала.

Ну, а теперь, к примеру, скрипт

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

:local DROPDSTNAT [/ip firewall address-list find where list="<Имя адреслиста>"]
:if ($DROPDSTNAT!="") do={
/ip firewall nat disable [find where dst-port="<dstport>"]
/ip firewall connection remove [find where dst-address="<IP микротика>:<dstport>"]
/ip firewall address-list remove [find where list="<Имя адреслиста>"]
}
Ставим его в шедулер на каждые 5 - 10 секунд выполнения

Что получается. при вводе в строку браузера

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

http://<ip или ddns микротика>/<Ключ>/<Имя скрипта>
на микротике создаётся адресслист с именем <Имя адреслиста>. А скрипт проверяет наличие этого адреслиста, и как только его обнаружит, выполнит действие описанное в do={}. У меня это отключение переадресации порта, разрыв всех соединений по этому порту и удаление адреслиста, чтобы скрипт не отрабатывался повторно. Вот и всё.

У браузера тоже есть свои ограничения, поэтому, лучше не делать слишком длинный <Ключ> и <Имя скрипта>. Оптимальная длина для плюс-минус безопасного варианта 20-30 символов на каждый. Но если в <Имя скрипта> использовать что-то коротенькое, то <Ключ> можно и подлинее.
Ну и не стоит забывать, что L7 сам по себе довольно не хило нагружает микротик. Если правил меньше 10, то ещё ничего, но если их станет 50, то нагрузка на CPU заметно подрастёт. Такчто не злоупотребляйте и рассчитывайте свои возможности более тщательно.

Re: RegExp как API

Добавлено: 11 авг 2022, 09:17
Brook
Рад, что смог помочь.

Вы придумали новый, достаточно универсальный, интерфейс управления. У него пока нет обратной связи, но думаю это лишь вопрос времени.

Для себя уже нашел варианты использования. Спасибо за свежую идею!

Re: RegExp как API

Добавлено: 11 авг 2022, 14:30
xvo
Inner писал(а): 10 авг 2022, 22:52 Не забываем про
set www disabled=no
Иначе любая ссылка ссылающаяся на Ваш Микротик будет проигнорирована ещё до мангала.
Цепочку prerouting в mangle используйте, чтобы зазря не торчать открытым вебсервером в интернет.

Re: RegExp как API

Добавлено: 11 авг 2022, 14:46
Inner
xvo писал(а): 11 авг 2022, 14:30
Inner писал(а): 10 авг 2022, 22:52 Не забываем про
set www disabled=no
Иначе любая ссылка ссылающаяся на Ваш Микротик будет проигнорирована ещё до мангала.
Цепочку prerouting в mangle используйте, чтобы зазря не торчать открытым вебсервером в интернет.
Проверил. Всё равно нужен включенный www. Иначе не срабатывает. Поясните пожалуйста, мысль подробнее. Возможно я что-то не так понял :-):

Re: RegExp как API

Добавлено: 11 авг 2022, 15:05
xvo
Все, понял.
Request то только в уже установленной сессии отправляется.
Тогда хотя бы порт нестандартный используйте.

Ну а вообще, держать вебку открытой наружу ради вот этого всего...
Надо обладать недюжинной смелостью и верой в микротик :-)