Реализация стандартного шлюза коммутатора Zyxel (под Cisco2) на BeanShell

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

(Различия между версиями)
Перейти к: навигация, поиск
(Новая: конфигурация типа шлюза : <source lang="bash"> user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoSSHSwitchRuleEditor gate_manager.class=bite...)
 
(3 промежуточные версии не показаны)
Строка 19: Строка 19:
[OPEN]
[OPEN]
-
   <LOOP>
+
   <LOOP_PORT>
     interface port-channel {PORT}
     interface port-channel {PORT}
     pvid {VID}  
     pvid {VID}  
     exit  
     exit  
-
  </LOOP>
+
  </LOOP_PORT>
   vlan  {VID}
   vlan  {VID}
Строка 30: Строка 30:
   forbidden 1-24
   forbidden 1-24
   fixed 25-26   
   fixed 25-26   
-
   <LOOP>
+
   <LOOP_PORT>
     fixed  {PORT}
     fixed  {PORT}
-
   </LOOP>         
+
   </LOOP_PORT>         
   untagged 1-24
   untagged 1-24
   exit
   exit
Строка 44: Строка 44:
</source>
</source>
-
Код :
+
Шлюз управляется по ssh. Код :
<source lang="java">
<source lang="java">
-
import java.util.HashMap;
+
import java.util.*;
-
import java.util.Map;
+
import java.util.regex.*;
-
import java.util.regex.Matcher;
+
import java.util.regex.Pattern;
import java.util.regex.Pattern;
Строка 58: Строка 57:
import bitel.billing.server.util.DefaultServerSetup;
import bitel.billing.server.util.DefaultServerSetup;
import bitel.billing.server.util.ssh.SSHSession;
import bitel.billing.server.util.ssh.SSHSession;
-
 
import bitel.billing.server.ipn.UserStatus;
import bitel.billing.server.ipn.UserStatus;
 +
import ru.bitel.bgbilling.common.DefaultSetup;
 +
import bitel.billing.server.ipn.bean.GateType;
 +
import bitel.billing.server.ipn.bean.LoopPattern;
 +
import bitel.billing.server.ipn.bean.RuleType;
 +
protected void doSync()
protected void doSync()
{
{
log.info( "start of SSH_SWITCH........................................................");
log.info( "start of SSH_SWITCH........................................................");
-
     String host = gate.getHost();
+
     host = gate.getHost();
-
     int port = gate.getPort();
+
     port = gate.getPort();
      
      
      
      
-
     DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );         
+
     gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );         
      
      
-
     String login = gateSetup.getStringValue( "login", "root" );
+
     login = gateSetup.getStringValue( "login", "root" );
-
     int timeout = gateSetup.getIntValue( "timeout", 2000 );
+
     timeout = gateSetup.getIntValue( "timeout", 2000 );
      
      
-
     String pswd = gate.getKeyword();
+
     pswd = gate.getKeyword();
              
              
     if( log.isDebugEnabled() )
     if( log.isDebugEnabled() )
Строка 79: Строка 82:
     }
     }
-
     SSHSession session = null;
+
     session = null;
      
      
-
     StringBuffer result = new StringBuffer();
+
     result = new StringBuffer();
      
      
     try
     try
Строка 103: Строка 106:
if ( status.status == IPNContractStatus.STATUS_OPEN )
if ( status.status == IPNContractStatus.STATUS_OPEN )
{
{
-
String[]  rules  = getOpenRules( status, vid );
+
rules  = getOpenRules( status, vid );
for ( String rule : rules )
for ( String rule : rules )
{
{
Строка 112: Строка 115:
else
else
{
{
-
String[] rules = getCloseRules( status, vid );
+
rules = getCloseRules( status, vid );
for ( String rule : rules )
for ( String rule : rules )
{
{
Строка 151: Строка 154:
}
}
-
private String[]  getOpenRules( UserStatus status, int vid )
+
getOpenRules( UserStatus status, int vid )
{
{
-
+
    return getRules( status, "\\[OPEN\\]((.|\n)*)\\[/OPEN\\]", vid );
-
return getRules( status, "\\[OPEN\\]((.|\n)*)\\[/OPEN\\]", vid );
+
}
}
-
private String[]  getCloseRules( UserStatus status, int vid )
+
getCloseRules( UserStatus status, int vid )
-
{
+
{
-
+
    return getRules( status, "\\[CLOSE\\]((.|\n)*)\\[/CLOSE\\]", vid );
-
+
-
return getRules( status, "\\[CLOSE\\]((.|\n)*)\\[/CLOSE\\]", vid );
+
}
}
-
 
+
getRules(  status, template, vid )
-
 
+
-
 
+
-
private String [] getRules(  UserStatus status, String template, int vid )
+
{
{
 +
        // пользовательское правило, без типа - то все оставляем как есть
 +
rule = status.rule.getRuleText();
-
// пользовательское правило, без типа - то все оставляем как есть
+
        //порты идут до #, а адреса идут после 
-
String rule = status.rule.getRuleText();
+
String [] parts = rule.split( "#" );
-
log.info("rule=" + rule);
+
portsStr = "";
-
 
+
addresesStr = "";
-
List portList = new ArrayList();
+
-
String [] parts = rule.split( ";" );
+
-
for (String part : parts )
+
if ( parts.length > 0 )
{
{
-
 
+
    portsStr = parts[0];
-
String [] parts2  = part.split( ":" );
+
-
 
+
-
if ( parts2.length <  2)
+
-
{
+
-
continue;
+
-
}
+
-
 
+
-
String port = parts2 [1];
+
-
portList.add( port );
+
}
}
-
+
-
String [] ports = new String [portList.size()];
+
if ( parts.length > 1 )
-
for (int i = 0; i < ports.length; i++)
+
{
{
-
ports[i] = portList.get( i );
+
  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( status.ruleType != null )
+
if (m.find())
 +
{
 +
    rule = m.group( 1 );
 +
}
-
{
+
rule.replaceAll( "\r", "" );
-
      String ruleText = ManadUtils.getRule( status.gateType, status.ruleType );
+
parts  = rule.split( "\n" );
 +
 
 +
return parts;
 +
}
-
log.info("ruleText=" + ruleText);
+
        generateRule( addreses, ports, vid, gateType, ruleType  )
 +
{
 +
        ports_ = getPorts( ports );
 +
ruleText = ManadUtils.getRule( gateType, ruleType );
-
Map replacements =  new HashMap ();
+
replacements =  new HashMap();
if ( vid > 0)
if ( vid > 0)
{
{
-
replacements.put( "\\{VID\\}", String.valueOf( vid ) );
+
replacements.put( "\\{VID\\}", String.valueOf( vid ) );
}
}
-
rule = ManadUtils.generateRule( ruleText, replacements, status.ruleType, "\\{PORT\\}", ports );
+
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 );
}
}
-
 
-
Pattern pattern = Pattern.compile( template );
+
getPorts( ports )
-
Matcher m = pattern.matcher( rule );
+
-
if (m.find())
+
{
{
-
rule = m.group( 1 );
+
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 );
 +
}
 +
 +
String [] ports_ = new String [portList.size()];
 +
for (int i = 0; i < ports_.length; i++)
 +
{
 +
ports_[i] = portList.get( i );
 +
}
 +
return ports_;
}
}
-
 
-
rule.replaceAll( "\r", "" );
 
-
 
-
 
-
parts  = rule.split( "\n" );
 
-
 
-
 
-
return parts;
 
-
}
 
-
 
</source>
</source>

Текущая версия на 11:32, 15 марта 2010

конфигурация типа шлюза :

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]
 
[ADD]
 
[/ADD]
 
[REMOVE]
[/REMOVE]
 
[OPEN]
  <LOOP_PORT>
    interface port-channel {PORT}
    pvid {VID} 
    exit 
 </LOOP_PORT>
 
  vlan  {VID}
  name "abonent  {VID}" 
  normal "" 
  forbidden 1-24
  fixed 25-26  
  <LOOP_PORT>
    fixed  {PORT}
  </LOOP_PORT>        
  untagged 1-24
   exit
[/OPEN]
 
[CLOSE]
no vlan  {VID}
[/CLOSE]
 
[/DEFAULT]

Шлюз управляется по ssh. Код :

import java.util.*;
import java.util.regex.*;
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.ssh.SSHSession;
import bitel.billing.server.ipn.UserStatus;
import ru.bitel.bgbilling.common.DefaultSetup;
import bitel.billing.server.ipn.bean.GateType;
import bitel.billing.server.ipn.bean.LoopPattern;
import bitel.billing.server.ipn.bean.RuleType;
 
protected void doSync()
{		
	log.info( "start of SSH_SWITCH........................................................");
    host = gate.getHost();
    port = gate.getPort();
 
 
    gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );        
 
    login = gateSetup.getStringValue( "login", "root" );
    timeout = gateSetup.getIntValue( "timeout", 2000 );
 
    pswd = gate.getKeyword();
 
    if( log.isDebugEnabled() )
    {
        log.info( " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd );
    }
 
    session = null;
 
    result = new StringBuffer();
 
    try
    {
        session = new SSHSession(  host, port, login, pswd );
        session.setTimeout( timeout );
        session.connect();
 
        result.append( session.command( "configure" ) );
 
		VlanManager manager = new VlanManager(mid, con); 
 
 
		log.info( "running commands");
 
       for( UserStatus status : statusList )
		{
 
			//берем vlan у родительской циски 
			int vid = manager.getVlan( gate.getParentId(), status.contractId );
			if ( status.status == IPNContractStatus.STATUS_OPEN )
			{
				rules  = getOpenRules( status, vid );
				for ( String rule : rules )
				{
					result.append( session.command( rule ) );	
				}
 
			}
			else
			{
				rules = getCloseRules( status, vid );
				for ( String rule : rules )
				{
					result.append( session.command( rule ) );	
				}
 
			}
 
 
 
		}        
 
       result.append( session.command( "exit" ) );
 
		 log.info("!!!!!!!!!!!!!!SSH Switch!!!!!!!!!!!!!!!!!!");
		 log.info( result );
		 log.info("!!!!!!!!!!!!!!!SSH Switch!!!!!!!!!!!!!!!!!");
 
 
 
    }
    catch ( Exception e )
    {
    	log.error("",  e );        	
    	throw new RuntimeException ( e );
    }
    finally
    {
        if( session != null )
        {
            session.disconnect();
        }
 
		log.info( "end of SSH_SWITCH........................................................");
    }	
 
 
}
 
getOpenRules( UserStatus status, int vid )
{
    return getRules( status, "\\[OPEN\\]((.|\n)*)\\[/OPEN\\]", vid );
}
 
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 );
	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 );
		}
 
		String [] ports_ = new String [portList.size()];
		for (int i = 0; i < ports_.length; i++)
		{
			ports_[i] = portList.get( i );
		}
		return ports_;
	}
Личные инструменты