Шлюзы использую из Wiki (Dlink и Cisco2)
Код:
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_;
}