Реализация стандартного шлюза Mikrotik на BeanShell
Материал из BiTel WiKi
Версия от 11:03, 16 марта 2009; Stark (Обсуждение | вклад)
конфигурация типа шлюза :
user_rule.editor.class=bitel.billing.module.services.ipn.editor.ManadContractRuleEditor gate_manager.class=bitel.billing.server.ipn.ManadGateWorker use.script=1
Код шлюза:
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; } }