package org.rhq.plugins.snmptrapd; import java.io.IOException; import java.net.InetAddress; import java.util.Map; import java.util.Set; import org.rhq.core.domain.event.Event; import org.rhq.core.domain.event.EventSource; import org.rhq.core.domain.event.transfer.EventReport; import org.rhq.core.pc.event.EventSenderRunner; import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; import org.snmp4j.Snmp; import org.snmp4j.TransportMapping; import org.snmp4j.mp.SnmpConstants; import org.snmp4j.smi.OID; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.UdpAddress; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultUdpTransportMapping; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import static org.testng.AssertJUnit.*; public class SnmpTrapdComponentTest extends ComponentTest { private Snmp snmp; private TransportMapping peer; private InetAddress address; private int port; public static final OctetString community = new OctetString("public"); static final OID alertName = oid("1.3.6.1.4.1.18016.2.1.1"); // private static final OID alertResourceName = oid("1.3.6.1.4.1.18016.2.1.2"); // private static final OID alertPlatformName = oid("1.3.6.1.4.1.18016.2.1.3"); private static final OID alertSeverity = oid("1.3.6.1.4.1.18016.2.1.5"); // private static final OID alertUrl = oid("1.3.6.1.4.1.18016.2.1.6"); private static OID oid(String string) { return new OID(string); } public SnmpTrapdComponentTest() { super(new SnmpTrapdComponent()); } @BeforeTest @Override protected void before() throws Exception { super.before(); port = configuration.getSimple("port").getIntegerValue(); try { address = InetAddress.getLocalHost(); peer = new DefaultUdpTransportMapping(); //new UdpAddress(address, getPort())); snmp = new Snmp(peer); } catch (Exception e) { throw new RuntimeException(e); } } @Test public void test() throws Exception { log.info("sending snmp trap..."); sendTrap("hello, world"); log.info("listening..."); boolean success = false; for (int i = 0; i < 16; i++) { Thread.sleep(250); EventSenderRunner esr = new EventSenderRunner(eventManager); EventReport eventReport = esr.call(); Map<EventSource, Set<Event>> events = eventReport.getEvents(); log.info("events " + events); if (events.size() > 0) { success = true; break; } } assertTrue("Did not get event (in time)", success); } @Override protected void setConfiguration() { configuration.getSimple("pollInterval").setIntegerValue(1); } enum Severity { high, medium, info; } protected void sendTrap(String message) { PDU pdu = new PDU(); pdu.setType(PDU.TRAP); add(pdu, alertName, message); add(pdu, alertSeverity, Severity.medium); CommunityTarget target = new CommunityTarget(); target.setCommunity(community); target.setVersion(SnmpConstants.version2c); target.setAddress(new UdpAddress(address, port)); target.setTimeout(1000); target.setRetries(2); try { snmp.send(pdu, target); } catch (IOException e) { log.error(e.getMessage(), e); } } private void add(PDU pdu, OID oid, Object message) { String s = String.valueOf(message); pdu.add(new VariableBinding(oid, new OctetString(s))); } }