Пример реализации скриптового универсального шлюза
Материал из BiTel WiKi
Max (Обсуждение | вклад) (Новая: Стоит задача привязки CISCO 6509 SUP-2/MSFC-2/PFC2 IOS (c6sup2_rp-JK2O3SV-M), Version 12.1(26)E9, RELEASE SOFTWARE (fc1) Так как весия IOS 12.1 поддер...) |
Max (Обсуждение | вклад) |
||
| Строка 2: | Строка 2: | ||
Так как весия IOS 12.1 поддерживает нумерацию правил акцесс-листа то из за этого шлюзы типа CISCO и CISCO2 не могут быть использованы для привязки данного железа к биллингу. | Так как весия IOS 12.1 поддерживает нумерацию правил акцесс-листа то из за этого шлюзы типа CISCO и CISCO2 не могут быть использованы для привязки данного железа к биллингу. | ||
Разработчиком был написан интерфейс в версии 4.5 который позволяет использовать внешние скрипты, куда собственно я и вынес логику общения биллинга с моей цыской. | Разработчиком был написан интерфейс в версии 4.5 который позволяет использовать внешние скрипты, куда собственно я и вынес логику общения биллинга с моей цыской. | ||
| + | |||
| + | ---- | ||
| + | |||
Заходим в модуль IPN | Заходим в модуль IPN | ||
1. Создаём тип шлюза - Script-perl | 1. Создаём тип шлюза - Script-perl | ||
| - | Конфигурация: | + | Закладка "Конфигурация" типа шлюза: |
| - | + | ||
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 | ||
| - | |||
| - | |||
| - | |||
| - | + | АСС - есть скрипт на перле с логикой связи. | |
| + | |||
| + | Закладка "Комманды" - пустая | ||
| + | Закладка "Типы правил" - пустая | ||
| + | В закладке "Скрипт" пишем следующее: | ||
| + | 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;
}
Создаём шлюз -
