Реализация шлюза коммутатора Dlink (под Cisco2) на Beanshell

Материал из BiTel WiKi

Перейти к: навигация, поиск

Данный скриптовый шлюз сделан как замена шлюза 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.bean.ManadUtils;
import bitel.billing.server.ipn.bean.VlanManager;
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.OperationTimedoutException;
import bitel.billing.server.util.telnet.TelnetSession;
 
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, OperationTimedoutException
{
 
	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();
 
        //порты идут до #, а адреса идут после  
	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 );
	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<String>();
		parts  = ports.split( ";" );
 
		for (String part : parts )
		{
			parts2  = part.split( ":" );
			if ( parts2.length <  2)
			{
				continue;
			}
			port = parts2 [1];
			portList.add( port );
		}
 
		ports_[] = new String [portList.size()];
		for (int i = 0; i < ports_.length; i++)
		{
			ports_[i] = portList.get( i );
		}
		return ports_;
	}
Личные инструменты