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

Материал из 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 поддер...)
Строка 2: Строка 2:
Так как весия IOS 12.1 поддерживает нумерацию правил акцесс-листа то из за этого шлюзы типа CISCO и CISCO2 не могут быть использованы для привязки данного железа к биллингу.
Так как весия IOS 12.1 поддерживает нумерацию правил акцесс-листа то из за этого шлюзы типа CISCO и CISCO2 не могут быть использованы для привязки данного железа к биллингу.
Разработчиком был написан интерфейс в версии 4.5 который позволяет использовать внешние скрипты, куда собственно я и вынес логику общения биллинга с моей цыской.
Разработчиком был написан интерфейс в версии 4.5 который позволяет использовать внешние скрипты, куда собственно я и вынес логику общения биллинга с моей цыской.
 +
 +
----
 +
Заходим в модуль IPN
Заходим в модуль IPN
1. Создаём тип шлюза - Script-perl
1. Создаём тип шлюза - Script-perl
-
Конфигурация:
+
Закладка "Конфигурация" типа шлюза:
-
[code]
+
user_rule.editor.class=bitel.billing.module.services.ipn.editor.ManadContractRuleEditor
user_rule.editor.class=bitel.billing.module.services.ipn.editor.ManadContractRuleEditor
gate_manager.class=bitel.billing.server.ipn.ManadGateWorker
gate_manager.class=bitel.billing.server.ipn.ManadGateWorker
use.script=1
use.script=1
script=/usr/local/BGBillingServer/ACC
script=/usr/local/BGBillingServer/ACC
-
[/code]
 
-
Создаём шлюз -
 
-
[code]
 
-
[/code]
+
АСС - есть скрипт на перле с логикой связи.
 +
 
 +
Закладка "Комманды" - пустая
 +
Закладка "Типы правил" - пустая
 +
В закладке "Скрипт" пишем следующее:
 +
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;
 +
}
 +
 
 +
 
 +
Создаём шлюз -

Версия 19:50, 3 января 2009

Стоит задача привязки 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;

}


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

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