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

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

(Различия между версиями)
Перейти к: навигация, поиск
(заменил стандартаную реализацию не telnet)
 
(2 промежуточные версии не показаны)
Строка 1: Строка 1:
 +
конфигурация типа шлюза :
 +
 +
<source lang="bash">
 +
user_rule.editor.class=bitel.billing.module.services.ipn.editor.MikrotikContractRuleEditor
 +
gate_manager.class=bitel.billing.server.ipn.MikrotikTelnetGateWorker
 +
use.script=1
 +
</source>
 +
Код шлюза:
Код шлюза:
<source lang="java">  
<source lang="java">  
-
import java.util.*;
+
package bitel.billing.server.ipn;
 +
 
 +
import java.util.HashMap;
import java.util.Map;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Matcher;
Строка 7: Строка 17:
import ru.bitel.bgbilling.common.DefaultSetup;
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.common.module.ipn.IPNContractStatus;
import bitel.billing.server.ipn.bean.GateType;
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.ipn.bean.RuleType;
import bitel.billing.server.util.ssh.SSHSessionExec;
import bitel.billing.server.util.ssh.SSHSessionExec;
Строка 21: Строка 32:
         String host = gate.getHost();
         String host = gate.getHost();
         int port = gate.getPort();
         int port = gate.getPort();
-
         DefaultSetup gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );
+
         Preferences gateSetup = new DefaultSetup( gate.getConfig(), "\r\n" );
-
         String login = gateSetup.getStringValue( "login", "root" );
+
         String login = gateSetup.get( "login", "root" );
         String pswd = gate.getKeyword();
         String pswd = gate.getKeyword();
         if ( log.isDebugEnabled() )
         if ( log.isDebugEnabled() )
Строка 30: Строка 41:
         SSHSessionExec session = null;
         SSHSessionExec session = null;
-
         int timeout = gateSetup.getIntValue( "timeout", 0 );
+
         int timeout = gateSetup.getInt( "timeout", 0 );
         try
         try
         {
         {
Строка 119: Строка 130:
         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 = Pattern.compile( template, Pattern.DOTALL );
         Pattern pattern = Pattern.compile( template, Pattern.DOTALL );
Строка 137: Строка 148:
replacements.put( "\\{CID\\}", String.valueOf( cid ) );
replacements.put( "\\{CID\\}", String.valueOf( cid ) );
-
String 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;
	}
}
Личные инструменты