Код:
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;
import bitel.billing.server.ipn.bean.UserGateRuleManager;
protected void doSync()
{
log.info("start of SSH_SWITCH........................................................");
host = gate.getHost();
port = gate.getPort();
String macAddr = "";
String ipAddr = "";
String swPort = "";
gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );
// берем IPoE vlan в настройках шлюза zyxel
int IPoE_vid = gateSetup.getIntValue( "IPoE_vlan", 4000 );
// берем PPPoE vlan в настройках шлюза zyxel. Пока не используем, но может пригодиться...
int PPPoE_vid = gateSetup.getIntValue( "PPPoE_vlan", 4000 );
login = gateSetup.getStringValue( "login", "admin" );
timeout = gateSetup.getIntValue( "timeout", 4000 );
pswd = gate.getKeyword();
if( log.isDebugEnabled() )
{
log.info( " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd );
}
session = null;
result = new StringBuffer();
try
{
log.info("Connect to: "+host+":"+port+" as "+login+"/"+pswd);
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 из "Ресурсы vlan" в редактировании шлюза у юзера
// в свою очередь номер влана там появляется из параметра шлюза range
// в соответствии с порядковым номером в строке:
// range=10;11;12;13;14;15 порт N2 будет иметь vlan 11
// int Mgt_vid = manager.getVlan( gate.getId(), status.contractId );
int Mgt_vid = PPPoE_vid;
// берем MAC в настройках шлюза у юзера
UserGateRuleManager ugrm = new UserGateRuleManager(con, mid);
List userRules = ugrm.getUserGateRules(status.contractId);
String rule_text = userRules.get(0).getRuleText();
log.info("rule_text: " + rule_text);
// Pattern p = Pattern.compile("(\\d+.\\d+.\\d+.\\d+):(\\d+):?(\\p{XDigit}+)-(\\p{XDigit}+)-(\\p{XDigit}+)-(\\p{XDigit}+)-(\\p{XDigit}+)-(\\p{XDigit}+)?");
Pattern p = Pattern.compile("(\\d+.\\d+.\\d+.\\d+):(\\d+)");
Matcher m = p.matcher(rule_text);
if(m.find())
{
ipAddr = m.group(1);
swPort = m.group(2);
log.info( "ipAddr=" + ipAddr + "; swPort=" + swPort );
}
log.info( "IPoE_vid=" + IPoE_vid + "; PPPoE_vid=" + PPPoE_vid + " Mgt_vid=" + Mgt_vid );
if ( ipAddr == "" || swPort == "" ) {
log.info("Error: no link - IP address or Port number not defined");
} else {
if ( status.status == IPNContractStatus.STATUS_OPEN ) {
rules = getOpenRules2( status, Mgt_vid, IPoE_vid, macAddr, ipAddr, swPort );
for ( String rule : rules ) {
result.append( session.command( rule ) );
}
} else {
rules = getCloseRules2( status, Mgt_vid, IPoE_vid, macAddr, ipAddr, swPort );
for ( String rule : rules ) {
result.append( session.command( rule ) );
}
}
}
}
result.append( session.command( "exit" ) );
}
catch ( Exception e )
{
// log.error("", e );
log.info(e.getMessage());
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\\](.*)\\[\\/OPEN\\]", vid );
}
getCloseRules( UserStatus status, int vid )
{
return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", vid );
}
getOpenRules2( UserStatus status, int PPPoE_vid, int IPoE_vid, macAddr, ipAddr, swPort )
{
return getRules2( status, "\\[OPEN\\](.*)\\[/OPEN\\].*", PPPoE_vid, IPoE_vid, macAddr, ipAddr, swPort );
}
getCloseRules2( UserStatus status, int PPPoE_vid, int IPoE_vid, macAddr, ipAddr, swPort )
{
return getRules2( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", PPPoE_vid, IPoE_vid, macAddr, ipAddr, swPort );
}
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 );
}
// здесь 32 - это флаг DOTALL, т.е. в точку . включается все, в том числе и \n
pattern = Pattern.compile( template, 32 );
m = pattern.matcher( rule );
if (m.find())
{
rule = m.group( 1 );
} else {
log.info("regexp not match");
}
rule.replaceAll( "\r", "" );
parts = rule.split( "\n" );
return parts;
}
getRules2( status, template, int PPPoE_vid, int IPoE_vid, macAddr, ipAddr, swPort )
{
// пользовательское правило, без типа - то все оставляем как есть
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 = generateRule2( addresesStr, portsStr, PPPoE_vid, IPoE_vid, status.gateType, status.ruleType, macAddr, ipAddr, swPort );
}
// здесь 32 - это флаг DOTALL, т.е. в точку . включается все, в том числе и \n
pattern = Pattern.compile( template, 32 );
m = pattern.matcher( rule );
if (m.find())
{
rule = m.group( 1 );
} else {
log.info("regexp not match");
}
log.info("result: "+rule);
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 );
}
generateRule2( addreses, ports, int PPPoE_vid, int IPoE_vid, gateType, ruleType, macAddr, ipAddr, swPort )
{
ports_ = getPorts( ports );
ruleText = ManadUtils.getRule( gateType, ruleType );
replacements = new HashMap();
if ( PPPoE_vid > 0) {
replacements.put( "\\{PPPOE_VID\\}", String.valueOf( PPPoE_vid ) );
}
if ( IPoE_vid > 0) {
replacements.put( "\\{IPOE_VID\\}", String.valueOf( IPoE_vid ) );
}
// if ( macAddr == "" || ipAddr == "" || swPort == "" ) {
if ( ipAddr == "" || swPort == "" ) {
replacements.put( "!.*ip source binding.*", "" );
} else {
if ( macAddr != "" ) { replacements.put( "\\{MAC_ADDR\\}", macAddr );}
if ( ipAddr != "" ) { replacements.put( "\\{IP_ADDR\\}", ipAddr ); }
if ( swPort != "" ) { replacements.put( "\\{SW_PORT\\}", swPort ); }
// replacements.put( "!ip source binding", "ip source binding" );
// replacements.put( "!no ip source binding", "no ip source binding" );
replacements.put( "!.*ip source binding.*", "" );
}
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();
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_;
}
Как я понял, он затыкается на отсылании комманды свитчу.
Сначала затупляет на
Код:
result.append( session.command( "configure" ) );
Если её закомментить, то затупляет уже на
Код:
result.append( session.command( rule ) );
Кажется дело в SSH клиенте сервера.