Реализация стандартного шлюза Cisco2 на BeanShell
Материал из BiTel WiKi
Версия от 09:42, 30 сентября 2008; Victor (Обсуждение | вклад)
конфигурация типа шлюза :
user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoVlanContactRuleEditor gate_manager.class=bitel.billing.server.ipn.vlan.CiscoVlanGateWorker use.script=1
Примеры команд шлюза :
[DEFAULT] [REMOVE] no vlan {VID} no interface Vlan {VID} [/REMOVE] [OPEN] vlan {VID} interface Vlan {VID} no shutdown ip unnumbered gi2/1 ip helper-address 192.168.0.183 exit [/OPEN] [CLOSE] interface Vlan {VID} shutdown exit [/CLOSE] [/DEFAULT]
Шлюз управляется по telnet. Код :
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 bitel.billing.common.module.ipn.IPNContractStatus; import bitel.billing.server.ipn.GateWorker; import bitel.billing.server.ipn.UserStatus; import bitel.billing.server.ipn.bean.ManadUtils; 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.OperationTimedoutException; import bitel.billing.server.util.telnet.TelnetSession; protected void doSync() { try { log.info( "start of cisco........................................................"); String host = gate.getHost(); int port = gate.getPort(); DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); String pswdLogin = gate.getKeyword(); String pswdCfg = gateSetup.getStringValue( "cfg.pswd"); StringBuffer result = new StringBuffer(); if( log.isDebugEnabled() ) { log.debug( gate.getId() + " gate: " + host + ":" + port + " pswdLogin: " + pswdLogin + " pswdCfg: " + pswdCfg ); } //TODO - завершающте символы вытащить в конфиг TelnetSession session = new TelnetSession( host, port); session.setLoginPromptSequence( ":" ); session.connect(); session.setLoginPromptSequence( ">" ); result.append( session.doCommand( pswdLogin ) ); 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); //TODO commands here result.append( session.doCommand( "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, OperationTimedoutException { for( UserStatus status : statusList ) { VlanManager manager = new VlanManager(status.mid, con); gateId = gate.getId(); log.info("gateId=" + gateId); vid = manager.getVlan( gateId, status.contractId ); log.info("vid=" + vid); int cid = status.contractId; //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 ) ); } } } } private List getOpenRules( UserStatus status, int vid ) { return getRules( status, "\\[OPEN\\]((.|\n)*)\\[/OPEN\\]", vid ); } private List getCloseRules( UserStatus status, int vid ) { return getRules( status, "\\[CLOSE\\]((.|\n)*)\\[/CLOSE\\]", vid ); } private List getRemoveRules( UserStatus status, int vid ) { return getRules( status, "\\[REMOVE\\]((.|\n)*)\\[/REMOVE\\]", vid ); } private List getRules( UserStatus status, String template, int vid ) { // пользовательское правило, без типа - то все оставляем как есть rule = status.rule.getRuleText(); log.info("rule=" + rule); //типизированное правило if( status.ruleType != null ) { log.info("222222"); ruleText = ManadUtils.getRule( status.gateType, status.ruleType ); log.info("ruleText=" + ruleText); Map replacements = new HashMap (); replacements.put( "\\{VID\\}", String.valueOf( vid ) ); rule = ManadUtils.generateRule( ruleText, status.rule.getRuleText(), replacements, status.ruleType ); } log.info("1111"); log.info("rule=" + rule); Pattern pattern = Pattern.compile( template ); Matcher m = pattern.matcher( rule ); if (m.find()) { rule = m.group( 1 ); } rule.replaceAll( "\r", "" ); parts = rule.split( "\n" ); List result = new ArrayList(); for ( String part : parts ) { if ( !Utils.isEmptyString( part )) { result.add( part ); } } return result; }