forum.bitel.ru
http://forum.bitel.ru/

Передать диапазон IP из Inet на Mikrotik через API (CRM)
http://forum.bitel.ru/viewtopic.php?f=44&t=11286
Страница 1 из 1

Автор:  sgilyin [ 27 янв 2016, 12:45 ]
Заголовок сообщения:  Передать диапазон IP из Inet на Mikrotik через API

Доброго времени суток!

Народ, подскажите пожалуйста, как победить передачу статического диапазона IP, указанного в модуле Inet на Микротик через обработчик?

При отправке команды sa.command.serv.create=/queue/simple/add\n=name=$contractTitle\n=target=$ip задается только первый IP из диапазона. В Микротике IP-шники задаются через запятую. Если предположим пул из 3 IPов, то команда должна быть sa.command.serv.create=/queue/simple/add\n=name=$contractTitle\n=target=$ip1,$ip2,$ip3, но переменная есть только $ip.

Как распарсить пул адресов? Куда копать?

Автор:  ok-2004 [ 27 янв 2016, 18:13 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

Либо юзеру 3 разных сервиса создавать, каждый сервис со своим IP, либо на каждого юзера фиксированное кол-во ипов сразу резервировать(например - 6)
Тогда мона как-то так :
Код:
sa.command.serv.create=/ip/firewall/address-list/add\n=address=$ip/29\n=list=ACCESS_LIST\n=comment=!!$servId!!\n=disabled=yes
sa.command.serv.enable=/ip/firewall/address-list/enable\n=numbers="!!$servId!!"
sa.command.serv.disable=/ip/firewall/address-list/disable\n=numbers="!!$servId!!"
sa.command.serv.cancel=/ip/firewall/address-list/remove\n=numbers="!!$servId!!"

а в сервисе указывать первый ип диапазона ( "сетевой адрес" ).
Минус этого решения в том, что придётся к основному сервису дочерний сервис навешивать для подсчёта с диапазоном ипов от $ip +2 до $ip + 6

Автор:  sgilyin [ 28 янв 2016, 09:19 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

ok-2004 писал(а):
Либо юзеру 3 разных сервиса создавать, каждый сервис со своим IP


Не правильно это ИМХО

ok-2004 писал(а):
на каждого юзера фиксированное кол-во ипов сразу резервировать(например - 6)
Тогда мона как-то так :
Код:
sa.command.serv.create=/ip/firewall/address-list/add\n=address=$ip/29\n=list=ACCESS_LIST\n=comment=!!$servId!!\n=disabled=yes
sa.command.serv.enable=/ip/firewall/address-list/enable\n=numbers="!!$servId!!"
sa.command.serv.disable=/ip/firewall/address-list/disable\n=numbers="!!$servId!!"
sa.command.serv.cancel=/ip/firewall/address-list/remove\n=numbers="!!$servId!!"

а в сервисе указывать первый ип диапазона ( "сетевой адрес" ).
Минус этого решения в том, что придётся к основному сервису дочерний сервис навешивать для подсчёта с диапазоном ипов от $ip +2 до $ip + 6


queue как-то отказывается работать с указанием маски, если в IPе последний знак не 0. А логика сети построена так, что каждый следующий IP имеет +10 (10,20,30,40...)

Автор:  ok-2004 [ 28 янв 2016, 10:38 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

Цитата:
queue как-то отказывается работать с указанием маски, если в IPе последний знак не 0.


Да , вполне логично. Поэтому а нас в качастве тагета выступает влан, где тусуется юзер со своим /29 диапазоном.
У Вас видимо не vlan_per_user... Поэтому Вам приходится в качестве тагетов юзать "ип-ы" ,а не интерфейсы...

Автор:  PavelGloba [ 28 янв 2016, 22:29 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

sgilyin писал(а):
queue как-то отказывается работать с указанием маски, если в IPе последний знак не 0. А логика сети построена так, что каждый следующий IP имеет +10 (10,20,30,40...)

Нет. Он отказывается добавлять ipшник с маской, если он не является адресом сети в данной маске. Т.е. если добавить 10.0.0.0/30 или 10.0.0.4/30 итд - то он всё съест. Если 10.0.0.1/30 то вылезет ошибка.
Я не уверен как работает переменная $net но возможно она как раз поможет. А так в микротике есть математические действия над ipшниками.
Там можно спокойно из ipшника и маски вычислить адрес сети.

Автор:  PavelGloba [ 29 янв 2016, 00:20 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

Походу $net это всётаки не то. Короче, если я таки всё правильно понял и в каждом пуле указана корректная маска, то вот решение при котором можно вешать любой ipшник из пула в качестве сервиса.
Пример:
Изображение
Как под API писать я не знаю, так что вот для обычного telnet активатора код
Код:
sa.command.serv.create=/queue simple add name=test target=([:tostr ($ip & $netmask)]."$bitmask")


Допустим вешаем на сервис ip = 10.20.30.29, тогда обработчик передаст команду:
Код:
/queue simple add name=test target=([:tostr (10.20.30.29 & 255.255.255.248)]."/29")

И в итоге создается такая очередь:
Изображение

Автор:  ok-2004 [ 29 янв 2016, 02:26 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

PavelGloba писал(а):
Код:
/queue simple add name=test target=([:tostr (10.20.30.29 & 255.255.255.248)]."/29")....


Очень интересная команда!
Пытался эту конструкцию подсунуть микротику через API. Походу моего воображения не хватило, остался в проигрыше, ушёл думать.

Автор:  PavelGloba [ 29 янв 2016, 04:18 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

А ещё можно вообще упороться по хардкору и сделать то, что хотел автор изначально.
Для этого нам понадобиться секретный макрос, которого нет в википедии, но есть в логах:
Код:
889   01.06.2015 11:39:27   ДОБАВЛЕНО   Inet: AbstractTerminalServiceActivator: Макрос $$() конвертируется просто в $.

А так же, секретные переменные, которых тоже нет в вики, но есть в логах и на форуме:
Код:
947   09.09.2015 17:18:26   ДОБАВЛЕНО   Inet: AbstractTerminalServiceActivator: $ipNetHostMin, $ipNetHostMax, $ipNetBroadcast.

И, если я всё сделал правильно (запуск с биллинга не проверялся), то код:
Код:
sa.command.serv.create=:global minhost $ipNetHostMin; :global result [:tostr $ipNetHostMin]; :for i from=1 to=[($ipNetHostMax - $ipNetHostMin)] do={:global minhost ($$()minhost + 1); :global result ($$()result.",".[:tostr $$()minhost])}; /queue simple add target=$$()result

Превратится в:
Код:
:global minhost 10.20.30.26
:global result [:tostr 10.20.30.26]
:for i from=1 to=[(10.20.30.30 - 10.20.30.26)] do={:global minhost ($minhost + 1)
:global result ($result.",".[:tostr $minhost])}
/queue simple add target=$result

И в результате получится вот это:
Изображение

Автор:  ok-2004 [ 29 янв 2016, 09:49 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

Плохо поддаётся описанию то наслаждение,
которое я получил от созерцания Ваших екзерсизов на CLI Mikrotik-a,
ув. PavelGloba.
Увы мне, увы... ,
но этой ночью мне удалось выявить ряд постов на ихем форуме,
где старшие товарищи объясняют младшим,
что конструкции , аналогичные Вашим - суть "многокомандье" , записанное в одну строку
и советуют при работе в API добиваться аналогичного "внешней обвязкой"
кланясь всеми цветами радуги ,
что все скрипты на языка микротика можно будет прозрачно портировать в директивы API в RouteOS 7.x

Автор:  PavelGloba [ 29 янв 2016, 17:37 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

Спасибо) Думаю любой, кто писал скрипты на каком-либо другом языке может сделать так же.

Можно чуть чуть подправить скрипт, создать его отедльно, назвать как-нибудь типа "createqueue", менять значения переменных через API и дёргать его.
Код:
It is possible to access RouterOS scripting global variables through the API if user have enough permissions to read this menu.

Код:
Note: Through API it is not possible to create new variables

Опять таки получится в несколько строк, но разве должны быть сложности в отправке нескольких команд подряд? Я давно пользуюсь командсетами, они удобнее:
Код:
sa.commandSet.cmd2.serv.create.1=/ip address remove [/ip address find network=$ip]
sa.commandSet.cmd2.serv.create.2=/interface vlan add vlan-id=$vlan disabled=no interface=LAG arp=proxy-arp name=vlan$vlan comment=$translit($contractTitle)-$servTitle-$deviceIdentifier($servDeviceId)--port$iface($servDeviceId)
sa.commandSet.cmd2.serv.create.3=/ip address add address=$ipGate network=$ip interface=vlan$vlan comment=$translit($contractTitle)

По идее и с API это должно работать, иначе в чём его смысл?
Кстати, использование API вместе с bgbilling для меня сомнительно, т.к. биллинг не требует практически никакой обратной связи (например каждый раз не перечитывает конфиг, чтобы проверить, что всё на месте). Да, API работает по-быстрее, но мне кажется это не стоит того, чтобы загонять себя в такие рамки.

Автор:  stark [ 29 янв 2016, 17:45 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

Не все там так просто.

Цитата:
Так же есть специфичная переменная:
$prevIdList - результаты вызова предыдущей команды(все параметры id, через запятую).
Она нужна в тех случаях, когда есть необходимость в использовании команды find внутри другой команды. Дело в том, что Mikrotik Api не поддерживает использования таких команд, но их можно эмулировать с помощью вызова 2-х команд:
1) вначале команда print с заданными параметрами, из нее извлекаются список найденных id через запятую(их может быть несколько в общем случае)
2) Вызывается основная команда, куда вместо find подставляют список id, найденных на предыдущем шаге.
Пример конфигурации с этим параметром.
Код:
#Команды включения сервиса на устройстве
sa.command.serv.enable=/ip/firewall/address-list/add\n=address=$ip\n=list=ACCESS_LIST
#Команды выключения сервиса на устройстве
sa.command.serv.disable.1=/ip/firewall/address-list/print\n?=address=$ip
sa.command.serv.disable.2=/ip/firewall/address-list/remove\n=numbers=$prevIdList



http://wiki.bitel.ru/index.php/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA_%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%B0%D1%86%D0%B8%D0%B8_%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D0%BE%D0%B2_%D0%B4%D0%BB%D1%8F_Mikrotik(%D0%BF%D0%BE_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB%D1%83_mikrotik_api)

Автор:  stark [ 29 янв 2016, 17:49 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

Вам нужен макрос, который диапазон указанный на сервисе перечисляет в виде ip через запятую ?

Автор:  Yarlan Zey [ 29 янв 2016, 19:10 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

да

Автор:  Yarlan Zey [ 03 фев 2016, 11:02 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API

stark писал(а):
Вам нужен макрос, который диапазон указанный на сервисе перечисляет в виде ip через запятую ?

можно это рассматривать как то, что данный макрос появится в каком-нибудь обновлении?

Автор:  stark [ 03 фев 2016, 20:35 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API (CRM)

добавил в TODO

Автор:  sgilyin [ 02 мар 2016, 10:21 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API (CRM)

stark писал(а):
добавил в TODO

Есть какая-то определенность уже?

Автор:  stark [ 11 мар 2016, 14:01 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API (CRM)

sgilyin писал(а):
stark писал(а):
добавил в TODO

Есть какая-то определенность уже?

Пока очередь не дошла.

Автор:  Amir [ 18 мар 2016, 21:46 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API (CRM)

Выкладывается обновление модуля 6.2.
Макрос $iplist

Автор:  sgilyin [ 21 мар 2016, 10:40 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API (CRM)

Круто, спасибо!
Если можно пролейте свет, как правильно скормить Микротику этот макрос, пожалуйста.

Если подставить переменную в target, то на Микротик уходит первый адрес из диапазона и запятая. Остальные адреса как-то не очень отправляются.
Команда включения:
Код:
sa.command.serv.create=/queue/simple/add\n=name=$contractTitle\n=target=$iplist\n=max-limit=$param($option,speed,512)k/$param($option,speed,512)k

Отправляет это:
Код:
03-21/10:00:35  INFO [sa-p-13-t-64] MikrotikServiceActivator - execute: /queue/simple/add\n=name=A34854\n=target=10.11.93.10,\n=max-limit=51200k/51200k


Если сделать так:
Код:
sa.command.serv.create=/queue/simple/add\n=name=$contractTitle\n=target=$ip\n=max-limit=$param($option,speed,512)k/$param($option,speed,512)k

Выхлоп такой:
Код:
03-21/10:00:35  INFO [sa-p-13-t-64] MikrotikServiceActivator - execute: /queue/simple/add\n=name=A34854\n=target=10.11.93.10\n=max-limit=51200k/51200k


Вложения:
Снимок.PNG
Снимок.PNG [ 6.18 КБ | Просмотров: 10924 ]

Автор:  Amir [ 21 мар 2016, 15:03 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API (CRM)

Да, извините, ошибка.

Можете открыть редактор динамического кода - класс ru.bitel.bgbilling.modules.inet.dyn.device.terminal.AbstractTerminalServiceActivator
705 строку поменять на
byte[] addressTo = serv.getAddressTo();
734 на
sb.setLength( sb.length() - 2 );
затем нажать сохранить и скомпилировать и Перечитать конфигурацию на серверах.

Или обновиться на последний билд, нажать Скомпилировать все и Перечитать конфигурацию на серверах.

Автор:  sgilyin [ 21 мар 2016, 15:17 ]
Заголовок сообщения:  Re: Передать диапазон IP из Inet на Mikrotik через API (CRM)

Вот теперь все хорошо. Правила уходят, как надо. Спасибо!

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/