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

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

(Различия между версиями)
Перейти к: навигация, поиск
(Поправил шлюз в соотвествии с версией 4.6)
(заменил стандартаную реализацию не telnet)
 
Строка 2: Строка 2:
<source lang="bash">
<source lang="bash">
-
user_rule.editor.class=bitel.billing.module.services.ipn.editor.ManadContractRuleEditor
+
user_rule.editor.class=bitel.billing.module.services.ipn.editor.MikrotikContractRuleEditor
-
gate_manager.class=bitel.billing.server.ipn.ManadGateWorker
+
gate_manager.class=bitel.billing.server.ipn.MikrotikTelnetGateWorker
use.script=1
use.script=1
</source>
</source>
Строка 9: Строка 9:
Код шлюза:
Код шлюза:
<source lang="java">  
<source lang="java">  
-
import java.util.*;
+
package bitel.billing.server.ipn;
-
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.*;
+
 +
import java.util.HashMap;
 +
import java.util.Map;
 +
import java.util.regex.Matcher;
 +
import java.util.regex.Pattern;
 +
 +
import ru.bitel.bgbilling.common.DefaultSetup;
 +
import ru.bitel.bgbilling.modules.ipn.server.bean.command.GateCommandUtil;
 +
import ru.bitel.common.Preferences;
 +
import bitel.billing.common.module.ipn.IPNContractStatus;
 +
import bitel.billing.server.ipn.bean.GateType;
 +
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()
-
    {
+
{
-
         host = gate.getHost();
+
         String host = gate.getHost();
-
         port = gate.getPort();
+
         int port = gate.getPort();
-
         gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );
+
         Preferences gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );
-
         login = gateSetup.getStringValue( "login", "root" );
+
         String login = gateSetup.get( "login", "root" );
-
         pswd = gate.getKeyword();
+
         String pswd = gate.getKeyword();
         if ( log.isDebugEnabled() )
         if ( log.isDebugEnabled() )
         {
         {
Строка 28: Строка 40:
         }
         }
-
         session = null;
+
         SSHSessionExec session = null;
-
         timeout = gateSetup.getIntValue( "timeout", 0 );
+
         int timeout = gateSetup.getInt( "timeout", 0 );
         try
         try
         {
         {
Строка 38: Строка 50:
             for ( UserStatus status : statusList )
             for ( UserStatus status : statusList )
             {
             {
-
                 cid = status.contractId;
+
                 Integer cid = status.contractId;
                 // правило для этого договора есть на шлюзе
                 // правило для этого договора есть на шлюзе
                 if ( ruleExists( cid, status, session ) )
                 if ( ruleExists( cid, status, session ) )
Строка 48: Строка 60:
                         if ( status.status == IPNContractStatus.STATUS_REMOVED )
                         if ( status.status == IPNContractStatus.STATUS_REMOVED )
                         {
                         {
-
                             rules = getDeleteRules( status );
+
                             String[] rules = getDeleteRules( status );
                             for ( String rule : rules )
                             for ( String rule : rules )
                             {
                             {
Строка 57: Строка 69:
                         else
                         else
                         {
                         {
-
                             rules = getCloseRules( status );
+
                             String[] rules = getCloseRules( status );
                             for ( String rule : rules )
                             for ( String rule : rules )
                             {
                             {
Строка 67: Строка 79:
                 else if ( status.status == IPNContractStatus.STATUS_OPEN )
                 else if ( status.status == IPNContractStatus.STATUS_OPEN )
                 {
                 {
-
                     rules = getOpenRules( status );
+
                     String[] rules = getOpenRules( status );
                     for ( String rule : rules )
                     for ( String rule : rules )
                     {
                     {
Строка 86: Строка 98:
             }
             }
         }
         }
-
    }
+
}
-
        ruleExists( cid, status, session ) throws Exception
+
private boolean ruleExists( Integer cid, UserStatus status, SSHSessionExec session ) throws Exception
{
{
-
answer = session.command( "ip firewall address-list print" );
+
String answer = session.command( "ip firewall address-list print" );
return answer.indexOf( "!!" + cid + "!!" ) >= 0;
return answer.indexOf( "!!" + cid + "!!" ) >= 0;
}
}
-
getOpenRules( status )
+
private String[]  getOpenRules( UserStatus status )
{
{
return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" );
return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" );
}
}
-
private getCloseRules( status )
+
private String[]  getCloseRules( UserStatus status )
{
{
return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" );
return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" );
}
}
-
private getDeleteRules( status )
+
private String[]  getDeleteRules( UserStatus status )
{
{
return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" );
return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" );
Строка 110: Строка 122:
-
    private getRules( status, template )
+
private String[] getRules( UserStatus status,
 +
                              String template )
     {
     {
         // пользовательское правило, без типа - то все оставляем как есть
         // пользовательское правило, без типа - то все оставляем как есть
-
         rule = status.rule.getRuleText();
+
         String rule = status.rule.getRuleText();
         // типизированное правило
         // типизированное правило
         if ( status.ruleType != null )
         if ( status.ruleType != null )
         {
         {
-
     rule = generateRule( rule, status.gateType, status.ruleType, status.contractId );
+
     rule = generateRule( rule, gateType, status.ruleType, status.contractId );
         }
         }
-
         pattern = Pattern.compile( template, Pattern.DOTALL );
+
         Pattern pattern = Pattern.compile( template, Pattern.DOTALL );
-
         m = pattern.matcher( rule );
+
         Matcher m = pattern.matcher( rule );
         if ( m.find() )
         if ( m.find() )
         {
         {
Строка 129: Строка 142:
     }
     }
-
generateRule( addresses, gateType, uleType, cid )
+
public static String generateRule( String addresses, GateType gateType, RuleType ruleType, int cid )
{
{
String rule;
String rule;
-
replacements = new HashMap();
+
Map<String, String> replacements = new HashMap<String, String>();
replacements.put( "\\{CID\\}", String.valueOf( cid ) );
replacements.put( "\\{CID\\}", String.valueOf( cid ) );
-
ruleText = ManadUtils.getRule( gateType, ruleType );
+
String ruleText = GateCommandUtil.getRule( gateType, ruleType );
-
rule = ManadUtils.generateRule( ruleText, addresses, replacements, ruleType );
+
rule = GateCommandUtil.generateRule( ruleText, addresses, replacements, ruleType );
return rule;
return rule;
}
}
}
}
</source>
</source>

Текущая версия на 13:32, 8 апреля 2010

конфигурация типа шлюза :

user_rule.editor.class=bitel.billing.module.services.ipn.editor.MikrotikContractRuleEditor
gate_manager.class=bitel.billing.server.ipn.MikrotikTelnetGateWorker
use.script=1

Код шлюза:

package bitel.billing.server.ipn;
 
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import ru.bitel.bgbilling.common.DefaultSetup;
import ru.bitel.bgbilling.modules.ipn.server.bean.command.GateCommandUtil;
import ru.bitel.common.Preferences;
import bitel.billing.common.module.ipn.IPNContractStatus;
import bitel.billing.server.ipn.bean.GateType;
import bitel.billing.server.ipn.bean.RuleType;
import bitel.billing.server.util.ssh.SSHSessionExec;
 
public class MikrotikGateWorker
    extends GateWorker
{
	@Override
    protected void doSync()
	{
        String host = gate.getHost();
        int port = gate.getPort();
        Preferences gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );
        String login = gateSetup.get( "login", "root" );
        String pswd = gate.getKeyword();
        if ( log.isDebugEnabled() )
        {
            log.debug( " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd );
        }
 
        SSHSessionExec session = null;
        int timeout = gateSetup.getInt( "timeout", 0 );
        try
        {
            session = new SSHSessionExec( host, port, login, pswd );
            session.setTimeout( timeout );
 
            // session.connect();
            for ( UserStatus status : statusList )
            {
                Integer cid = status.contractId;
                // правило для этого договора есть на шлюзе
                if ( ruleExists( cid, status, session ) )
                {
                    // если правило есть а юзер заблокирован - удаляем правило
                    if ( status.status > 0 )
                    {
                        // удаляем
                        if ( status.status == IPNContractStatus.STATUS_REMOVED )
                        {
                            String[] rules = getDeleteRules( status );
                            for ( String rule : rules )
                            {
                                session.command( rule );
                            }
                        }
                        // закрываем
                        else
                        {
                            String[] rules = getCloseRules( status );
                            for ( String rule : rules )
                            {
                                session.command( rule );
                            }
                        }
                    }
                }
                else if ( status.status == IPNContractStatus.STATUS_OPEN )
                {
                    String[] rules = getOpenRules( status );
                    for ( String rule : rules )
                    {
                        session.command( rule );
                    }
                }
            }
        }
        catch( Exception e )
        {
            throw new RuntimeException( e );
        }
        finally
        {
            if ( session != null )
            {
                session.disconnect();
            }
        }	
	}
 
	private boolean ruleExists( Integer cid, UserStatus status, SSHSessionExec session ) throws Exception
	{
		String answer = session.command( "ip firewall address-list print" );			
		return answer.indexOf( "!!" + cid + "!!" ) >= 0;		
	}
 
	private String[]  getOpenRules( UserStatus status )
	{
		return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]" );
	}
 
	private String[]  getCloseRules( UserStatus status )
	{
		return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]" );
	}
 
	private String[]  getDeleteRules( UserStatus status )
	{
		return getRules( status, "\\[DELETE\\](.*)\\[/DELETE\\]" );
	}	
 
 
	private String[] getRules( UserStatus status,
                               String template )
    {
        // пользовательское правило, без типа - то все оставляем как есть
        String rule = status.rule.getRuleText();
        // типизированное правило
        if ( status.ruleType != null )
        {
    		rule = generateRule( rule, gateType, status.ruleType, status.contractId );
        }
        Pattern pattern = Pattern.compile( template, Pattern.DOTALL );
        Matcher m = pattern.matcher( rule );
        if ( m.find() )
        {
            rule = m.group( 1 );
        }
        rule.replaceAll( "\r", "" );
        return rule.split( "\n" );
    }
 
	public static String generateRule( String addresses, GateType gateType, RuleType ruleType, int cid )
	{
		String rule;
		Map<String, String> replacements = new HashMap<String, String>();		
		replacements.put( "\\{CID\\}", String.valueOf( cid ) );
 
		String ruleText = GateCommandUtil.getRule( gateType, ruleType );
		rule = GateCommandUtil.generateRule( ruleText, addresses, replacements, ruleType );
		return rule;
	}
}
Личные инструменты