package jnetman.snmp; import java.io.IOException; import java.net.UnknownHostException; import jnetman.session.SnmpPref; import org.apache.log4j.Logger; import org.snmp4j.CommandResponder; import org.snmp4j.CommandResponderEvent; import org.snmp4j.MessageDispatcherImpl; import org.snmp4j.Snmp; import org.snmp4j.mp.MPv1; import org.snmp4j.mp.MPv2c; import org.snmp4j.mp.MPv3; import org.snmp4j.security.SecurityModels; import org.snmp4j.security.SecurityProtocols; import org.snmp4j.security.USM; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.UdpAddress; import org.snmp4j.transport.DefaultUdpTransportMapping; import org.snmp4j.util.MultiThreadedMessageDispatcher; import org.snmp4j.util.ThreadPool; public class SnmpTrapReceiver implements CommandResponder { // initialize Log4J logging static Logger logger = Logger.getLogger("snmp.snmpTrapReceiver"); private MultiThreadedMessageDispatcher dispatcher; private Snmp snmp = null; private Address listenAddress; private ThreadPool threadPool; private int n = 0; private long start = -1; public SnmpTrapReceiver() { logger.debug("Created"); } private void init() throws UnknownHostException, IOException { threadPool = ThreadPool.create("Trap", 4); dispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl()); listenAddress = GenericAddress.parse("udp:0.0.0.0/" + SnmpPref.getTrapsPort()); DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping( (UdpAddress) listenAddress); snmp = new Snmp(dispatcher, transport); snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1()); snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c()); snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3()); USM usm = new USM(SecurityProtocols.getInstance(), new OctetString( MPv3.createLocalEngineID()), 0); SecurityModels.getInstance().addSecurityModel(usm); snmp.listen(); logger.debug("Listening for traps on " + transport.getListenAddress().toString()); } public void run() { try { init(); snmp.addCommandResponder(this); } catch (Exception ex) { ex.printStackTrace(); } } public void processPdu(CommandResponderEvent event) { if (start < 0) { start = System.currentTimeMillis() - 1; } logger.info("TRAP received >> " + event.getPDU().toString()); n++; if ((n % 100 == 1)) { logger.info("Some statistics, processing " + (n / (double) (System.currentTimeMillis() - start)) * 1000 + " trap/s, total " + n); } } }