Есть оборудование - EdgeCore
настройки шлюза
Конфигурация
Код:
user_rule.editor.class=bitel.billing.module.services.ipn.editor.ManadContractRuleEditor
gate_manager.class=bitel.billing.server.ipn.ManadGateWorker
use.script=1
Команды
Код:
[DEFAULT]
[OPEN]
<LOOP_PORT>
int eth 1/{PORT}
no switchport native vlan
switchport allowed vlan remove 13
switchport allowed vlan add {VLAN}
switchport allowed vlan remove 1
switchport mode access
</LOOP_PORT>
[/OPEN]
[CLOSE]
<LOOP_PORT>
int eth 1/{PORT}
no switchport native vlan
switchport allowed vlan remove {VLAN}
switchport allowed vlan add 13
switchport native vlan 13
switchport allowed vlan remove 1
switchport mode access
</LOOP_PORT>
[/CLOSE]
[/DEFAULT]
Сам скрипт-
Код:
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.*;
import ru.bitel.bgbilling.server.util.DefaultSetup;
import bitel.billing.server.util.Utils;
import bitel.billing.server.util.telnet.OperationTimedoutException;
import bitel.billing.server.util.telnet.TelnetSession;
import ru.bitel.bgbilling.common.DefaultSetup;
import bitel.billing.common.IPUtils;
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.ansi.TelnetAnsiSession;
import ru.bitel.bgbilling.modules.ipn.server.bean.GatePortManager;
import java.sql.*;
//includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/manad" );
protected void doSync()
{
log.info( "start of cisco........................................................");
host = gate.getHost();
port = gate.getPort();
DefaultSetup gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );
pswd = gate.getKeyword();
login = gateSetup.getStringValue( "login");
timeout = gateSetup.getIntValue( "timeout", 2000 );
result = new StringBuffer();
if( log.isDebugEnabled() )
{
log.debug( gate.getId() + " gate: " + host + ":" + port + " login: " + login + " passwd: " + pswd );
}
log.debug("before connect");
TelnetAnsiSession session = new TelnetAnsiSession( host, port);
session.setTimeout( timeout );
session.setSocketTimeTimeout( timeout );
session.setLoginPromptSequence( ": " );
session.connect();
log.debug("after connect");
result.append( session.doCommand( login ) );
log.debug("after login");
session.setLoginPromptSequence( "#" );
result.append( session.doCommand( pswd ) );
log.debug("after pswd");
log.debug( "execute commands" );
doCommands( session, result, gateSetup );
//выход из режима config
result.append( session.doCommand( "exit" ) );
session.doCommandAsync( "exit" );
log.info("!!!!!!!!!!!!!!!!start of edgecore!!!!!!!!!!!!!!!!");
log.info( result );
log.info("!!!!!!!!!!!!!!! end of edgecore !!!!!!!!!!!!!!!!!");
log.debug( "ok" );
log.info( "end of cisco........................................................");
}
private void doCommands( TelnetAnsiSession session, StringBuffer result, gateSetup) throws IOException, OperationTimedoutException
{
result.append( session.doCommand( "terminal length 0" ) );
onList = gateSetup.getStringValue( "on.list", "on");
offList = gateSetup.getStringValue( "off.list", "off" );
portResult = getPortResult( session );
speedResult = getSpeedResult( session );
result.append( session.doCommand( "config" ) );
log.debug("after config");
log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!!portResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
log.info( portResult );
log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!! end portResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!!speedResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
log.info( speedResult );
log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!! end speedResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" );
GatePortManager man = new GatePortManager( con, mid );
for( UserStatus status : statusList )
{
gateId = gate.getId();
log.info("gateId=" + gateId);
ports = man.getGatePorts( status.contractId, gateId );
boolean allInOpened = true;
//если хотя бы один порт не открыт, то считает что не открыт
for ( port : ports )
{
allInOpened = portExist(port, portResult, onList);
if ( !allInOpened )
{
break;
}
}
boolean allInClosed = true;
for ( port : ports )
{
allInClosed = portExist(port, portResult, offList );
if ( !allInClosed )
{
break;
}
}
boolean allSpeedCorrect = true;
speedCur = getCurrentSpeed( gateSetup, status.contractId );
log.debug( "speedCur=" + speedCur );
for ( port : ports )
{
speed = getSpeed( port, speedResult, offList );
if (! speed.equals( speedCur ) )
{
allSpeedCorrect = false;
break;
}
}
log.debug( "allInOpened=" + allInOpened );
log.debug( "allInClosed=" + allInClosed );
log.debug( "allSpeedCorrect=" + allSpeedCorrect );
List rules = null;
if (status.status == IPNContractStatus.STATUS_OPEN && !allInOpened )
{
rules = getOpenRules( status, ports );
}
else if (status.status != IPNContractStatus.STATUS_OPEN && !allInClosed )
{
rules = getCloseRules( status, ports );
}
//sendRules( rules, session, result);
if (rules != null )
{
for ( String rule : rules )
{
log.debug ("command=" + rule );
result.append( session.doCommand( rule ) );
}
}
if ( !allSpeedCorrect )
{
log.debug( "correcting speed..." );
for ( port : ports )
{
result.append( session.doCommand( "int e 1/" + port ) );
result.append( session.doCommand( "speed-duplex " + speedCur ) );
result.append( session.doCommand( "exit" ) );
}
}
}
}
getOpenRules( status, ports )
{
return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]", ports );
}
getCloseRules( status, ports )
{
return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", ports );
}
getRules( status, template, ports )
{
// пользовательское правило, без типа - то все оставляем как есть
rule = status.rule.getRuleText();
log.info("rule=" + rule);
//типизированное правило
if( status.ruleType != null )
{
rule = generateRule( rule, status.gateType, status.ruleType, ports );
}
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, ports )
{
ruleText = ManadUtils.getRule( gateType, ruleType );
replacements = new HashMap();
loops = ManadUtils.getAddresLoops( addresses );
String [] ports_ = new String[ports.size()];
for ( int i = 0; i < ports_.length; i++)
{
ports_[i] = String.valueOf( ports.get(i) );
}
//адреса
p = new LoopPattern();
p.setLoopPatern( "LOOP_PORT" );
p.setReplace( "\\{PORT\\}" );
p.setObjects( ports_ );
loops.add( p );
return ManadUtils.generateRule( ruleText, replacements, ruleType, loops );
}
private portExist ( port, buffer, list )
{
Pattern pattern = Pattern.compile( ".*Interface ethernet 1/" + port +"\r\n IP access-group " + list + " in" );
Matcher m = pattern.matcher( buffer );
found = m.find();
log.debug( found ? "port found" : "port not found" );
return found;
}
private String getSpeed ( port, buffer, list )
{
speed = "";
Pattern pattern = Pattern.compile( ".*Eth 1/ " + port + "\\s+.+\\s+\\d+\\s+\\d+\\s+(.+?)\\s+" );
Matcher m = pattern.matcher( buffer );
log.debug( "getting speed.." );
if ( m.find() )
{
speed = m.group( 1 );
log.debug( "speed=" + speed + ";port=" + port );
}
return speed;
}
private getPortResult( session )
{
return session.doCommand( "show ip access-group");
}
private getSpeedResult( session )
{
return session.doCommand( "show interface brief");
}
private getCurrentSpeed( gateSetup, cid )
{
lowSpeed = gateSetup.getStringValue( "speed.low", "10full");
highSpeed = gateSetup.getStringValue( "speed.high", "100full");
mid = gateSetup.getIntValue( "npay.mid", 4 );
sid = gateSetup.getIntValue( "npay.sid", 11 );
String result = lowSpeed;
String query = "Select * from npay_service_object_" + mid + " WHERE cid = " + cid + " AND sid = " + sid;
PreparedStatement ps = con.prepareStatement( query );
ResultSet rs = ps.executeQuery();
if ( rs. next() )
{
result = highSpeed;
}
return result;
}
Как тут добавить возможность того чтоб при назначении VLAN в договоре он определялся в командах
тут
Код:
switchport allowed vlan add {VLAN}
_________________
Код:
Клиент: вер. 6.2.714 / 25.05.2015 17:27:15
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
Сервер: вер. 6.2.881 / 22.05.2015 17:56:55
os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_45
Помощь по администрированию bgbilling в jabber конференции или Группа в telegramСтиль программирования - пьяный мастерстер
Разработка мобильных приложений