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

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

Версия от 13:21, 4 сентября 2008; 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.regex.Matcher;
import java.util.regex.Pattern;
 
import bitel.billing.common.module.ipn.IPNContractStatus;
import bitel.billing.server.util.DefaultServerSetup;
import bitel.billing.server.util.ssh.SSHSessionExec;
import bitel.billing.server.ipn.bean.*;
 
protected void doSync()
{
 
    String host = gate.getHost();
    int port = gate.getPort();
 
 
    DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" );        
 
    String login = gateSetup.getStringValue( "login", "root" );
 
    String pswd = gate.getKeyword();
 
    if( log.isDebugEnabled() )
    {
        log.debug( " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd );
    }
 
    SSHSessionExec session = null;
 
    try
    {
        session = new SSHSessionExec(  host, port, login, pswd );
        //session.connect();
 
 
        for( status : statusList )
		{
			Integer cid = status.contractId;
 
			// правило для этого договора есть на шлюзе
			if ( ruleExists(cid, status, session) )
			{
				//	если правило есть а юзер заблокирован - удаляем правило
				if ( status.status > 0 )
                {
					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( cid, status, session ) throws Exception
{
	//String answer = session.command( "ip firewall filter print" );
	String answer = session.command( "ip firewall address-list print" );			
	return answer.indexOf( "!!" + cid + "!!" ) >= 0;		
}
 
 
private String[]  getOpenRules( status )
{
 
	return getRules( status, "\\[OPEN\\]((.|\n)*)\\[/OPEN\\]" );
}
 
private String[]  getCloseRules( status )
{
 
 
	return getRules( status, "\\[CLOSE\\]((.|\n)*)\\[/CLOSE\\]" );
}
 
 
 
 
private String[]  getRules(  status, template )
{
	// пользовательское правило, без типа - то все оставляем как есть
	String rule = status.rule.getRuleText();
 
 
 
	//типизированное правило
	if( status.ruleType != null )
 
	{	
		String ruleText = ManadUtils.getRule( status.gateType, status.ruleType );
		rule = ManadUtils.generateRuleNew( ruleText, status.rule.getRuleText(), null, status.ruleType );
	}
 
 
	Pattern pattern = Pattern.compile( template );
	Matcher m = pattern.matcher( rule );
	if (m.find())
	{
		rule = m.group( 1 );
	}		
 
	rule.replaceAll( "\r", "" );
 
 
	String[] parts = rule.split( "\n" );
 
 
	return parts;
}
Личные инструменты