forum.bitel.ru http://forum.bitel.ru/ |
|
Скрипт стандартного шлюза Мikrotik по telnet для 5.1 http://forum.bitel.ru/viewtopic.php?f=19&t=6107 |
Страница 1 из 1 |
Автор: | ok-2004 [ 10 ноя 2011, 18:18 ] |
Заголовок сообщения: | Скрипт стандартного шлюза Мikrotik по telnet для 5.1 |
Добрый вечерочек... Решил чуток поменять стандартную команду тестирования ipn-шлюза Mikrotik по telnet для 5.1 Взял за основу [url] http://wiki.bgbilling.ru/index.php/%D0% ... 8F_5.1_%29 [/url] Изменил "...ip firewall address-list print without-paging..." на "ip firewall address-list print without-paging where list=ACCESS_LIST" добавил этот скриптик в тип шлюза микротик. При попытки сохранения выскакивает ошибка валидации скрипта: "in file <unknown> Encountered "," at line 156 column 35" т.е. где-то вот здесь: "... Map<String, String> replacements = new HashMap<String, String>();...." Люди добрые - подскажите- как это победить ???? |
Автор: | stark [ 11 ноя 2011, 17:30 ] |
Заголовок сообщения: | Re: Скрипт стандартного шлюза Мikrotik по telnet для 5.1 |
Beanshell не понимает генериков. Замените на replacements = new HashMap(); |
Автор: | ok-2004 [ 12 ноя 2011, 08:50 ] |
Заголовок сообщения: | Re: Скрипт стандартного шлюза Мikrotik по telnet для 5.1 |
О да! Это я догадался уж. Но естесственно ничего не заработало.Жаль что разработчики хотя бы в доке не приводят примеры хотя бы стандартных шлюзов манад-микротик , портированных на beanshell. Весьма было бы полезно. Например для того чтобы подменить команду "test " шлюза mikrotik. Ведь у некоторых в адрес-листах ип-адреса не только в ACCESS_LIST фигурируют, но и в пару-трешку сотен в других адресс-листах., которые могут шейпить, полиси-роутить, фильтровать , и т.д. и т.п.... А БЖБ просит микротик дешево-сердито вывалить ему всё содержимое адресс-листов, а потом там начинает долго ковыряться.По мере наращивания записей в аддресс-листах это становиться всё более-и более заметно. А всего то надо выводить список только адресс-листов , по которым происходит управление в командах шлюза. Просто поменять одну команду в двойных кавычках на ДРУГУЮ!!! Не меняя кода всего скрипта. Еще раз прошу уважаемых форумчан или разработчиков в свободное от трудовых подвигов время снизойти до портирования скриптов стандартных шлюзов для Mikrotika, выложенных в вики для версии бжб-5.1 с явы на биншелл. Или это такая секретная или трудная тема. что только в helpdesk за тикетами придётся переться... P.S. Вообще в последнее время политика развития связки БЖБ со шлюзами всё больше удручает. Фактически декларируется следующий постулат:"Мы пишем ядро , которое плавает в небесах над грешными кучами разнообразного оборудования, а уж связи небес с землёй пишите сами, если конечно сможете..." ACP написанное програмистами для програмистов.Я понимаю , что всё для всего не напишешь. И стандартный шлюз не напишешь. Но можно хотябы предусмотреть програмные интерфейсы для связки с другими языками , какими угодно...просто документировать - что бжб хочет получить от "драйвера" шлюза на выходе, и что хочет выложить ему на вход . Извините... |
Автор: | stark [ 14 ноя 2011, 18:02 ] |
Заголовок сообщения: | Re: Скрипт стандартного шлюза Мikrotik по telnet для 5.1 |
ok-2004 писал(а): О да! Это я догадался уж. Но естесственно ничего не заработало.. Какие-то ошибки в логах? |
Автор: | ok-2004 [ 15 ноя 2011, 20:06 ] |
Заголовок сообщения: | Re: Скрипт стандартного шлюза Мikrotik по telnet для 5.1 |
После долгово мудрения со скриптом накатал вот так: Код: import java.util.*; import java.util.regex.*; import ru.bitel.bgbilling.common.*; import bitel.billing.common.module.ipn.*; import bitel.billing.server.ipn.bean.*; import bitel.billing.server.ipn.*; import bitel.billing.server.util.ssh.*; import bitel.billing.server.util.*; import bitel.billing.server.util.ssh.SSHSession; import ru.bitel.bgbilling.modules.ipn.server.bean.command.GateCommandUtil; import bitel.billing.common.module.ipn.IPNContractStatus; protected void doSync() { host = gate.getHost(); port = gate.getPort(); gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); login = gateSetup.getStringValue( "login", "root" ); pswd = gate.getKeyword(); if ( log.isDebugEnabled() ) { log.debug( " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd ); } session = null; try { session = new SSHSessionExec( host, port, login, pswd ); // address_list = session.command( "ip firewall address-list print without-paging" ); address_list = session.command( "ip firewall address-list print without-paging where list=ACCESS_LIST" ); new_address_list = null; for ( UserStatus status : statusList ) { cid = status.contractId; ruleType = status.ruleType; rule_id = 0; if (ruleType != null) { rule_id = ruleType.getId(); }; rules = null; if (address_list.indexOf( "cid="+cid+";rule_id="+rule_id+";") != -1) { if ( status.status > 0 ) { if ( status.status == IPNContractStatus.STATUS_REMOVED ) { rules = getDeleteRules( status ); } else { rules = getCloseRules( status ); }; }; } else if ( status.status == IPNContractStatus.STATUS_OPEN ) { rules = getOpenRules( status ); }; if (rules != null){ for ( String rule : rules ) { p = Pattern.compile("rule_id"); m = p.matcher(rule); if (new_address_list == null) { new_address_list = ""; }; new_address_list = new_address_list + m.replaceAll("rule_id="+rule_id) + "\n"; }; }; } if (new_address_list != null){ result = session.command(new_address_list); }; } finally { if ( session != null ) { session.disconnect(); } } } private getOpenRules( status ) { return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" ); } private getCloseRules( status ) { return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" ); } private getDeleteRules( status ) { return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" ); } private getRules( status, template ) { rule = status.rule.getRuleText(); if ( status.ruleType != null ) { rule = generateRule( rule, status.gateType, status.ruleType, status.contractId ); } pattern = Pattern.compile( template, Pattern.DOTALL ); m = pattern.matcher( rule ); if ( m.find() ) { rule = m.group( 1 ); } rule.replaceAll( "\r", "" ); return rule.split( "\n" ); } private generateRule( addresses, gateType, ruleType, cid ) { String rule; replacements = new HashMap(); replacements.put( "\\{CID\\}", String.valueOf( cid ) ); ruleText = GateCommandUtil.getRule( gateType, ruleType ); rule = GateCommandUtil.generateRule( ruleText, addresses, replacements, ruleType ); return rule; } Конфигурация шлюза: Код: user_rule.editor.class=bitel.billing.module.services.ipn.editor.MikrotikContractRuleEditor gate_manager.class=bitel.billing.server.ipn.MikrotikGateWorker use.script=1 Команды шлюза - как в доке на микротик Шлюз привязал к договору При открытии шлюза - ип договора добавляется в адресс-лист: Код: [admin@mt] /interface ethernet> /ip firewall address-list print without-paging where list=ACCESS_LIST Flags: X - disabled, D - dynamic # LIST ADDRESS 0 ;;; !!1!! ACCESS_LIST 172.18.152.2 В логах сервера появляется: Код: 11-15/17:55:54 DEBUG [Thread-33] MikrotikGateWorker - run 11-15/17:55:54 DEBUG [Thread-33] MikrotikGateWorker - doParentSync 11-15/17:55:54 INFO [Thread-33] MikrotikGateWorker - Running script 11-15/17:55:54 DEBUG [Thread-33] MikrotikGateWorker - gate: x.x.x.x login: admin pswd: xxxxxxxxxxxx 11-15/17:55:55 DEBUG [http-8080-2] server - executing bitel.billing.server.ipn.action.ActionSetContractStatus; time => 1173 ms. 11-15/17:55:55 DEBUG [http-8080-2] server - executing bitel.billing.server.ipn.action.ActionGateContractInfo; time => 14 ms. 11-15/17:55:55 WARN [Thread-33] ScriptInstance - x.x.x.x:22[]: using deprecated method [public final java.lang.String ru.bitel.common.Preferences.getStringValue(java.lang.String,java.lang.String)] 11-15/17:55:55 INFO [Thread-33] MikrotikGateWorker - Process time => 1131 Но при закрытии шлюза ип договора не убирается из адресс-листа! При повторном открытии - добавляется старый ип к существующему в адресс-лист Пробовал удалять "where list=ACCESS_LIST", теже яйца... Подскажите пож-ста - что в коде скрипта не так ??? |
Автор: | ok-2004 [ 16 ноя 2011, 13:41 ] |
Заголовок сообщения: | Re: Скрипт стандартного шлюза Мikrotik по telnet для 5.1 |
дерзну апнуть тему, очень надо. Посмотрите ктонить - что в коде скрипта не правильно ??? |
Автор: | ok-2004 [ 23 дек 2011, 14:31 ] |
Заголовок сообщения: | Re: Скрипт стандартного шлюза Мikrotik по telnet для 5.1 |
Всёж с трудом , но накостылил такую конструкцию, правда по ссш: Код: import java.util.*; import java.util.regex.*; import ru.bitel.bgbilling.common.*; import bitel.billing.common.module.ipn.*; import bitel.billing.server.ipn.bean.*; import bitel.billing.server.ipn.*; import bitel.billing.server.util.ssh.*; import bitel.billing.server.util.*; import bitel.billing.server.util.ssh.SSHSession; import ru.bitel.bgbilling.modules.ipn.server.bean.command.GateCommandUtil; import bitel.billing.common.module.ipn.IPNContractStatus; protected void doSync() { host = gate.getHost(); port = gate.getPort(); gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); login = gateSetup.getStringValue( "login", "root" ); pswd = gate.getKeyword(); session = null; try { session = new SSHSessionExec( host, port, login, pswd ); for ( UserStatus status : statusList ) { Integer cid = status.contractId; if ( ruleExists( cid, status, session ) ) { if ( status.status > 0 ) { if ( status.status == IPNContractStatus.STATUS_REMOVED ) { rules = getDeleteRules( status ); for ( String rule : rules ) { session.command( rule ); } } else { rules = getCloseRules( status ); for ( String rule : rules ) { session.command( rule ); } } } } else if ( status.status == IPNContractStatus.STATUS_OPEN ) { rules = getOpenRules( status ); for ( String rule : rules ) { session.command( rule ); } } } } finally { if ( session != null ) { session.disconnect(); } } } private boolean ruleExists( Integer cid, UserStatus status, SSHSessionExec session ) throws Exception { String answer = session.command( "ip firewall address-list print without-paging where list=ACCESS_LIST" ); return answer.indexOf( "!!" + cid + "!!" ) >= 0; } private getOpenRules( status ) { return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" ); } private getCloseRules( status ) { return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" ); } private getDeleteRules( status ) { return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" ); } private getRules( status, template ) { rule = status.rule.getRuleText(); if ( status.ruleType != null ) { rule = generateRule( rule, status.gateType, status.ruleType, status.contractId ); } pattern = Pattern.compile( template, Pattern.DOTALL ); m = pattern.matcher( rule ); if ( m.find() ) { rule = m.group( 1 ); } rule.replaceAll( "\r", "" ); return rule.split( "\n" ); } private generateRule( addresses, gateType, ruleType, cid ) { String rule; replacements = new HashMap(); replacements.put( "\\{CID\\}", String.valueOf( cid ) ); ruleText = GateCommandUtil.getRule( gateType, ruleType ); rule = GateCommandUtil.generateRule( ruleText, addresses, replacements, ruleType ); return rule; } Странно, но даже работает. Но в логах видно, что БЖБ5.1 не всё нравится: Код: IPNTestGates - Gate: 192.168.120.247 : 4567 [ ipn_gate ] - checking end.. 12-23/06:15:11 WARN [pool-26-thread-1] ScriptInstance - 192.168.120.224:22[]: using deprecated method [public final java.lang.String ru.bitel.common.Preferences.getStringValue(java.lang.String,java.lang.String )] Ну тут я бессилен. Прошу помощи знатоков - что в этом скрипте можно подкрутить чтоб данный warning убрался ? |
Автор: | stark [ 28 дек 2011, 13:07 ] |
Заголовок сообщения: | Re: Скрипт стандартного шлюза Мikrotik по telnet для 5.1 |
ok-2004 писал(а): Странно, но даже работает. Но в логах видно, что БЖБ5.1 не всё нравится: Код: IPNTestGates - Gate: 192.168.120.247 : 4567 [ ipn_gate ] - checking end.. 12-23/06:15:11 WARN [pool-26-thread-1] ScriptInstance - 192.168.120.224:22[]: using deprecated method [public final java.lang.String ru.bitel.common.Preferences.getStringValue(java.lang.String,java.lang.String )] Ну тут я бессилен. Прошу помощи знатоков - что в этом скрипте можно подкрутить чтоб данный warning убрался ? Вот в этом куске Код: gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); login = gateSetup.getStringValue( "login", "root" ); используйте ru.bitel.bgbilling.server.util.DefaultServerSetup вместо bitel.billing.server.util.DefaultServerSetup и метод get( String key, String def ) вместо getStringValue( String key, String defaultValue ) |
Автор: | ok-2004 [ 28 дек 2011, 15:35 ] |
Заголовок сообщения: | Re: Скрипт стандартного шлюза Мikrotik по telnet для 5.1 |
большое спасибо!! |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |