Пример реализации скриптового универсального шлюза

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

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

Стоит задача привязки CISCO 6509 SUP-2/MSFC-2/PFC2 IOS (c6sup2_rp-JK2O3SV-M), Version 12.1(26)E9, RELEASE SOFTWARE (fc1) Так как весия IOS 12.1 поддерживает нумерацию правил акцесс-листа то из за этого шлюзы типа CISCO и CISCO2 не могут быть использованы для привязки данного железа к биллингу. Разработчиком был написан интерфейс в версии 4.5 который позволяет использовать внешние скрипты, куда собственно я и вынес логику общения биллинга с моей цыской.


Заходим в модуль IPN 1. Создаём тип шлюза - Script-perl Закладка "Конфигурация" типа шлюза:

user_rule.editor.class=bitel.billing.module.services.ipn.editor.ManadContractRuleEditor
gate_manager.class=bitel.billing.server.ipn.ManadGateWorker
use.script=1
script=/usr/local/BGBillingServer/ACC

АСС - есть скрипт на перле с логикой связи.

Закладка "Комманды" - оставляем пустой. Закладка "Типы правил" - оставляем пустой. В закладке "Скрипт" пишем следующее:

import bitel.billing.server.ipn.bean.AddressRange;
import bitel.billing.server.ipn.UserStatus;
import bitel.billing.server.ipn.bean.AddressRangeManager;
import bitel.billing.server.util.DefaultServerSetup;
import bitel.billing.server.util.Utils;
import bitel.billing.common.IPUtils;

protected void doSync()
{
    date = new GregorianCalendar();
    gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" 
);                               
    script = gateSetup.getStringValue( "script");

    //цикл по всем договорам на этом шлюзе
    for( UserStatus status : statusList )
    {
        cid = status.contractId;
        //
        AddressRangeManager man = new AddressRangeManager( con, mid );
        addressList = man.getContractAddressRange( cid, date, -1 );
        for ( AddressRange range : addressList)
        {
            ip = getIP( range);
            mask = getMask ( range) ;
            String host = gate.getHost();
            if ( mask == null )
            {
                log.info( "Incorrect range  for cid = " + cid );
                continue;
            }
            log.info( "script = " + script );
            log.info( "ip = " + ip );   
            log.info( "mask = " + mask );   
            log.info( "host = " + host );   


            String [] arguments = { script, ip, mask, host, String.valueOf( status.status ) };

            //выполняем команду
            Process process = Runtime.getRuntime().exec( arguments );
               //ждем окончания работы процесса ..Это не обязательно
            process.waitFor();
            log.info( "exitCode=" + process.exitValue() );       
       
        }
    }
}

getIP ( range )
{
    return IPUtils.convertIpToString( range.getAddr1() );
}
getMask ( range )
{
    result = null;
    delta = range.getAddr2() - range.getAddr1() + 1;
    int pow = getPow( delta );
    log.info( "pow = " + pow );
   

    //махинация для того чтоб получить 0xFFFFFFFF -в beanshell не 
//получилось задать такое большое число и модификатор l в конце не работает
    ffMask = (0xFFFFFFF);
    ffMask = (ffMask << 8 ) | 0xFF;

    if ( pow >= 0 )
    {           
        mask = ffMask;
        mask = (mask << pow) & ffMask;       
        result = IPUtils.convertIpToString( mask );
    }   
    return result;
}

//находим разницу между двумя ip(она должна быть степеью двойки) и 
//возращаем эту степень
int getPow( long delta )
{
    int idx = 0;
    int count = 0;
    int pow = -1;
    while (  delta > 0 )
    {
           
        if ( (delta  &  1 ) == 1 )
        {
            count ++;
            pow = idx;
            if ( count > 1)
            {
                break;
            }                           
        }
        delta = (delta >> 1);
           
        idx++;
                       
    }
    //если не одна единица в числе, значит это не степень двойки и 
//диапазон задан неверно 
    if ( count != 1 )
    {
          pow = -1;           
    }
    return pow;
}

Создаём шлюз -

Личные инструменты