Доброго дня.
Я описываю небольшой активатор по 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); ---- А как в данной реализации непонятно =(
|