Реализация стандартного шлюза Mikrotik на BeanShell

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
(Поправил шлюз в соотвествии с версией 4.6)
Строка 2: Строка 2:
<source lang="java">  
<source lang="java">  
import java.util.*;
import java.util.*;
-
import java.util.Map;
+
import java.util.regex.*;
-
import java.util.regex.Matcher;
+
import ru.bitel.bgbilling.common.*;
-
import java.util.regex.Pattern;
+
import bitel.billing.common.module.ipn.*;
 +
import bitel.billing.server.ipn.bean.*;
 +
import bitel.billing.server.util.ssh.*;
-
import ru.bitel.bgbilling.common.DefaultSetup;
 
-
import bitel.billing.common.module.ipn.IPNContractStatus;
 
-
import bitel.billing.server.ipn.bean.GateType;
 
-
import bitel.billing.server.ipn.bean.ManadUtils;
 
-
import bitel.billing.server.ipn.bean.RuleType;
 
-
import bitel.billing.server.util.ssh.SSHSessionExec;
 
-
 
-
public class MikrotikGateWorker
 
-
    extends GateWorker
 
-
{
 
-
@Override
 
     protected void doSync()
     protected void doSync()
-
{
+
    {
-
         String host = gate.getHost();
+
         host = gate.getHost();
-
         int port = gate.getPort();
+
         port = gate.getPort();
-
         DefaultSetup gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );
+
         gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );
-
         String login = gateSetup.getStringValue( "login", "root" );
+
         login = gateSetup.getStringValue( "login", "root" );
-
         String pswd = gate.getKeyword();
+
         pswd = gate.getKeyword();
         if ( log.isDebugEnabled() )
         if ( log.isDebugEnabled() )
         {
         {
Строка 29: Строка 20:
         }
         }
-
         SSHSessionExec session = null;
+
         session = null;
-
         int timeout = gateSetup.getIntValue( "timeout", 0 );
+
         timeout = gateSetup.getIntValue( "timeout", 0 );
         try
         try
         {
         {
Строка 39: Строка 30:
             for ( UserStatus status : statusList )
             for ( UserStatus status : statusList )
             {
             {
-
                 Integer cid = status.contractId;
+
                 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 )
                         {
                         {
-
                             String[] rules = getDeleteRules( status );
+
                             rules = getDeleteRules( status );
                             for ( String rule : rules )
                             for ( String rule : rules )
                             {
                             {
Строка 58: Строка 49:
                         else
                         else
                         {
                         {
-
                             String[] rules = getCloseRules( status );
+
                             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 )
                 {
                 {
-
                     String[] rules = getOpenRules( status );
+
                     rules = getOpenRules( status );
                     for ( String rule : rules )
                     for ( String rule : rules )
                     {
                     {
Строка 87: Строка 78:
             }
             }
         }
         }
-
}
+
    }
-
private boolean ruleExists( Integer cid, UserStatus status, SSHSessionExec session ) throws Exception
+
        ruleExists( cid, status, session ) throws Exception
{
{
-
String answer = session.command( "ip firewall address-list print" );
+
answer = session.command( "ip firewall address-list print" );
return answer.indexOf( "!!" + cid + "!!" ) >= 0;
return answer.indexOf( "!!" + cid + "!!" ) >= 0;
}
}
-
private String[]  getOpenRules( UserStatus status )
+
getOpenRules( status )
{
{
return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" );
return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" );
}
}
-
private String[]  getCloseRules( UserStatus status )
+
private getCloseRules( status )
{
{
return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" );
return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" );
}
}
-
private String[]  getDeleteRules( UserStatus status )
+
private getDeleteRules( status )
{
{
return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" );
return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" );
Строка 111: Строка 102:
-
private String[] getRules( UserStatus status,
+
    private getRules( status, template )
-
                              String template )
+
     {
     {
         // пользовательское правило, без типа - то все оставляем как есть
         // пользовательское правило, без типа - то все оставляем как есть
-
         String rule = status.rule.getRuleText();
+
         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 = Pattern.compile( template, Pattern.DOTALL );
+
         pattern = Pattern.compile( template, Pattern.DOTALL );
-
         Matcher m = pattern.matcher( rule );
+
         m = pattern.matcher( rule );
         if ( m.find() )
         if ( m.find() )
         {
         {
Строка 131: Строка 121:
     }
     }
-
public static String generateRule( String addresses, GateType gateType, RuleType ruleType, int cid )
+
generateRule( addresses, gateType, uleType, cid )
{
{
String rule;
String rule;
-
Map<String, String> replacements = new HashMap<String, String>();
+
replacements = new HashMap();
replacements.put( "\\{CID\\}", String.valueOf( cid ) );
replacements.put( "\\{CID\\}", String.valueOf( cid ) );
-
String ruleText = ManadUtils.getRule( gateType, ruleType );
+
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;
	}
}
Личные инструменты