forum.bitel.ru http://forum.bitel.ru/ |
|
Bgbilling SNMP timeout http://forum.bitel.ru/viewtopic.php?f=19&t=11731 |
Страница 1 из 1 |
Автор: | iseed [ 27 июн 2016, 13:57 ] |
Заголовок сообщения: | Bgbilling SNMP timeout |
Доброго дня. Я описываю небольшой активатор по 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); ---- А как в данной реализации непонятно =( |
Автор: | Amir [ 27 июн 2016, 17:50 ] |
Заголовок сообщения: | Re: Bgbilling SNMP timeout |
Код: setPdu.setRetryIntervals( new int[] { 500, 1000, 2000, 5000, 5000 } );
|
Автор: | iseed [ 28 июн 2016, 08:34 ] |
Заголовок сообщения: | Re: Bgbilling SNMP timeout |
Успех. Спасибо. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |