Реализация стандартного шлюза Cisco2 на BeanShell

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

(Различия между версиями)
Перейти к: навигация, поиск
(убрал OperationTimedoutException)
 
(4 промежуточные версии не показаны)
Строка 22: Строка 22:
     no shutdown
     no shutdown
     ip unnumbered gi2/1
     ip unnumbered gi2/1
-
     ip helper-address 81.200.144.183
+
     ip helper-address 192.168.0.183
     exit
     exit
[/OPEN]
[/OPEN]
Строка 44: Строка 44:
import java.util.regex.Matcher;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.Pattern;
 +
import java.util.StringTokenizer;
import bitel.billing.common.module.ipn.IPNContractStatus;
import bitel.billing.common.module.ipn.IPNContractStatus;
Строка 52: Строка 53:
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.OperationTimedoutException;
 
import bitel.billing.server.util.telnet.TelnetSession;
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;
 +
Строка 61: Строка 69:
{
{
log.info( "start of cisco........................................................");
log.info( "start of cisco........................................................");
-
String host = gate.getHost();
+
host = gate.getHost();
-
int port = gate.getPort();
+
port = gate.getPort();
DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );         
DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );         
-
String pswdLogin = gate.getKeyword();
+
pswdLogin = gate.getKeyword();
-
String pswdCfg = gateSetup.getStringValue( "cfg.pswd");
+
pswdCfg = gateSetup.getStringValue( "cfg.pswd");
 +
                timeout = gateSetup.getIntValue( "timeout", 0 );
-
StringBuffer result = new StringBuffer();
+
result = new StringBuffer();
         
         
Строка 79: Строка 88:
}
}
-
//TODO - завершающте символы вытащить в конфиг
 
-
TelnetSession session = new TelnetSession( host, port);
+
 +
session = new TelnetSession( host, port);
 +
                session.setTimeout( timeout );
session.setLoginPromptSequence( ":" );
session.setLoginPromptSequence( ":" );
session.connect();
session.connect();
Строка 109: Строка 119:
log.debug( "execute commands" );
log.debug( "execute commands" );
doCommands( session, result);
doCommands( session, result);
-
+
 
-
+
-
//TODO commands here
+
-
+
result.append( session.doCommand( "exit" ) );
result.append( session.doCommand( "exit" ) );
-
+
                session.doCommandAsync( "exit" );
-
+
 
-
+
log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
log.info( result );
log.info( result );
log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-
+
 
-
+
log.debug( "ok" );
log.debug( "ok" );
} catch (Exception e)
} catch (Exception e)
Строка 138: Строка 143:
-
private void doCommands( TelnetSession session, StringBuffer result) throws IOException, OperationTimedoutException
+
private void doCommands( TelnetSession session, StringBuffer result) throws IOException
{
{
for( UserStatus status : statusList )
for( UserStatus status : statusList )
Строка 147: Строка 152:
vid = manager.getVlan( gateId, status.contractId );
vid = manager.getVlan( gateId, status.contractId );
log.info("vid=" + vid);
log.info("vid=" + vid);
-
 
-
 
-
int cid = status.contractId;
 
-
 
//TODO - подумать что сделать справилами на добавление
//TODO - подумать что сделать справилами на добавление
Строка 184: Строка 185:
}
}
-
 
+
getOpenRules( status, vid )
-
 
+
-
private List getOpenRules( UserStatus status, int vid )
+
{
{
-
+
    return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]", vid );
-
return getRules( status, "\\[OPEN\\]((.|\n)*)\\[/OPEN\\]", vid );
+
}
}
-
private List  getCloseRules( UserStatus status, int vid )
+
getCloseRules( status, vid )
{
{
-
+
    return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", vid );
-
+
-
return getRules( status, "\\[CLOSE\\]((.|\n)*)\\[/CLOSE\\]", vid );
+
}
}
-
private List  getRemoveRules( UserStatus status, int vid )
+
getRemoveRules( UserStatus status, int vid )
{
{
-
+
    return getRules( status, "\\[REMOVE\\](.*)\\[/REMOVE\\]", vid  );
-
+
-
return getRules( status, "\\[REMOVE\\]((.|\n)*)\\[/REMOVE\\]", vid  );
+
}
}
-
 
+
getRules(  status, template, vid )
-
 
+
-
private List  getRules(  UserStatus status, String template, int vid )
+
{
{
// пользовательское правило, без типа - то все оставляем как есть
// пользовательское правило, без типа - то все оставляем как есть
Строка 218: Строка 210:
{
{
-
log.info("222222");
+
    rule = generateRule( rule, status.gateType, status.ruleType, vid );
-
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);
log.info("rule=" + rule);
-
Pattern pattern = Pattern.compile( template );
+
pattern = Pattern.compile( template, Pattern.DOTALL );
-
Matcher m = pattern.matcher( rule );
+
m = pattern.matcher( rule );
if (m.find())
if (m.find())
{
{
-
rule = m.group( 1 );
+
    rule = m.group( 1 );
}
}
Строка 243: Строка 229:
parts  = rule.split( "\n" );
parts  = rule.split( "\n" );
-
List result = new ArrayList();
+
result = new ArrayList();
for ( String part : parts )
for ( String part : parts )
{
{
Строка 251: Строка 237:
}
}
}
}
-
+
 
-
+
return result;
return result;
}
}
 +
generateRule( addresses, gateType, ruleType, int vid )
 +
{
 +
    ruleText = ManadUtils.getRule( gateType, ruleType );
 +
    replacements =  new HashMap ();
 +
    if ( vid > 0)
 +
    {
 +
        replacements.put( "\\{VID\\}", String.valueOf( vid ) );
 +
    }
 +
    return ManadUtils.generateRule( ruleText, addresses, replacements, ruleType );
 +
}
</source>
</source>

Текущая версия на 06:34, 13 октября 2009

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

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 java.util.StringTokenizer;
 
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.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;
 
 
 
protected void doSync()
{
	try
	{
		log.info( "start of cisco........................................................");
		host = gate.getHost();
		port = gate.getPort();
 
 
		DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );        
 
		pswdLogin = gate.getKeyword();
		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 ) );
 
 
 
		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 )
	{
		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 = ManadUtils.getRule( gateType, ruleType );
    replacements =  new HashMap ();
    if ( vid > 0)
    {
        replacements.put( "\\{VID\\}", String.valueOf( vid ) );
    }
    return ManadUtils.generateRule( ruleText, addresses, replacements, ruleType );		
}
Личные инструменты