BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 27 апр 2024, 17:24

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Bgbilling SNMP timeout
СообщениеДобавлено: 27 июн 2016, 13:57 
Не в сети

Зарегистрирован: 01 мар 2013, 09:18
Сообщения: 46
Карма: 5
Доброго дня.

Я описываю небольшой активатор по SNMP для активации портов
---
package ru.bitel.bgbilling.inet.dyn.device.dlink;

import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivator;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorAdapter;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorEvent;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import java.util.logging.Logger;
import uk.co.westhawk.snmp.pdu.*;
import uk.co.westhawk.snmp.stack.*;
import ru.bitel.common.concurrent.*;
import java.util.*;
import java.io.*;

public class DlinkServiceActivator extends ServiceActivatorAdapter implements ServiceActivator
{

private static final Logger logger = Logger.getLogger( "DEBUG" );

InetDevice device;
String host;
int port;
int snmpVersion;
int snmpPort;

SnmpContext context;
String snmpCommunity = "private";

@Override
public Object connectionClose( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
logger.info( ">>>close" );
return null;
}

@Override
public Object serviceCreate( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
int port = serviceActivatorEvent1.getNewInetServ().getInterfaceId();
logger.info( ">>>create" + host + "/" + port );
setPortStatus(port,1);
return true;
}

@Override
public Object destroy()
throws Exception
{
if( context != null )
{
context.destroy();
}
return true;
}

@Override
public Object connect()
throws Exception
{

switch( snmpVersion )
{
case 1:
{
this.context = new SnmpContext( host, snmpPort );
break;
}

case 2:
{
this.context = new SnmpContextv2c( host, snmpPort );
break;
}

default:
{
logger.info( "snmpVersion=" + snmpVersion );
return false;
}
}
this.context.setCommunity( snmpCommunity );

return true;
}

@Override
public Object connectionModify( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
logger.info( ">>>conmodify" );
return null;
}

@Override
public Object onAccountingStart( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
return null;
}

@Override
public Object serviceModify( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
logger.info( ">>>modify" );
return null;
}

@Override
public Object onAccountingStop( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
return null;
}

@Override
public Object disconnect()
throws Exception
{
logger.info( ">>>disconnect" );
return null;
}

@Override
public Object serviceCancel( ServiceActivatorEvent serviceActivatorEvent1 )
throws Exception
{
int port = serviceActivatorEvent1.getOldInetServ().getInterfaceId();
logger.info( ">>>cancel" + host + "/" + port);
setPortStatus(port,2);
return true;
}

@Override
public Object init( int moduleId, InetDevice device, InetDeviceType deviceType, ParameterMap deviceConfig)
throws Exception
{
logger.info( ">>>init" );

this.device = device;

this.host = device.getHost();
this.snmpVersion = deviceConfig.getInt( "snmp.version", 2 );
this.snmpPort = deviceConfig.getInt( "snmp.port", 161 );
logger.info( device.getSecret() );

if( !device.getSecret().isEmpty() )
snmpCommunity = device.getSecret();

return true;
}

public Object setPortStatus(int port, int status)
{
AsnObjectId oidPortStatus= new AsnObjectId( ".1.3.6.1.2.1.2.2.1.7");
AsnObjectId oidSave= new AsnObjectId( "1.3.6.1.4.1.171.12.1.2.18.4.0");
oidPortStatus.add( port );

SetPdu setPdu = new SetPdu( context );
setPdu.addOid( oidPortStatus, new AsnInteger( status ) );
setPdu.addOid( oidSave, new AsnInteger( 2 ) );

FutureObserver<?> result = new FutureObserver<Object>()
{
@Override
protected Object updateImpl( Observable obs, Object varbind )
{
SetPdu pdu = (SetPdu)obs;
if( pdu.getErrorStatus() == AsnObject.SNMP_ERR_NOERROR )
{
logger.info( "Ok: " + pdu );

return true;
}

return false;
}
};

setPdu.addObserver( result );
try
{
setPdu.send();
}
catch (IOException e)
{
e.printStackTrace();
}
catch(PduException e)
{
e.printStackTrace();
}
logger.info( result.toString() );
return true;
}
}
---
По факту включения или выключения портов в биллинге выключает или включает порт на коммутаторе.
Скрипт работает, но в логах коммутатор я видел задублированные надписи о сохранении конфигурации.
Судя по логу из обсервера команды не дублированы
---
INFO: Ok: uk.co.westhawk.snmp.stack.SetPdu[context=SnmpContextv2c[host=10.75.XX.XX, port=161, bindAddress=null, socketType=Standard, community=xxxx, #trapListeners=0, #pduListeners=0], reqId=2, msgType=0xA3, reqVarbinds=[1.3.6.1.2.1.2.2.1.7.1: 2, 1.3.6.1.4.1.171.12.1.2.18.4.0: 2]]
---

Я предположил что после получения команды на сохранение коммутатор ничего не отвечает биллингу и тот шлет повторную команду.
И вот собственно вопрос: Как управлять количеством повторов при запросах SNMP?

При простом клиенте это выглядит так:
---
transport = new DefaultUdpTransportMapping();
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(targetAddress);
target.setRetries(3);
target.setTimeout(5000);
target.setVersion(1);
----
А как в данной реализации непонятно =(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bgbilling SNMP timeout
СообщениеДобавлено: 27 июн 2016, 17:50 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Код:
setPdu.setRetryIntervals( new int[] { 500, 1000, 2000, 5000, 5000 } );


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Bgbilling SNMP timeout
СообщениеДобавлено: 28 июн 2016, 08:34 
Не в сети

Зарегистрирован: 01 мар 2013, 09:18
Сообщения: 46
Карма: 5
Успех.
Спасибо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.228s | 25 Queries | GZIP : On ]