forum.bitel.ru http://forum.bitel.ru/ |
|
Cisco2 шлюз + аналогичный Cisco2 свич http://forum.bitel.ru/viewtopic.php?f=7&t=4955 |
Страница 1 из 1 |
Автор: | Magistr [ 29 дек 2010, 10:50 ] |
Заголовок сообщения: | Cisco2 шлюз + аналогичный Cisco2 свич |
Шлюз user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoVlanContactRuleEditor gate_manager.class=bitel.billing.server.ipn.vlan.CiscoVlanParentGateWorker Код: [DEFAULT] [REMOVE] no vlan {VID} no interface vlan {VID} [/REMOVE] [OPEN] vlan {VID} interface vlan {VID} no shutdown <LOOP_NET> ip address {IP} {MASK} </LOOP_NET> exit [/OPEN] [CLOSE] shutdown vlan {VID} exit [/CLOSE] [/DEFAULT] На свиче вот такие команды и конфиг user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoSSHSwitchRuleEditor gate_manager.class=bitel.billing.server.ipn.vlan.CiscoSSHSwitchGateWorker use.script=1 Код: [DEFAULT] [OPEN] vlan database vlan {VID} <LOOP_PORT> interface ethernet {PORT} switchport access vlan {VID} exit interface ethernet g3 switchport trunk allowed vlan add {VID} </LOOP_PORT> [/OPEN] [CLOSE] no vlan {VID} <LOOP_PORT> interface ethernet {PORT} no switchport access vlan {VID} exit interface ethernet g3 no switchport trunk allowed vlan add {VID} </LOOP_PORT> [/CLOSE] [/DEFAULT] свич создается потомком шлюза .. при использовании скрипта из вики (для свича)... для длинка или cisco2 или zyxel нету обработки LOOP_PORT (видно при препросмотре правил) подскажите как модифицировать стандартный скрипт чтобы заработал свич .. ps железо cisco2811 + linksys srw228g4 |
Автор: | stark [ 29 дек 2010, 12:48 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Magistr писал(а): при использовании скрипта из вики (для свича)... для длинка или cisco2 или zyxel нету обработки LOOP_PORT (видно при препросмотре правил) подскажите как модифицировать стандартный скрипт чтобы заработал свич .. ps железо cisco2811 + linksys srw228g4 какой конкретно скрипт из wiki ? как вы забивали порты ? при просмотре правил - не зависит от скрипта , там правила формируются по дефолтной логике , ее может подменять скрипт при отправке на оборудование |
Автор: | Magistr [ 29 дек 2010, 14:06 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Вот эти ... http://wiki.bgbilling.ru/index.php/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%88%D0%BB%D1%8E%D0%B7%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D1%83%D1%82%D0%B0%D1%82%D0%BE%D1%80%D0%B0_Dlink_(%D0%BF%D0%BE%D0%B4_Cisco2)_%D0%BD%D0%B0_Beanshell http://wiki.bgbilling.ru/index.php/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D1%82%D0%B0%D0%BD%D0%B4%D0%B0%D1%80%D1%82%D0%BD%D0%BE%D0%B3%D0%BE_%D1%88%D0%BB%D1%8E%D0%B7%D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D1%83%D1%82%D0%B0%D1%82%D0%BE%D1%80%D0%B0_Zyxel_(%D0%BF%D0%BE%D0%B4_Cisco2)_%D0%BD%D0%B0_BeanShell в дебаг логе Код: 12-29/13:59:15 DEBUG [http-8080-1] JaxWS - executing ru.bitel.bgbilling.modules.ipn.server.WSRuleTypeLogImpl.logList; time => 1 ms. 12-29/13:59:20 DEBUG [http-8080-1] server - executing bitel.billing.server.ipn.action.ActionCiscoVlanGenerateRule; time => 3 ms. 12-29/13:59:20 DEBUG [http-8080-1] server - <?xml version="1.0" encoding="UTF-8"?> <data secret="3FC190D695B697EC70C9248E195F694F" status="ok"> <rule> <row text="[REMOVE]"/> <row text=" no vlan {VID}"/> <row text=" no interface vlan {VID}"/> <row text="[/REMOVE]"/> <row text="[OPEN]"/> <row text=" vlan {VID}"/> <row text=" interface vlan {VID}"/> <row text=" no shutdown"/> <row text=" ip address 192.168.100.0 255.255.255.0"/> <row text=" exit"/> <row text="[/OPEN]"/> <row text="[CLOSE]"/> <row text=" shutdown vlan {VID}"/> <row text=" exit"/> <row text="[/CLOSE]"/> </rule> </data> 12-29/13:59:20 DEBUG [http-8080-1] server - executing bitel.billing.server.ipn.action.ActionCiscoSSHSwitchGenerateRule; time => 8 ms. 12-29/13:59:20 DEBUG [http-8080-1] server - <?xml version="1.0" encoding="UTF-8"?> <data secret="300AC32FF3D73B5E9EB1E15DCED745E2" status="ok"> <rule> <row text="[OPEN]"/> <row text="vlan database"/> <row text=" vlan {VID}"/> <row text="[/OPEN]"/> <row text="[CLOSE]"/> <row text="no vlan {VID}"/> <row text="[/CLOSE]"/> </rule> </data> Порты на вкладке шлюзы .. добавлял .. после добавления шлюза ничего не менялось. а где еще можно забить порт для договора ? ps вилан также добавлен на вкладке ресурсы vlan |
Автор: | stark [ 24 янв 2011, 14:29 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
LOOP_PORT работать не будет ..Оно предназначено для работы с шлюзом zyxel(там в редакторе есть порты ) . Это надо скрипт переписывать чтобы он брал порты со вкладки "порты" |
Автор: | Magistr [ 25 янв 2011, 10:34 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
stark писал(а): LOOP_PORT работать не будет ..Оно предназначено для работы с шлюзом zyxel(там в редакторе есть порты ) . Это надо скрипт переписывать чтобы он брал порты со вкладки "порты" потому и был вопрос как модифицировать скрипт |
Автор: | stark [ 25 янв 2011, 12:30 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Magistr писал(а): stark писал(а): LOOP_PORT работать не будет ..Оно предназначено для работы с шлюзом zyxel(там в редакторе есть порты ) . Это надо скрипт переписывать чтобы он брал порты со вкладки "порты" потому и был вопрос как модифицировать скрипт Надо Использовать Код: GateCommandUtil.generateRule(java.lang.String ruleText, java.util.Map<java.lang.String,java.lang.String> replacements, RuleType ruleType, java.util.List<LoopPattern> loops) Где loops - это список обектов LoopPattern , туда надо поместить порты ..Нужно его заполнить .. Чтобы считать порты можно использовать GatePortManager Какой-то пример работы с loops есть тут |
Автор: | Magistr [ 24 мар 2011, 16:12 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
А возможно сделать такой макрос типа {IP1} выдающий первый адрес в подсети в теге <LOOP_NET> т.е сетка 192.168.1.0/24 это {IP}=192.168.1.0 {IP1}=192.168.1.1 |
Автор: | stark [ 28 мар 2011, 12:55 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Magistr писал(а): А возможно сделать такой макрос типа {IP1} выдающий первый адрес в подсети в теге <LOOP_NET> т.е сетка 192.168.1.0/24 это {IP}=192.168.1.0 {IP1}=192.168.1.1 зачем ? Что значит первый ? почему не второй например ? |
Автор: | Magistr [ 29 мар 2011, 08:22 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
stark писал(а): Magistr писал(а): А возможно сделать такой макрос типа {IP1} выдающий первый адрес в подсети в теге <LOOP_NET> т.е сетка 192.168.1.0/24 это {IP}=192.168.1.0 {IP1}=192.168.1.1 зачем ? Что значит первый ? почему не второй например ? Ну например int vlan 200 ip address 192.168.200.1 255.255.255.192 у нас указывается адрес шлюза для вилана .. ну и vlan per client и /26 сетка на клиента .. которые юр лица обычно мм ну да в общем случае и Nй интересует |
Автор: | stark [ 31 мар 2011, 17:14 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Так же можно сделать скриптовым шлюзом |
Автор: | Magistr [ 04 апр 2011, 13:14 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Заполнил LoopPattern для gate_ip , возник вопрос где и что указать чтобы использовалась замена {GATE_IP} описаная для луппаттерна Скрипт шлюза user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoVlanContactRuleEditor gate_manager.class=bitel.billing.server.ipn.vlan.CiscoVlanGateWorker Код: import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.StringTokenizer; import bitel.billing.common.module.ipn.IPNContractStatus; import bitel.billing.server.ipn.GateWorker; import bitel.billing.server.ipn.UserStatus; import ru.bitel.bgbilling.modules.ipn.server.bean.command.*; import bitel.billing.server.ipn.bean.VlanManager; import bitel.billing.server.util.DefaultServerSetup; import bitel.billing.server.util.Utils; import bitel.billing.server.util.telnet.TelnetSession; import ru.bitel.bgbilling.common.DefaultSetup; import bitel.billing.common.IPUtils; import bitel.billing.server.ipn.bean.GateType; import bitel.billing.server.ipn.bean.RuleType; import bitel.billing.server.ipn.bean.VlanManager; import bitel.billing.server.util.Utils; import bitel.billing.server.util.telnet.TelnetSession; import bitel.billing.server.ipn.bean.AddressRange; import bitel.billing.server.ipn.bean.AddressRangeManager; import ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern.*; import ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern; protected void doSync() { try { log.info( "start of cisco........................................................"); host = gate.getHost(); port = gate.getPort(); DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); pswdLogin = gateSetup.getStringValue("login"); pswdCfg = gateSetup.getStringValue( "cfg.pswd"); timeout = gateSetup.getIntValue( "timeout", 0 ); result = new StringBuffer(); if( log.isDebugEnabled() ) { log.debug( gate.getId() + " gate: " + host + ":" + port + " pswdLogin: " + pswdLogin + " pswdCfg: " + pswdCfg ); } session = new TelnetSession( host, port); session.setTimeout( timeout ); session.setLoginPromptSequence( ":" ); session.connect(); session.setLoginPromptSequence( ":" ); result.append( session.doCommand( pswdLogin ) ); session.setLoginPromptSequence( ":" ); result.append( session.doCommand( pswdCfg ) ); result.append( session.doCommand( "terminal length 0" ) ); result.append( session.doCommand( "terminal width 0" ) ); session.setLoginPromptSequence( ": " ); result.append( session.doCommand( "enable" ) ); session.setLoginPromptSequence( "#" ); result.append( session.doCommand( pswdCfg ) ); result.append( session.doCommand( "configure terminal" ) ); log.debug( "execute commands" ); doCommands( session, result); result.append( session.doCommand( "exit" ) ); session.doCommandAsync( "exit" ); log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); log.info( result ); log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); log.debug( "ok" ); } catch (Exception e) { throw new RuntimeException ( e ); } log.info( "end of cisco........................................................"); } protected void add() { } private void doCommands( TelnetSession session, StringBuffer result) throws IOException { for( UserStatus status : statusList ) { date = new GregorianCalendar(); VlanManager manager = new VlanManager(status.mid, con); gateId = gate.getId(); log.info("gateId=" + gateId); vid = manager.getVlan( gateId, status.contractId ); log.info("vid=" + vid); AddressRangeManager man = new AddressRangeManager( con, status.mid ); addressList = man.getContractAddressRange( status.contractId , date, -1 ); AddressRange range = addressList.get(0); AddressRange range1 = addressList.get(1); //gate_ip = IPUtils.convertLongIpToString(range.getAddr1()+1); ArrayList gate_ipt = new ArrayList(); gate_ipt.add(IPUtils.convertLongIpToString( range.getAddr1()+1)); gate_ipt.add(IPUtils.convertLongIpToString( range1.getAddr1()+1)); log.info("gate_ip=" + gate_ipt); List loops = GateCommandUtil.getAddresLoops( String.valueOf(gate_ipt) ); List rep= new ArrayList(); rep.add("\\{GATE_IP\\}"); LoopPattern gate_ip= new LoopPattern(); gate_ip=loops.get(0); gate_ip.setLoopPatern( "LOOP_NET" ); gate_ip.setReplacements( rep ); log.info("rep " + gate_ip.getReplacements()); // log.info(String.valueOf(gate_ip.get(0))); //TODO - подумать что сделать справилами на добавление rules = null; if (status.status == IPNContractStatus.STATUS_OPEN) { rules = getOpenRules( status, vid, gate_ip ); } else if (status.status == IPNContractStatus.STATUS_REMOVED) { rules = getRemoveRules( status, vid,gate_ip ); } //if closed and etc else { rules = getCloseRules( status, vid,gate_ip ); } if (vid > 0) { for ( String rule : rules ) { result.append( session.doCommand( rule ) ); } } } } getOpenRules( status, vid,gate_ip ) { return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]", vid ,gate_ip); } getCloseRules( status, vid,gate_ip ) { return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", vid,gate_ip ); } getRemoveRules( UserStatus status, int vid ,gate_ip) { return getRules( status, "\\[REMOVE\\](.*)\\[/REMOVE\\]", vid ,gate_ip ); } getRules( status, template, vid, gate_ip ) { // пользовательское правило, без типа - то все оставляем как есть rule = status.rule.getRuleText(); log.info("rule=" + rule); //типизированное правило if( status.ruleType != null ) { rule = generateRule( rule, status.gateType, status.ruleType, vid, gate_ip ); } log.info("rule=" + rule); pattern = Pattern.compile( template, Pattern.DOTALL ); m = pattern.matcher( rule ); if (m.find()) { rule = m.group( 1 ); } rule.replaceAll( "\r", "" ); parts = rule.split( "\n" ); result = new ArrayList(); for ( String part : parts ) { if ( !Utils.isEmptyString( part )) { result.add( part ); } } return result; } generateRule( addresses, gateType, ruleType, int vid, gate_ip ) { ruleText = GateCommandUtil.getRule( gateType, ruleType ); replacements = new HashMap (); if ( vid > 0) { replacements.put( "\\{VID\\}", String.valueOf( vid ) ); // replacements.put( "\\{GATE_IP\\}", String.valueOf(gate_ip)); } return GateCommandUtil.generateRule( ruleText, addresses, replacements, ruleType); } Команды Код: [DEFAULT]
[OPEN] vlan {VID} no shutdown vlan {VID} interface vlan {VID} <LOOP_NET> ip address {GATE_IP} {MASK} </LOOP_NET> ip access-list extended Access{VID} <LOOP_NET> permit ip any {IP} {MASK_WILD} </LOOP_NET> class-map match-all Access{VID} match access-group name Access{VID} policy-map PM class Access{VID} police ${speed} 8000 exceed-action drop [/OPEN] [CLOSE] shutdown vlan {VID} exit [/CLOSE] [REMOVE] no vlan {VID} no interface vlan {VID} no ip access-list extended Access{VID} policy-map PM no class Access{VID} no class-map Access{VID} [/REMOVE] [/DEFAULT] |
Автор: | stark [ 05 апр 2011, 16:22 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Вам нужно только изменить функцию generateRule. Код: generateRule( addresses, gateType, ruleType, int vid )
{ ruleText = GateCommandUtil.getRule( gateType, ruleType ); List loops = GateCommandUtil.getAddresLoops( ruleText ); for ( LoopPattern pattern : loops ) { if ( patterm.getLoopPattern().equals( "LOOP_NET" ) ) { pattern.getReplacements().add( "GATE_IP" ); for ( List list : pattern.getObjects() ) { String address = list.get( 0 ); long la = long IPUtils.convertStringIPtoLong( address ); list.add( IPUtils.convertLongIpToString( la + 1 ); } break; } } replacements = new HashMap (); if ( vid > 0) { replacements.put( "\\{VID\\}", String.valueOf( vid ) ); } return GateCommandUtil.generateRule( ruleText, replacements, ruleType, loops ); } |
Автор: | stark [ 05 апр 2011, 16:22 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
для лучшего понимания выложил исходник GateCommandUtil http://wiki.bgbilling.ru/index.php/%D0% ... ommandUtil |
Автор: | Magistr [ 06 апр 2011, 11:21 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
хм странный затык 04-06/12:18:26 INFO [Thread-24] CiscoVlanGateWorker - Pattern ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern@7aca2076 04-06/12:18:26 ERROR [Thread-24] CiscoVlanGateWorker - Eval error2: Error in method invocation: Method getLoopPattern() not found in class'ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern' Error in method invocation: Method getLoopPattern() not found in class'ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern' : at Line: 222 : in file: inline evaluation of: ``import java.io.IOException; import java.util.ArrayList; import java.util.HashMap . . . '' : pattern .getLoopPattern ( ) вот на этом коде Код: log.info("Pattern " + pattern);
if ( pattern.getLoopPattern().equals( "LOOP_NET" ) ) { |
Автор: | stark [ 06 апр 2011, 17:53 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Magistr писал(а): хм странный затык 04-06/12:18:26 INFO [Thread-24] CiscoVlanGateWorker - Pattern ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern@7aca2076 04-06/12:18:26 ERROR [Thread-24] CiscoVlanGateWorker - Eval error2: Error in method invocation: Method getLoopPattern() not found in class'ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern' Error in method invocation: Method getLoopPattern() not found in class'ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern' : at Line: 222 : in file: inline evaluation of: ``import java.io.IOException; import java.util.ArrayList; import java.util.HashMap . . . '' : pattern .getLoopPattern ( ) вот на этом коде Код: log.info("Pattern " + pattern); if ( pattern.getLoopPattern().equals( "LOOP_NET" ) ) { Метод неправильно назван оказывается . getLoopPatern() |
Автор: | madmax [ 07 июн 2011, 23:03 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Что-то не работает скрипт на версии 5.1. Прописали Код: print("1="+pattern.getReplacements().add( "GATE_IP" )); выводит 1=true. Почему так пишет? |
Автор: | stark [ 08 июн 2011, 17:53 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
madmax писал(а): Что-то не работает скрипт на версии 5.1. Прописали Код: print("1="+pattern.getReplacements().add( "GATE_IP" )); выводит 1=true. Почему так пишет? метод add у класса List - возвращает boolean, успешно добавлен в лист или не успешно |
Автор: | madmax [ 08 июн 2011, 18:27 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Тогда почему скрипт не отрабатывает на шлюзе. Стоит такая настройка Код: [OPEN] vlan {VID} interface Vlan {VID} description Billing {GATE_IP} ip vrf forwarding InternetUnlim <LOOP_NET> ip address {GATE_IP} 255.255.255.252 </LOOP_NET> exit [/OPEN] В итоге скрипт отрабатывает без ошибок, но на свиче адрес так и не прописывается. Делаю проверку Код: for ( List list : pattern.getObjects() ) { String address = list.get( 0 ); long la = IPUtils.convertStringIPtoLong( address ); print ("qqq"+la); list.add( IPUtils.convertLongIpToString( la + 1 )); Но в логах ничего не выходит. даже qqq не появляется. Получается он в коде вообще не доходит до вывода лога. |
Автор: | Magistr [ 09 июн 2011, 09:16 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Финальная версия скрипта плюс я доработал библиотечку дописать пару строк оказалось проще ) кстати у вас возникнет проблема например то что для второй подсетки в вилане надо указывать secondary .. и надо будет эту ситуацию разрулить.. скрипт Код: import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.StringTokenizer; import bitel.billing.common.module.ipn.IPNContractStatus; import bitel.billing.server.ipn.GateWorker; import bitel.billing.server.ipn.UserStatus; import ru.bitel.bgbilling.modules.ipn.server.bean.command; //import ru.bitel.bgbilling.modules.ipn.server.bean.command.GateCommandUtil; import ru.bitel.bgbilling.modules.ipn.server.bean.command.LoopPattern; import bitel.billing.server.ipn.bean.VlanManager; import bitel.billing.server.util.DefaultServerSetup; import bitel.billing.server.util.Utils; import bitel.billing.server.util.telnet.TelnetSession; import ru.bitel.bgbilling.common.DefaultSetup; import bitel.billing.common.IPUtils; import bitel.billing.server.ipn.bean.GateType; import bitel.billing.server.ipn.bean.RuleType; import ru.bitel.bgbilling.modules.ipn.common.bean.AddressRangeManager; import ru.bitel.common.Preferences; includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/gateCommandUtiltt" ); protected void doSync() { try { log.info( "start of cisco........................................................"); host = gate.getHost(); port = gate.getPort(); DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); pswdLogin = gateSetup.getStringValue("login"); pswdCfg = gateSetup.getStringValue( "cfg.pswd"); timeout = gateSetup.getIntValue( "timeout", 0 ); result = new StringBuffer(); if( log.isDebugEnabled() ) { log.debug( gate.getId() + " gate: " + host + ":" + port + " pswdLogin: " + pswdLogin + " pswdCfg: " + pswdCfg ); } log.info( "start of cisco......"); session = new TelnetSession( host, port); session.setTimeout( timeout ); session.setLoginPromptSequence( ":" ); session.connect(); session.setLoginPromptSequence( ":" ); log.info( "log seq......" + pswdLogin); result.append( session.doCommand( pswdLogin ) ); log.info( "login" ); session.setLoginPromptSequence( ">" ); log.info( "pass1" ); result.append( session.doCommand( pswdCfg ) ); log.info( "pass2" ); session.setLoginPromptSequence( ">" ); result.append( session.doCommand( "terminal length 0" ) ); result.append( session.doCommand( "terminal width 0" ) ); log.info( "term" ); session.setLoginPromptSequence( ":" ); result.append( session.doCommand( "enable" ) ); log.info( "en" ); session.setLoginPromptSequence( "#" ); result.append( session.doCommand( pswdCfg ) ); log.info( "pass" ); session.setLoginPromptSequence( "#" ); result.append( session.doCommand( "configure terminal" ) ); log.info( "conf" ); log.debug( "execute commands" ); doCommands( session, result); log.info( "exec" ); result.append( session.doCommand( "exit" ) ); session.doCommandAsync( "exit" ); log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); log.info( result ); log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); log.debug( "ok" ); } catch (Exception e) { throw new RuntimeException ( e ); } log.info( "end of cisco........................................................"); } protected void add() { } private void doCommands( TelnetSession session, StringBuffer result) throws IOException { for( UserStatus status : statusList ) { date = new GregorianCalendar(); VlanManager manager = new VlanManager(status.mid, con); gateId = gate.getId(); log.info("gateId=" + gateId); vid = manager.getVlan( gateId, status.contractId ); log.info("vid=" + vid); //TODO - подумать что сделать справилами на добавление rules = null; if (status.status == IPNContractStatus.STATUS_OPEN) { rules = getOpenRules( status, vid ); } else if (status.status == IPNContractStatus.STATUS_REMOVED) { rules = getRemoveRules( status, vid ); } //if closed and etc else { rules = getCloseRules( status, vid); } if (vid > 0) { for ( String rule : rules ) { result.append( session.doCommand( rule ) ); } } } } getOpenRules( status, vid ) { return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]", vid ); } getCloseRules( status, vid ) { return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", vid ); } getRemoveRules( UserStatus status, int vid ) { return getRules( status, "\\[REMOVE\\](.*)\\[/REMOVE\\]", vid ); } getRules( status, template, vid ) { // пользовательское правило, без типа - то все оставляем как есть rule = status.rule.getRuleText(); log.info("rule=" + rule); //типизированное правило if( status.ruleType != null ) { rule = generateRule( rule, status.gateType, status.ruleType, vid); } log.info("rule=" + rule); pattern = Pattern.compile( template, Pattern.DOTALL ); m = pattern.matcher( rule ); if (m.find()) { rule = m.group( 1 ); } rule.replaceAll( "\r", "" ); parts = rule.split( "\n" ); result = new ArrayList(); for ( String part : parts ) { if ( !Utils.isEmptyString( part )) { result.add( part ); } } return result; } generateRule( addresses, gateType, ruleType, int vid ) { ruleText = getRule( gateType, ruleType ); replacements = new HashMap (); if ( vid > 0) { replacements.put( "\\{VID\\}", String.valueOf( vid ) ); } return generateRule( ruleText, addresses, replacements, ruleType); } Либа Код: private static StringBuffer processBlock( String ruleText, LoopPattern loopPattern )
{ StringBuffer result = new StringBuffer(); List items = new ArrayList( 10 ); Map letterMaxNumbers = new HashMap(); Pattern pattern = Pattern.compile( "\\{([A-Z]+)(\\d+)\\}" ); Matcher m = pattern.matcher( ruleText ); while( m.find() ) { String letter = m.group( 1 ); int number = Utils.parseInt( m.group( 2 ), 0 ); PatternItem item = new PatternItem(); item.number = number; item.letter = letter; items.add( item ); Integer maxNumber = letterMaxNumbers.get( letter ); if( maxNumber == null || maxNumber < number ) { letterMaxNumbers.put( letter, number ); } } final int size = loopPattern.getObjects().size(); for( int i = 0; i < size; i++ ) { //String address = IPUtils.convertLongIpToString( Utils.parseLong( addreses[i], 0 ) ); String addressRule = new String( ruleText ); for( PatternItem item : items ) { int number = i*(letterMaxNumbers.get( item.letter ) + 1) + item.number; addressRule = addressRule.replaceAll( "\\{" + item.letter + item.number + "\\}", "{" + item.letter + number + "}" ); } String str = addressRule; for ( int j = 0; j < loopPattern.getReplacements().size(); j ++) { String key = loopPattern.getReplacements().get( j ); String value = loopPattern.getObjects().get( i ).get( j ); str = str.replaceAll( key, value ); } result.append( str ); } return result; } /** * Формирует команды для шлюза. * @param ruleText * @param addressList * @param replacements * @param ruleType * @return */ public static final String generateRule( String ruleText, String addressList, Map replacements, RuleType ruleType ) { List loops = getAddresLoops( addressList ); return generateRule( ruleText, replacements, ruleType, loops); } /** * строку адреса преобразует в 2 LoopPattern-а : для диапазонов и сетей * @param addressList * @return */ public static List getAddresLoops( String addressList ) { String[] parts = addressList.split( ";" ); List replacements = new ArrayList(); replacements.add ( "\\{A\\}" ); List objects = new ArrayList(); if ( parts.length > 0 && !Utils.isEmptyString( parts[0] ) ) { String[] addrs = parts[0].split( "\\s*,\\s*" ); if ( addrs.length > 0) { for ( int i = 0; i < addrs.length; i++) { String address = IPUtils.convertLongIpToString( Utils.parseLongString( addrs[i], 0 ) ); log.info("address " + address); List list = new ArrayList(); list.add( address ); objects.add( list ); } } } List loops =new ArrayList(); //адреса LoopPattern p = new LoopPattern(); p.setLoopPatern( "LOOP" ); p.setReplacements( replacements ); p.setObjects( objects ); loops.add( p ); replacements = new ArrayList(); replacements.add ( "\\{IP\\}" ); replacements.add ( "\\{MASK\\}" ); replacements.add ( "\\{MASK_WILD\\}" ); replacements.add ( "\\{MASK_BIT\\}" ); replacements.add ( "\\{GATE_IP\\}" ); objects = new ArrayList(); //String[] nets = new String [0]; //String[] net_masks = new String [0]; if ( parts.length > 1 && !Utils.isEmptyString( parts[1] ) ) { String[] nets = parts[1].split( "\\s*,\\s*" ); if ( nets.length > 0) { for ( int i = 0; i < nets.length; i++) { String[] parts2 = nets[i].split( "/" ); if ( parts2.length == 2) { String address = IPUtils.convertLongIpToString( Utils.parseLongString( parts2[0], 0 ) ); String maskBit = parts2[1]; long mask = ( 0xFFFFFFFFl << ( 32 - Utils.parseIntString( maskBit, 0 ) ) ) & 0xFFFFFFFFl; long maskWild = mask ^ 0xFFFFFFFFl; List list = new ArrayList(); list.add( address ); list.add( IPUtils.convertLongIpToString( mask ) ); list.add( IPUtils.convertLongIpToString( maskWild ) ); list.add( maskBit ); list.add( IPUtils.convertLongIpToString( IPUtils.convertStringIPtoLong(address) + 1 )); objects.add( list ); log.info("list " + list); } } } } //сети p = new LoopPattern(); p.setLoopPatern( "LOOP_NET" ); p.setReplacements( replacements ); p.setObjects( objects ); loops.add( p ); return loops; } /** * Формирует команды для шлюза. * @param ruleText * @param replacements * @param ruleType * @param loops * @return */ public static final String generateRule( String ruleText, Map replacements, RuleType ruleType, List loops) { StringBuffer resultBuf = null; for ( LoopPattern loop : loops) { resultBuf = new StringBuffer(); String loopPattern = "(<LOOP>.*?</LOOP>)?(.*?)<LOOP>(.*?)</LOOP>"; loopPattern = loopPattern.replaceAll( "LOOP", loop.getLoopPatern() ); Pattern pattern = Pattern.compile( loopPattern, Pattern.DOTALL ); Matcher m = pattern.matcher( ruleText ); boolean find = false; while( m.find() ) { find = true; String block = m.group( 3 ); block = processBlock( block, loop ).toString(); resultBuf.append( m.group( 2 ) ); resultBuf.append( block ); } if (find) { //хвост(ищем жадным алгоритмом) или если вообще нет ни одного цикла loopPattern = "(?:<LOOP>(?:.*)</LOOP>)(.*)\\z"; loopPattern = loopPattern.replaceAll( "LOOP", loop.getLoopPatern() ); pattern = Pattern.compile( loopPattern, Pattern.DOTALL ); m = pattern.matcher( ruleText ); if( m.find() ) { resultBuf.append( m.group( 1 ) ); } } else { resultBuf = new StringBuffer( ruleText ); } //пошли по второму и т.п заходу ruleText = resultBuf.toString(); } String result = resultBuf.toString(); result = result.replaceAll( "<ver 2\\.0/>", "" ); //убиваем пустые строки result = result.replaceAll( "\r", "" ); result = result.replaceAll( "\n\\s*\n", "\n" ); result = result.replaceAll( "(\n){2,}", "\n" ); result = result.trim(); String ruleData = ruleType.getData(); ruleData.replaceAll( "\r", "\n" ); ruleData = ruleData.trim(); Preferences setup = new DefaultSetup( ruleData, "\n"); //получаем все значения Map values = setup.getHashValuesWithPrefix( "" ); if( replacements == null) { replacements = new HashMap(); } for (Map.Entry entry : values.entrySet()) { String key = "\\$\\{" + entry.getKey() + "\\}"; replacements.put( key, entry.getValue() ); } if (replacements != null) { for (Map.Entry rep : replacements.entrySet()) { //result = result.replaceAll( "\\{CID\\}", String.valueOf( cid ) ); result = result.replaceAll( rep.getKey(), rep.getValue() ); } } return result.toString(); } private static class PatternItem { public String letter; public int number; } /** * Получает команды для шлюза в непереработанном виде. * @param gateType * @param ruleType * @return */ public static String getRule( GateType gateType, RuleType ruleType ) { String result = ""; String template = "\\[RULE ID=\"((?:\\d+,*)+)\"\\](.*?)\\[/RULE\\]"; Pattern pattern = Pattern.compile( template, Pattern.DOTALL ); Matcher m = pattern.matcher( gateType.getRule() ); while( m.find() ) { String idsStr = m.group(1); String rule = m.group( 2 ); int[] ids = parseIds( idsStr ); for (int i = 0; i < ids.length; i++) { if (ruleType.getId() == ids [i] ) { return rule; } } } //default template = "\\[DEFAULT\\](.*)\\[/DEFAULT\\]"; pattern = Pattern.compile( template, Pattern.DOTALL ); m = pattern.matcher( gateType.getRule() ); if( m.find() ) { String rule = m.group( 1 ); return rule; } return result; } private static int[] parseIds( String idsStr ) { String[] strs = idsStr.split( "," ); int[] result = new int [strs.length]; for (int i = 0; i < strs.length; i++) { result[i] = Integer.parseInt( strs[i]); } return result; } |
Автор: | madmax [ 18 июл 2011, 23:08 ] |
Заголовок сообщения: | Re: Cisco2 шлюз + аналогичный Cisco2 свич |
Может подскажите почему при таком запросе в принте выходит list=0.0.0.0. Хотя на шлюзе все прописано и адреса указаны. Код: generateRule( addresses, gateType, ruleType, int vid )
{ ruleText = GateCommandUtil.getRule( gateType, ruleType ); List loops = GateCommandUtil.getAddresLoops( ruleText ); for ( LoopPattern pattern : loops ) { pattern.getReplacements().add( "GATE_IP" ); for ( List list : pattern.getObjects() ) { print("list="+list); } } } |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |