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
|
Автор: | 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/ |