Реализация шлюза коммутатора Dlink (под Cisco2) на Beanshell
Материал из BiTel WiKi
(Различия между версиями)
												
			
		| Stark  (Обсуждение | вклад) | Stark  (Обсуждение | вклад)   (убрал OperationTimedoutException) | ||
| (6 промежуточных версий не показаны.) | |||
| Строка 1: | Строка 1: | ||
| + | Данный скриптовый шлюз сделан как замена шлюза Zyxel, работающего с Cisco2.  | ||
| конфигурация типа шлюза : | конфигурация типа шлюза : | ||
| Строка 21: | Строка 22: | ||
| import bitel.billing.common.module.ipn.IPNContractStatus; | import bitel.billing.common.module.ipn.IPNContractStatus; | ||
| import bitel.billing.server.ipn.UserStatus; | import bitel.billing.server.ipn.UserStatus; | ||
| - | |||
| - | |||
| import bitel.billing.server.ipn.dlink.UserPortStatus; | import bitel.billing.server.ipn.dlink.UserPortStatus; | ||
| import bitel.billing.server.util.DefaultServerSetup; | import bitel.billing.server.util.DefaultServerSetup; | ||
| import bitel.billing.server.util.Utils; | import bitel.billing.server.util.Utils; | ||
| - | |||
| import bitel.billing.server.util.telnet.TelnetSession; | import bitel.billing.server.util.telnet.TelnetSession; | ||
| + | import bitel.billing.server.ipn.bean.*; | ||
| protected void doSync() | protected void doSync() | ||
| Строка 96: | Строка 95: | ||
| private void doCommands( TelnetSession session, StringBuffer result, DefaultServerSetup gateSetup)   | private void doCommands( TelnetSession session, StringBuffer result, DefaultServerSetup gateSetup)   | ||
| - | throws IOException | + | throws IOException | 
| { | { | ||
| Строка 146: | Строка 145: | ||
| - | + | getRules(  status, template, vid ) | |
| - | + | ||
| { | { | ||
| - | + |         // пользовательское правило, без типа - то все оставляем как есть | |
| - | + | 	rule = status.rule.getRuleText(); | |
| - | + | ||
| - | + |         //порты идут до #, а адреса идут после   | |
| - | + | 	String [] parts  = rule.split( "#" ); | |
| - | + | 	portsStr = ""; | |
| - | + | 	addresesStr = ""; | |
| - | + | ||
| - | + | 	if ( parts.length > 0 ) | |
| 	{ | 	{ | ||
| - | + | 	    portsStr = parts[0]; | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| 	} | 	} | ||
| - | + | ||
| - | + | 	if ( parts.length > 1 ) | |
| - | + | ||
| 	{ | 	{ | ||
| - | + | 	   addresesStr = parts[1]; | |
| - | 	}	 | + | 	} | 
| - | + | ||
| - | + | ||
| - | + | ||
| 	//типизированное правило | 	//типизированное правило | ||
| - | 	if( status.ruleType != null ) | + | 	if( status.ruleType != null )	 | 
| - | + | 	{			       	     | |
| - | 	{	 | + |             rule = generateRule( addresesStr, portsStr, vid, status.gateType, status.ruleType ); | 
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| 	} | 	} | ||
| - | + | ||
| - | + | ||
| - | + |         pattern = Pattern.compile( template, Pattern.DOTALL ); | |
| - | + | 	m = pattern.matcher( rule ); | |
| 	if (m.find()) | 	if (m.find()) | ||
| 	{ | 	{ | ||
| - | + | 	    rule = m.group( 1 ); | |
| 	}		 | 	}		 | ||
| - | + | ||
| 	rule.replaceAll( "\r", "" ); | 	rule.replaceAll( "\r", "" ); | ||
| - | |||
| - | |||
| 	parts  = rule.split( "\n" ); | 	parts  = rule.split( "\n" ); | ||
| - | + | ||
| - | + | ||
| 	return parts; | 	return parts; | ||
| }		 | }		 | ||
| + | |||
| + |         generateRule(  addreses, ports, vid, gateType, ruleType  ) | ||
| + | 	{		 | ||
| + | 	        ports_ = getPorts( ports );		 | ||
| + | |||
| + | 		ruleText = ManadUtils.getRule( gateType, ruleType ); | ||
| + | |||
| + | 		replacements =  new HashMap(); | ||
| + | |||
| + | 		if ( vid > 0) | ||
| + | 		{ | ||
| + | 			replacements.put( "\\{VID\\}", String.valueOf( vid ) );				 | ||
| + | 		}	 | ||
| + | |||
| + | 		loops = ManadUtils.getAddresLoops( addreses ); | ||
| + | |||
| + | 		//адреса | ||
| + | 		p = new LoopPattern();		 | ||
| + | 		p.setLoopPatern( "LOOP_PORT" ); | ||
| + | 		p.setReplace( "\\{PORT\\}" ); | ||
| + | 		p.setObjects( ports_ );		 | ||
| + | 		loops.add( p ); | ||
| + | |||
| + | 		return ManadUtils.generateRule( ruleText, replacements, ruleType, loops );		 | ||
| + | 	} | ||
| + | |||
| + | 	getPorts( ports ) | ||
| + | 	{ | ||
| + | 		portList = new ArrayList(); | ||
| + | 		parts  = ports.split( ";" ); | ||
| + | |||
| + | 		for (String part : parts ) | ||
| + | 		{ | ||
| + | 			parts2  = part.split( ":" ); | ||
| + | 			if ( parts2.length <  2) | ||
| + | 			{ | ||
| + | 				continue; | ||
| + | 			} | ||
| + | 			port = parts2 [1]; | ||
| + | 			portList.add( port ); | ||
| + | 		} | ||
| + | |||
| + | 		String [] ports_ = new String [portList.size()]; | ||
| + | 		for (int i = 0; i < ports_.length; i++) | ||
| + | 		{ | ||
| + | 			ports_[i] = portList.get( i ); | ||
| + | 		} | ||
| + | 		return ports_; | ||
| + | 	} | ||
| </source> | </source> | ||
Текущая версия на 06:26, 13 октября 2009
Данный скриптовый шлюз сделан как замена шлюза Zyxel, работающего с Cisco2. конфигурация типа шлюза :
user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoSSHSwitchRuleEditor gate_manager.class=bitel.billing.server.ipn.vlan.CiscoSSHSwitchGateWorker use.script=1
Управление шлюзом происходит по telnet. Код :
import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; import bitel.billing.common.IPUtils; import bitel.billing.common.module.ipn.IPNContractStatus; import bitel.billing.server.ipn.UserStatus; import bitel.billing.server.ipn.dlink.UserPortStatus; import bitel.billing.server.util.DefaultServerSetup; import bitel.billing.server.util.Utils; import bitel.billing.server.util.telnet.TelnetSession; import bitel.billing.server.ipn.bean.*; protected void doSync() { try { String host = gate.getHost(); int port = gate.getPort(); DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); String pswd = gate.getKeyword(); String login = gateSetup.getStringValue( "login"); StringBuffer result = new StringBuffer(); if( log.isDebugEnabled() ) { log.debug( gate.getId() + " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd ); } TelnetSession session = new TelnetSession( host, port); session.setLoginPromptSequence( ":" ); log.debug( "before connect" ); session.connect(); log.debug( "after connect" ); result.append( session.doCommand( login ) ); log.debug( "after command" ); session.setLoginPromptSequence( "#" ); result.append( session.doCommand( pswd ) ); log.debug( "before pswd" ); log.debug( "execute commands" ); doCommands( session, result, gateSetup); session.setLoginPromptSequence( "****" ); result.append( session.doCommand( "logout" ) ); log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!!! Dlink!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); log.info( result.toString() ); log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!!! Dlink!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); log.debug( "ok" ); } catch (Exception e) { throw new RuntimeException ( e ); } } private void doCommands( TelnetSession session, StringBuffer result, DefaultServerSetup gateSetup) throws IOException { VlanManager manager = new VlanManager(mid, con); for( UserStatus status : statusList ) { //берем vlan у родительской циски int vid = manager.getVlan( gate.getParentId(), status.contractId ); if ( status.status == IPNContractStatus.STATUS_OPEN ) { String[] rules = getOpenRules( status, vid ); for ( String rule : rules ) { result.append( session.doCommand( rule ) ); } } else { String[] rules = getCloseRules( status, vid ); for ( String rule : rules ) { result.append( session.doCommand( rule ) ); } } } } private String[] getOpenRules( UserStatus status, int vid ) { return getRules( status, "\\[OPEN\\]((.|\n)*)\\[/OPEN\\]", vid ); } private String[] getCloseRules( UserStatus status, int vid ) { return getRules( status, "\\[CLOSE\\]((.|\n)*)\\[/CLOSE\\]", vid ); } getRules( status, template, vid ) { // пользовательское правило, без типа - то все оставляем как есть rule = status.rule.getRuleText(); //порты идут до #, а адреса идут после String [] parts = rule.split( "#" ); portsStr = ""; addresesStr = ""; if ( parts.length > 0 ) { portsStr = parts[0]; } if ( parts.length > 1 ) { addresesStr = parts[1]; } //типизированное правило if( status.ruleType != null ) { rule = generateRule( addresesStr, portsStr, vid, status.gateType, status.ruleType ); } pattern = Pattern.compile( template, Pattern.DOTALL ); m = pattern.matcher( rule ); if (m.find()) { rule = m.group( 1 ); } rule.replaceAll( "\r", "" ); parts = rule.split( "\n" ); return parts; } generateRule( addreses, ports, vid, gateType, ruleType ) { ports_ = getPorts( ports ); ruleText = ManadUtils.getRule( gateType, ruleType ); replacements = new HashMap(); if ( vid > 0) { replacements.put( "\\{VID\\}", String.valueOf( vid ) ); } loops = ManadUtils.getAddresLoops( addreses ); //адреса p = new LoopPattern(); p.setLoopPatern( "LOOP_PORT" ); p.setReplace( "\\{PORT\\}" ); p.setObjects( ports_ ); loops.add( p ); return ManadUtils.generateRule( ruleText, replacements, ruleType, loops ); } getPorts( ports ) { portList = new ArrayList(); parts = ports.split( ";" ); for (String part : parts ) { parts2 = part.split( ":" ); if ( parts2.length < 2) { continue; } port = parts2 [1]; portList.add( port ); } String [] ports_ = new String [portList.size()]; for (int i = 0; i < ports_.length; i++) { ports_[i] = portList.get( i ); } return ports_; }
