RegExp как API

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Inner
Сообщения: 248
Зарегистрирован: 01 июл 2020, 16:02

Всем доброго дня!
На днях, вдохновившись этим постом подумал, что можно было бы быстро отправлять на микротик команды для запуска скриптов хоть с чайника. Но не тут-то было. Как утверждают на официальной 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.: Прошу прощение за много букв. Неделю уже пытаюсь придумать что-то простое для конечного пользователя и при этом гибкое и не требовательное к оборудованию. Накипело. Нужно было выговориться.


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

На мой взгляд автор поднял очень интересную тему.

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

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

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

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

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

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


Inner
Сообщения: 248
Зарегистрирован: 01 июл 2020, 16:02

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

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

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

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

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

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

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


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

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

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


Inner
Сообщения: 248
Зарегистрирован: 01 июл 2020, 16:02

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

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


Inner
Сообщения: 248
Зарегистрирован: 01 июл 2020, 16:02

И так. Думаю нужно подвести более или менее, красиво оформленный, итог того что есть на данный момент.
В первую очередь, огромная благодарность 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 заметно подрастёт. Такчто не злоупотребляйте и рассчитывайте свои возможности более тщательно.


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

Рад, что смог помочь.

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

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


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

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


Telegram: @thexvo
Inner
Сообщения: 248
Зарегистрирован: 01 июл 2020, 16:02

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


xvo
Сообщения: 4204
Зарегистрирован: 25 фев 2018, 22:41
Откуда: Москва

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

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


Telegram: @thexvo
Ответить