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

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

Перейти к: навигация, поиск

Код шлюза:

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;
	}
}
Личные инструменты