[SNMP4J] A Simple Trap Receiver using snmp4j

2010-08-17 Thread Tsiyona
Hello,

I am trying to write a simple snmp manager that listens to traps on port 162
and processes them. This manager will only handle traps, and does not need
to send commands to agents.

Attached is the code I wrote. It is straightforward, but it does not work -
I do not get any snmp traps.
I make sure that the snmp agent really constantly generates traps, by using
a network sniffer, so my
problem is not lack of traps on the agent side. I am probably doing
something wrong.

Can anyone please help me?

Thanks,
Tsiyona


-
My code:
-

package snmpmanager;

import java.io.IOException;

import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.transport.TransportMappings;

/**
* A Simple Trap receiver using snmp4j.
*/
public class SnmpClient
{

public static final String TRAP_ADDRESS = 127.0.0.1/162;//udp:
127.0.0.1/162;
 private TransportMapping transport;
private String listeningAddress;
 private Snmp snmp;

public SnmpClient(String address)
{
 this.listeningAddress = address;
try {
start();
 } catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
 }
}

private void start() throws IOException
 {
UdpAddress udpAddress = new UdpAddress(this.listeningAddress);
transport = new DefaultUdpTransportMapping(udpAddress);
 snmp = new Snmp(transport);
transport.listen();
 CommandResponder pduHandler = new CommandResponder() {
 public synchronized void processPdu(CommandResponderEvent e) {
   PDU pdu = e.getPDU();
   if (pdu != null) {
   System.out.println(pdu);
   }
 }
};
 snmp.addCommandResponder(pduHandler);
}
 public void stop() throws IOException
{
 snmp.close();
}

public static void main(String[] args)
 {
SnmpClient client = new SnmpClient(TRAP_ADDRESS);
System.out.println(Listening for traps on address  + TRAP_ADDRESS);
 }
}
___
SNMP4J mailing list
SNMP4J@agentpp.org
http://lists.agentpp.org/mailman/listinfo/snmp4j


Re: [SNMP4J] A Simple Trap Receiver using snmp4j

2010-08-17 Thread jaikar gupta
Hi,

I had also the same problem, i had uses the the same methodology, but when i
change the
TRAP_ADRESS to 0.0.0.0/162, the it starts receiving TRAPS.

try this may this will help you.

Thanks  Regards
Jaikar Gupta


On Tue, Aug 17, 2010 at 2:06 PM, Tsiyona tsiy...@gmail.com wrote:

 Hello,

 I am trying to write a simple snmp manager that listens to traps on port
 162
 and processes them. This manager will only handle traps, and does not need
 to send commands to agents.

 Attached is the code I wrote. It is straightforward, but it does not work -
 I do not get any snmp traps.
 I make sure that the snmp agent really constantly generates traps, by using
 a network sniffer, so my
 problem is not lack of traps on the agent side. I am probably doing
 something wrong.

 Can anyone please help me?

 Thanks,
 Tsiyona



 -
My code:

 -

 package snmpmanager;

 import java.io.IOException;

 import org.snmp4j.CommandResponder;
 import org.snmp4j.CommandResponderEvent;
 import org.snmp4j.PDU;
 import org.snmp4j.Snmp;
 import org.snmp4j.TransportMapping;
 import org.snmp4j.smi.UdpAddress;
 import org.snmp4j.transport.DefaultUdpTransportMapping;
 import org.snmp4j.transport.TransportMappings;

 /**
 * A Simple Trap receiver using snmp4j.
 */
 public class SnmpClient
 {

 public static final String TRAP_ADDRESS = 127.0.0.1/162;//udp:
 127.0.0.1/162;
  private TransportMapping transport;
 private String listeningAddress;
  private Snmp snmp;

 public SnmpClient(String address)
 {
  this.listeningAddress = address;
 try {
 start();
  } catch (IOException e) {
 e.printStackTrace();
 throw new RuntimeException(e);
  }
 }

 private void start() throws IOException
  {
 UdpAddress udpAddress = new UdpAddress(this.listeningAddress);
 transport = new DefaultUdpTransportMapping(udpAddress);
  snmp = new Snmp(transport);
 transport.listen();
  CommandResponder pduHandler = new CommandResponder() {
 public synchronized void processPdu(CommandResponderEvent e) {
   PDU pdu = e.getPDU();
   if (pdu != null) {
   System.out.println(pdu);
   }
 }
 };
  snmp.addCommandResponder(pduHandler);
 }
  public void stop() throws IOException
 {
  snmp.close();
 }

 public static void main(String[] args)
  {
 SnmpClient client = new SnmpClient(TRAP_ADDRESS);
 System.out.println(Listening for traps on address  + TRAP_ADDRESS);
  }
 }

 ___
 SNMP4J mailing list
 SNMP4J@agentpp.org
 http://lists.agentpp.org/mailman/listinfo/snmp4j


___
SNMP4J mailing list
SNMP4J@agentpp.org
http://lists.agentpp.org/mailman/listinfo/snmp4j


Re: [SNMP4J] Socket closed error in Windows 7

2010-08-17 Thread Frank Fock
Hi,
There is an error in your program: main may return before the thread  
you started is finished. It is not related to SNMP4J other than the  
new release might be executed with a different speed on your system.

Best regards,
Frank


Am 17.08.2010 um 18:30 schrieb varma datla varmakda...@yahoo.com:

 Hello,
 We are using snmp4j-1.9.3d asynchronously to find devices in a  
 network. All is
 working well until we tested it in Windows 7 where it is throwing  
 the  Socket
 is closed exception after a few seconds and stops. Even the latest  
 version
 1.11.1 didn't seemed to work. Luckily we had an older version,  
 snmp4j-1.9.1e,
 which is working just fine without any errors.

 Here are the details. Could you please suggest any ideas on why this  
 is
 happening on Windows 7? or if I'm not using snmp4j appropriately.


 Environment:
 OS- Windows 7 (Firewall is off)
 SNMP4J- 1.9.3d ( also tested with 1.11.1)
 JVM- 1.6.0_13 (also tested with 1.6.0_20)
 Total addresses- 65025.
 Exception:-
 org.snmp4j.MessageException: Socket is closed
 at org.snmp4j.MessageDispatcherImpl.sendPdu(Unknown Source)
 at org.snmp4j.Snmp.sendMessage(Unknown Source)
 at org.snmp4j.Snmp.send(Unknown Source)
 at org.snmp4j.Snmp.send(Unknown Source)
 at com.some.Snmp4JUtil.send(Snmp4JUtil.java:86)
 at com.some.Snmp4JUtil$3.run(Snmp4JUtil.java:155)


 Code:
 package com.some;

 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.Writer;
 import java.util.LinkedHashSet;
 import java.util.Set;

 import org.apache.log4j.Logger;
 import org.snmp4j.CommunityTarget;
 import org.snmp4j.PDU;
 import org.snmp4j.Snmp;
 import org.snmp4j.TimeoutModel;
 import org.snmp4j.TransportMapping;
 import org.snmp4j.event.ResponseEvent;
 import org.snmp4j.event.ResponseListener;
 import org.snmp4j.mp.SnmpConstants;
 import org.snmp4j.smi.OID;
 import org.snmp4j.smi.UdpAddress;
 import org.snmp4j.smi.VariableBinding;
 import org.snmp4j.transport.DefaultUdpTransportMapping;

 public class Snmp4JUtil
 {
   private static final Logger LOGGER = Logger.getLogger 
 ( Snmp4JUtil.class );

   private Snmp snmp;
   private final int [] oid = {1, 3, 6, 1, 4, 1 };
   private final ResponseListener listener;


   public Snmp4JUtil( final ResponseListener listener )
   {
  this.listener = listener;

  try
  {
 final TransportMapping transport = new  
 DefaultUdpTransportMapping();
 this.snmp = new Snmp( transport );
 snmp.setTimeoutModel( getTimeoutModel( new int[]{ 500,  
 1000 } ) );
 snmp.listen();
  }
  catch (IOException e)
  {
 LOGGER.error( Snmp4JUtil(). Error:  + e.getMessage() );
  }
   }

   public void close()
   {
  try
  {
 snmp.close();
  }
  catch (IOException e)
  {
 LOGGER.error( close(). Error:  + e.getMessage() );
  }
   }

   public void send( final CommunityTarget target )
   {

  final PDU pdu = new PDU();
  pdu.setType( PDU.GETNEXT );
  pdu.add( new VariableBinding( new OID( oid ) ) );

  try
  {
 this.snmp.send( pdu, target, null, listener);
  }
  catch (IOException e)
  {
 LOGGER.error( send( CommunityTarget ) - address: +
 target.getAddress() + ; error: + e.getMessage() );
 e.printStackTrace();
  }
   }

   private TimeoutModel getTimeoutModel( final int[] timeoutsRetries )
   {
  return new TimeoutModel()
  {
 public long getRequestTimeout( final int totalNumberOfRetries,
final long targetTimeout )
 {
long requestTimeout = 0;

for ( int i : timeoutsRetries )
{
   requestTimeout += i;
}

return requestTimeout;
 }

 public long getRetryTimeout( final int retryCount,
  final int totalNumberOfRetries,
  final long targetTimeout )
 {
return timeoutsRetries[retryCount];
 }
  };
   }

   public static void main( final String args[] )
  throws Exception
   {
  final StringBuilder responses = new StringBuilder();

  final ResponseListener listener = new ResponseListener()
  {
 @Override
 public void onResponse( ResponseEvent event )
 {
//cancel event
((Snmp)event.getSource()).cancel(event.getRequest(), this);

// output response here.
responses.append( Response:  + event.getResponse() )
   .append( System.getProperty( line.separator ) );
 }
  };

  final Snmp4JUtil snmpUtil = new Snmp4JUtil( listener );

  // A few thousand addresses...just for testing
  final SetString addresses = getAddresses( args[0] );

  final Thread t = new Thread(){
public void run()
{
   for ( final 

Re: [SNMP4J] Socket closed error in Windows 7

2010-08-17 Thread varma datla
Hello Frank,
I apologize for that silly mistake and thanks for pointing it out. I've added a 
CountDownLatch so that the main() wouldn't exit unit all requests are being 
responded.
Actually, we had this running in Tomcat..but just want to have a standalone 
program to reproduce the problem quicker. Please let me know if you want me to 
run any further tests on Windows 7.

Code:

package com.some;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;

import org.apache.log4j.Logger;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TimeoutModel;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class Snmp4JUtil
{
   private static final Logger LOGGER = Logger.getLogger( Snmp4JUtil.class );   
   
   private Snmp snmp;
   private final int [] oid = {1, 3, 6, 1, 4, 1 };
   private final ResponseListener listener;
   
   
   public Snmp4JUtil( final ResponseListener listener )
   {
  this.listener = listener;
  
  try
  { 
 final TransportMapping transport = new DefaultUdpTransportMapping();
 this.snmp = new Snmp( transport );
 snmp.setTimeoutModel( getTimeoutModel( new int[]{ 500, 1000 } ) );
 snmp.listen();
  }
  catch (IOException e)
  {
 LOGGER.error( Snmp4JUtil() Error:  + e.getMessage() );
  }
   }
   
   public void close()
   {
  try
  {
 snmp.close();
  }
  catch (IOException e)
  {
 LOGGER.error( close() Error:  + e.getMessage() );
  }
   }
   
   public void send( final CommunityTarget target )
   {  
  PDU pdu = new PDU();
  pdu.setType( PDU.GETNEXT ); 
  pdu.add( new VariableBinding( new OID( oid ) ) );
  
  try
  { 
 this.snmp.send( pdu, target, null, listener);
  }
  catch (IOException e)
  {
 LOGGER.error( send( CommunityTarget ) - address: + 
target.getAddress() + ; error: + e.getMessage() );
 e.printStackTrace();
  }
   }
   
   private TimeoutModel getTimeoutModel( final int[] timeoutsRetries )
   {
  return new TimeoutModel()
  {
 public long getRequestTimeout( final int totalNumberOfRetries,
final long targetTimeout )
 {
long requestTimeout = 0;

for ( int i : timeoutsRetries )
{
   requestTimeout += i;
}

return requestTimeout;
 }

 public long getRetryTimeout( final int retryCount,
  final int totalNumberOfRetries,
  final long targetTimeout )
 {
return timeoutsRetries[retryCount];
 }
  };
   }  
   
   public static void main( final String args[] )
  throws Exception
   {  
  final StringBuilder responses = new StringBuilder();
  
  // A few thousand addresses...just for testing
  final SetString addresses = getAddresses( args[0] );
  
  final CountDownLatch latch = new CountDownLatch( addresses.size() );
  
  final ResponseListener listener = new ResponseListener()
  {  
 public void onResponse( ResponseEvent event )
 {
//cancel event
((Snmp)event.getSource()).cancel(event.getRequest(), this);

// output response here. 
responses.append( Response:  + event.getResponse() )
   .append( System.getProperty( line.separator ) );

latch.countDown();
System.out.println(countDown: + latch.getCount());
 }
  };  

  final Snmp4JUtil snmpUtil = new Snmp4JUtil( listener );
  
  
  final Thread t = new Thread(){
public void run()
{  
   for ( final String ipAddress : addresses )
   {
  final CommunityTarget target = new CommunityTarget(); 
 
  target.setAddress( new UdpAddress( ipAddress + /161 ) );
  target.setVersion( SnmpConstants.version1 );
  target.setRetries( 1 );
  
  snmpUtil.send( target );
   }
   
   System.out.println(Done requesting..);
   
   // Wait for few more seconds for responses..just for testing.
   try
   {
  Thread.sleep( 1 );
  
  System.out.println( Writing response to the file.. );