После долгово мудрения со скриптом накатал вот так:
Код:
import java.util.*;
import java.util.regex.*;
import ru.bitel.bgbilling.common.*;
import bitel.billing.common.module.ipn.*;
import bitel.billing.server.ipn.bean.*;
import bitel.billing.server.ipn.*;
import bitel.billing.server.util.ssh.*;
import bitel.billing.server.util.*;
import bitel.billing.server.util.ssh.SSHSession;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.GateCommandUtil;
import bitel.billing.common.module.ipn.IPNContractStatus;
protected void doSync()
{
host = gate.getHost();
port = gate.getPort();
gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );
login = gateSetup.getStringValue( "login", "root" );
pswd = gate.getKeyword();
if ( log.isDebugEnabled() )
{
log.debug( " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd );
}
session = null;
try
{
session = new SSHSessionExec( host, port, login, pswd );
// address_list = session.command( "ip firewall address-list print without-paging" );
address_list = session.command( "ip firewall address-list print without-paging where list=ACCESS_LIST" );
new_address_list = null;
for ( UserStatus status : statusList )
{
cid = status.contractId;
ruleType = status.ruleType;
rule_id = 0;
if (ruleType != null)
{
rule_id = ruleType.getId();
};
rules = null;
if (address_list.indexOf( "cid="+cid+";rule_id="+rule_id+";") != -1)
{
if ( status.status > 0 )
{
if ( status.status == IPNContractStatus.STATUS_REMOVED )
{
rules = getDeleteRules( status );
}
else
{
rules = getCloseRules( status );
};
};
}
else if ( status.status == IPNContractStatus.STATUS_OPEN )
{
rules = getOpenRules( status );
};
if (rules != null){
for ( String rule : rules )
{
p = Pattern.compile("rule_id");
m = p.matcher(rule);
if (new_address_list == null)
{
new_address_list = "";
};
new_address_list = new_address_list + m.replaceAll("rule_id="+rule_id) + "\n";
};
};
}
if (new_address_list != null){
result = session.command(new_address_list);
};
}
finally
{
if ( session != null )
{
session.disconnect();
}
}
}
private getOpenRules( status )
{
return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" );
}
private getCloseRules( status )
{
return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" );
}
private getDeleteRules( status )
{
return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" );
}
private getRules( status, template )
{
rule = status.rule.getRuleText();
if ( status.ruleType != null )
{
rule = generateRule( rule, status.gateType, status.ruleType, status.contractId );
}
pattern = Pattern.compile( template, Pattern.DOTALL );
m = pattern.matcher( rule );
if ( m.find() )
{
rule = m.group( 1 );
}
rule.replaceAll( "\r", "" );
return rule.split( "\n" );
}
private generateRule( addresses, gateType, ruleType, cid )
{
String rule;
replacements = new HashMap();
replacements.put( "\\{CID\\}", String.valueOf( cid ) );
ruleText = GateCommandUtil.getRule( gateType, ruleType );
rule = GateCommandUtil.generateRule( ruleText, addresses, replacements, ruleType );
return rule;
}
Конфигурация шлюза:
Код:
user_rule.editor.class=bitel.billing.module.services.ipn.editor.MikrotikContractRuleEditor
gate_manager.class=bitel.billing.server.ipn.MikrotikGateWorker
use.script=1
Команды шлюза - как в доке на микротик
Шлюз привязал к договору
При открытии шлюза - ип договора добавляется в адресс-лист:
Код:
[admin@mt] /interface ethernet> /ip firewall address-list print without-paging where list=ACCESS_LIST
Flags: X - disabled, D - dynamic
# LIST ADDRESS
0 ;;; !!1!!
ACCESS_LIST 172.18.152.2
В логах сервера появляется:
Код:
11-15/17:55:54 DEBUG [Thread-33] MikrotikGateWorker - run
11-15/17:55:54 DEBUG [Thread-33] MikrotikGateWorker - doParentSync
11-15/17:55:54 INFO [Thread-33] MikrotikGateWorker - Running script
11-15/17:55:54 DEBUG [Thread-33] MikrotikGateWorker - gate: x.x.x.x login: admin pswd: xxxxxxxxxxxx
11-15/17:55:55 DEBUG [http-8080-2] server - executing bitel.billing.server.ipn.action.ActionSetContractStatus; time => 1173 ms.
11-15/17:55:55 DEBUG [http-8080-2] server - executing bitel.billing.server.ipn.action.ActionGateContractInfo; time => 14 ms.
11-15/17:55:55 WARN [Thread-33] ScriptInstance - x.x.x.x:22[]: using deprecated method [public final java.lang.String ru.bitel.common.Preferences.getStringValue(java.lang.String,java.lang.String)]
11-15/17:55:55 INFO [Thread-33] MikrotikGateWorker - Process time => 1131
Но при закрытии шлюза ип договора не убирается из адресс-листа!
При повторном открытии - добавляется старый ип к существующему в адресс-лист
Пробовал удалять "where list=ACCESS_LIST", теже яйца...
Подскажите пож-ста - что в коде скрипта не так ???