Реализация стандартного шлюза Mikrotik на BeanShell
Материал из BiTel WiKi
(Различия между версиями)
Stark (Обсуждение | вклад) |
Stark (Обсуждение | вклад) (Поправил шлюз в соотвествии с версией 4.6) |
||
Строка 2: | Строка 2: | ||
<source lang="java"> | <source lang="java"> | ||
import java.util.*; | import java.util.*; | ||
- | import java.util. | + | import java.util.regex.*; |
- | import | + | import ru.bitel.bgbilling.common.*; |
- | import | + | import bitel.billing.common.module.ipn.*; |
+ | import bitel.billing.server.ipn.bean.*; | ||
+ | import bitel.billing.server.util.ssh.*; | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
protected void doSync() | protected void doSync() | ||
- | + | { | |
- | + | host = gate.getHost(); | |
- | + | port = gate.getPort(); | |
- | + | gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" ); | |
- | + | login = gateSetup.getStringValue( "login", "root" ); | |
- | + | pswd = gate.getKeyword(); | |
if ( log.isDebugEnabled() ) | if ( log.isDebugEnabled() ) | ||
{ | { | ||
Строка 29: | Строка 20: | ||
} | } | ||
- | + | session = null; | |
- | + | timeout = gateSetup.getIntValue( "timeout", 0 ); | |
try | try | ||
{ | { | ||
Строка 39: | Строка 30: | ||
for ( UserStatus status : statusList ) | for ( UserStatus status : statusList ) | ||
{ | { | ||
- | + | cid = status.contractId; | |
// правило для этого договора есть на шлюзе | // правило для этого договора есть на шлюзе | ||
if ( ruleExists( cid, status, session ) ) | if ( ruleExists( cid, status, session ) ) | ||
Строка 49: | Строка 40: | ||
if ( status.status == IPNContractStatus.STATUS_REMOVED ) | if ( status.status == IPNContractStatus.STATUS_REMOVED ) | ||
{ | { | ||
- | + | rules = getDeleteRules( status ); | |
for ( String rule : rules ) | for ( String rule : rules ) | ||
{ | { | ||
Строка 58: | Строка 49: | ||
else | else | ||
{ | { | ||
- | + | rules = getCloseRules( status ); | |
for ( String rule : rules ) | for ( String rule : rules ) | ||
{ | { | ||
Строка 68: | Строка 59: | ||
else if ( status.status == IPNContractStatus.STATUS_OPEN ) | else if ( status.status == IPNContractStatus.STATUS_OPEN ) | ||
{ | { | ||
- | + | rules = getOpenRules( status ); | |
for ( String rule : rules ) | for ( String rule : rules ) | ||
{ | { | ||
Строка 87: | Строка 78: | ||
} | } | ||
} | } | ||
- | + | } | |
- | + | ruleExists( cid, status, session ) throws Exception | |
{ | { | ||
- | + | answer = session.command( "ip firewall address-list print" ); | |
return answer.indexOf( "!!" + cid + "!!" ) >= 0; | return answer.indexOf( "!!" + cid + "!!" ) >= 0; | ||
} | } | ||
- | + | getOpenRules( status ) | |
{ | { | ||
return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" ); | return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" ); | ||
} | } | ||
- | private | + | private getCloseRules( status ) |
{ | { | ||
return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" ); | return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" ); | ||
} | } | ||
- | private | + | private getDeleteRules( status ) |
{ | { | ||
return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" ); | return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" ); | ||
Строка 111: | Строка 102: | ||
- | + | private getRules( status, template ) | |
- | + | ||
{ | { | ||
// пользовательское правило, без типа - то все оставляем как есть | // пользовательское правило, без типа - то все оставляем как есть | ||
- | + | rule = status.rule.getRuleText(); | |
// типизированное правило | // типизированное правило | ||
if ( status.ruleType != null ) | if ( status.ruleType != null ) | ||
Строка 121: | Строка 111: | ||
rule = generateRule( rule, status.gateType, status.ruleType, status.contractId ); | rule = generateRule( rule, status.gateType, status.ruleType, status.contractId ); | ||
} | } | ||
- | + | pattern = Pattern.compile( template, Pattern.DOTALL ); | |
- | + | m = pattern.matcher( rule ); | |
if ( m.find() ) | if ( m.find() ) | ||
{ | { | ||
Строка 131: | Строка 121: | ||
} | } | ||
- | + | generateRule( addresses, gateType, uleType, cid ) | |
{ | { | ||
String rule; | String rule; | ||
- | + | replacements = new HashMap(); | |
replacements.put( "\\{CID\\}", String.valueOf( cid ) ); | replacements.put( "\\{CID\\}", String.valueOf( cid ) ); | ||
- | + | ruleText = ManadUtils.getRule( gateType, ruleType ); | |
rule = ManadUtils.generateRule( ruleText, addresses, replacements, ruleType ); | rule = ManadUtils.generateRule( ruleText, addresses, replacements, ruleType ); | ||
return rule; | return rule; |
Версия 11:02, 16 марта 2009
Код шлюза:
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.util.ssh.*; protected void doSync() { host = gate.getHost(); port = gate.getPort(); gateSetup = new DefaultSetup( 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; timeout = gateSetup.getIntValue( "timeout", 0 ); try { session = new SSHSessionExec( host, port, login, pswd ); session.setTimeout( timeout ); // session.connect(); for ( UserStatus status : statusList ) { cid = status.contractId; // правило для этого договора есть на шлюзе if ( ruleExists( cid, status, session ) ) { // если правило есть а юзер заблокирован - удаляем правило if ( status.status > 0 ) { // удаляем if ( status.status == IPNContractStatus.STATUS_REMOVED ) { rules = getDeleteRules( status ); for ( String rule : rules ) { session.command( rule ); } } // закрываем else { rules = getCloseRules( status ); for ( String rule : rules ) { session.command( rule ); } } } } else if ( status.status == IPNContractStatus.STATUS_OPEN ) { rules = getOpenRules( status ); for ( String rule : rules ) { session.command( rule ); } } } } catch( Exception e ) { throw new RuntimeException( e ); } finally { if ( session != null ) { session.disconnect(); } } } ruleExists( cid, status, session ) throws Exception { answer = session.command( "ip firewall address-list print" ); return answer.indexOf( "!!" + cid + "!!" ) >= 0; } 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" ); } generateRule( addresses, gateType, uleType, cid ) { String rule; replacements = new HashMap(); replacements.put( "\\{CID\\}", String.valueOf( cid ) ); ruleText = ManadUtils.getRule( gateType, ruleType ); rule = ManadUtils.generateRule( ruleText, addresses, replacements, ruleType ); return rule; } }