From 76c17f5c3a06f1e1493a123ce918ff6d72493ec6 Mon Sep 17 00:00:00 2001
From: Seth Leger
Date: Thu, 10 Mar 2016 00:43:07 -0500
Subject: [PATCH 01/79] Copied several classes from the refactored Syslogd into
Trapd so that we can use them as a model for refactoring the Trapd code in a
similar manner.
---
.../snmp/snmp4j/Snmp4jTrapReceiverIT.java | 2 +-
.../netmgt/syslogd/SyslogHandlerMBean.java | 89 ------
features/events/traps/pom.xml | 9 +
.../trapd/BroadcastEventProcessorSyslog.java | 122 ++++++++
.../netmgt/trapd/HibernateTrapdIpMgr.java | 5 +
.../trapd/MessageDiscardedException.java | 52 ++++
.../netmgt/trapd/SyslogConfigBean.java | 132 +++++++++
.../netmgt/trapd/SyslogConnection.java | 218 ++++++++++++++
.../opennms/netmgt/trapd/SyslogProcessor.java | 128 +++++++++
.../org/opennms/netmgt/trapd/Syslogd.java | 146 ++++++++++
.../netmgt/trapd/SyslogdConfigProcessor.java | 52 ++++
.../netmgt/trapd/TrapNotificationHandler.java | 35 +++
.../TrapNotificationHandlerCamelImpl.java | 58 ++++
.../TrapNotificationHandlerDefaultImpl.java | 71 +++++
.../netmgt/trapd/TrapQueueProcessor.java | 4 +-
.../opennms/netmgt/trapd/TrapReceiver.java | 43 +++
.../netmgt/trapd/TrapReceiverSnmp4jImpl.java | 269 ++++++++++++++++++
.../java/org/opennms/netmgt/trapd/Trapd.java | 2 +-
.../netmgt/trapd/TrapdIpManagerDaoImpl.java | 136 +++++++++
.../netmgt/trapd/TrapdIpManagerJDBCImpl.java | 158 ++++++++++
.../org/opennms/netmgt/trapd/TrapdIpMgr.java | 2 +
.../org/opennms/netmgt/trapd/jmx/Trapd.java | 4 +-
22 files changed, 1642 insertions(+), 95 deletions(-)
delete mode 100644 features/events/syslog/src/main/java/org/opennms/netmgt/syslogd/SyslogHandlerMBean.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessorSyslog.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/MessageDiscardedException.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConfigBean.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConnection.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogProcessor.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/Syslogd.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogdConfigProcessor.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandler.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerCamelImpl.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerDefaultImpl.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiver.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerDaoImpl.java
create mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerJDBCImpl.java
diff --git a/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/snmp4j/Snmp4jTrapReceiverIT.java b/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/snmp4j/Snmp4jTrapReceiverIT.java
index fd0e36ffcb53..bde0f5044739 100644
--- a/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/snmp4j/Snmp4jTrapReceiverIT.java
+++ b/core/snmp/integration-tests/src/test/java/org/opennms/netmgt/snmp/snmp4j/Snmp4jTrapReceiverIT.java
@@ -269,7 +269,7 @@ public int getReceivedTrapCount() {
}
}
- private final class TestTrapProcessor implements TrapProcessor {
+ private static final class TestTrapProcessor implements TrapProcessor {
@Override
public void setCommunity(String community) {}
@Override
diff --git a/features/events/syslog/src/main/java/org/opennms/netmgt/syslogd/SyslogHandlerMBean.java b/features/events/syslog/src/main/java/org/opennms/netmgt/syslogd/SyslogHandlerMBean.java
deleted file mode 100644
index a64b722590df..000000000000
--- a/features/events/syslog/src/main/java/org/opennms/netmgt/syslogd/SyslogHandlerMBean.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * This file is part of OpenNMS(R).
- *
- * Copyright (C) 2002-2014 The OpenNMS Group, Inc.
- * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License,
- * or (at your option) any later version.
- *
- * OpenNMS(R) is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with OpenNMS(R). If not, see:
- * http://www.gnu.org/licenses/
- *
- * For more information contact:
- * OpenNMS(R) Licensing
- * http://www.opennms.org/
- * http://www.opennms.com/
- *******************************************************************************/
-
-package org.opennms.netmgt.syslogd;
-
-import javax.management.InstanceNotFoundException;
-import javax.management.MalformedObjectNameException;
-
-import org.opennms.netmgt.daemon.BaseOnmsMBean;
-
-/**
- *
- *
- * @param name a {@link java.lang.String} object.
- * @throws javax.management.MalformedObjectNameException if any.
- * @throws javax.management.InstanceNotFoundException if any.
- */
- void addEventHandler(String name)
- throws MalformedObjectNameException, InstanceNotFoundException;
-
- /**
- *
removeEventHandler
- *
- * @param name a {@link java.lang.String} object.
- * @throws javax.management.MalformedObjectNameException if any.
- * @throws javax.management.InstanceNotFoundException if any.
- */
- void removeEventHandler(String name)
- throws MalformedObjectNameException, InstanceNotFoundException;
-
- /**
- *
setLogPrefix
- *
- * @param prefix a {@link java.lang.String} object.
- */
- void setLogPrefix(String prefix);
-}
diff --git a/features/events/traps/pom.xml b/features/events/traps/pom.xml
index b201fe4561a3..d346006fa361 100644
--- a/features/events/traps/pom.xml
+++ b/features/events/traps/pom.xml
@@ -50,6 +50,15 @@
+
+ org.opennms.dependencies
+ camel-dependencies
+ pom
+
+
+ org.opennms.core
+ org.opennms.core.camel
+ org.opennms.coreorg.opennms.core.daemon
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessorSyslog.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessorSyslog.java
new file mode 100644
index 000000000000..819bd42942a3
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessorSyslog.java
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2002-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.opennms.netmgt.events.api.EventConstants;
+import org.opennms.netmgt.events.api.EventIpcManagerFactory;
+import org.opennms.netmgt.events.api.EventListener;
+import org.opennms.netmgt.xml.event.Event;
+
+/**
+ * @author Johan Edstrom
+ * @author Tarus Balog
+ * @author OpenNMS
+ */
+final class BroadcastEventProcessorSyslog implements EventListener {
+ private static final Logger LOG = LoggerFactory.getLogger(BroadcastEventProcessor.class);
+ /**
+ * Create message selector to set to the subscription
+ */
+ BroadcastEventProcessorSyslog() {
+ // Create the selector for the ueis this service is interested in
+ //
+ List ueiList = new ArrayList();
+
+ // nodeGainedInterface
+ ueiList.add(EventConstants.NODE_GAINED_INTERFACE_EVENT_UEI);
+
+ // interfaceDeleted
+ ueiList.add(EventConstants.INTERFACE_DELETED_EVENT_UEI);
+
+ EventIpcManagerFactory.init();
+ EventIpcManagerFactory.getIpcManager().addEventListener(this, ueiList);
+ }
+
+
+
+ /**
+ * Unsubscribe from eventd
+ */
+ public void close() {
+ EventIpcManagerFactory.getIpcManager().removeEventListener(this);
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * This method is invoked by the EventIpcManager when a new event is
+ * available for processing. Each message is examined for its Universal
+ * Event Identifier and the appropriate action is taking based on each UEI.
+ */
+ @Override
+ public void onEvent(Event event) {
+
+ String eventUei = event.getUei();
+ if (eventUei == null)
+ return;
+
+
+ LOG.debug("Received event: {}", eventUei);
+
+ if (eventUei.equals(EventConstants.NODE_GAINED_INTERFACE_EVENT_UEI)) {
+ // add to known nodes
+ if (Long.toString(event.getNodeid()) != null && event.getInterface() != null) {
+ TrapdIpManagerDaoImpl.getInstance().setNodeId(event.getInterface(), event.getNodeid());
+ }
+ LOG.debug("Added {} to known node list", event.getInterface());
+ } else if (eventUei.equals(EventConstants.INTERFACE_DELETED_EVENT_UEI)) {
+ // remove from known nodes
+ if (event.getInterface() != null) {
+ TrapdIpManagerDaoImpl.getInstance().removeNodeId(event.getInterface());
+ }
+ LOG.debug("Removed {} from known node list", event.getInterface());
+ } else if (eventUei.equals(EventConstants.INTERFACE_REPARENTED_EVENT_UEI)) {
+ // add to known nodes
+ if (Long.toString(event.getNodeid()) != null && event.getInterface() != null) {
+ TrapdIpManagerDaoImpl.getInstance().setNodeId(event.getInterface(), event.getNodeid());
+ }
+ LOG.debug("Reparented {} to known node list", event.getInterface());
+ }
+ }
+
+ /**
+ * Return an id for this event listener
+ *
+ * @return a {@link java.lang.String} object.
+ */
+ @Override
+ public String getName() {
+ return "Syslogd:BroadcastEventProcessor";
+ }
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/HibernateTrapdIpMgr.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/HibernateTrapdIpMgr.java
index 04dd7f0be5d8..dbf9b1b97a81 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/HibernateTrapdIpMgr.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/HibernateTrapdIpMgr.java
@@ -146,4 +146,9 @@ public IpInterfaceDao getIpInterfaceDao() {
return m_ipInterfaceDao;
}
+ @Override
+ public long longValue(final Long result) {
+ return (result == null ? -1 : result);
+ }
+
}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/MessageDiscardedException.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/MessageDiscardedException.java
new file mode 100644
index 000000000000..d6cf58c76d70
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/MessageDiscardedException.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2002-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+/**
+ *
MessageDiscardedException class.
+ *
+ * @author ranger
+ * @version $Id: $
+ */
+public class MessageDiscardedException extends Exception {
+ static final long serialVersionUID = 2L;
+
+ public MessageDiscardedException() {
+ super();
+ }
+
+ public MessageDiscardedException(final Throwable t) {
+ super(t);
+ }
+
+ public MessageDiscardedException(final String string) {
+ super(string);
+ }
+
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConfigBean.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConfigBean.java
new file mode 100644
index 000000000000..8e5db4a4733a
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConfigBean.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2002-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import org.opennms.netmgt.config.SyslogdConfig;
+import org.opennms.netmgt.config.syslogd.HideMessage;
+import org.opennms.netmgt.config.syslogd.UeiList;
+
+/**
+ * This is a bean container that can be used as a {@link SyslogConfig}
+ * service.
+ */
+public final class SyslogConfigBean implements SyslogdConfig {
+
+ private int m_syslogPort;
+ private String m_listenAddress;
+ private String m_forwardingRegexp;
+ private int m_matchingGroupHost;
+ private int m_matchingGroupMessage;
+ private String m_parser;
+ private String m_discardUei;
+ private boolean m_newSuspectOnMessage;
+
+ @Override
+ public int getSyslogPort() {
+ return m_syslogPort;
+ }
+
+ public void setSyslogPort(int syslogPort) {
+ m_syslogPort = syslogPort;
+ }
+
+ @Override
+ public String getListenAddress() {
+ return m_listenAddress;
+ }
+
+ public void setListenAddress(String listenAddress) {
+ m_listenAddress = listenAddress;
+ }
+
+ @Override
+ public boolean getNewSuspectOnMessage() {
+ return m_newSuspectOnMessage;
+ }
+
+ public void setNewSuspectOnMessage(boolean newSuspectOnMessage) {
+ m_newSuspectOnMessage = newSuspectOnMessage;
+ }
+
+ @Override
+ public String getForwardingRegexp() {
+ return m_forwardingRegexp;
+ }
+
+ public void setForwardingRegexp(String forwardingRegexp) {
+ m_forwardingRegexp = forwardingRegexp;
+ }
+
+ @Override
+ public int getMatchingGroupHost() {
+ return m_matchingGroupHost;
+ }
+
+ public void setMatchingGroupHost(int matchingGroupHost) {
+ m_matchingGroupHost = matchingGroupHost;
+ }
+
+ @Override
+ public int getMatchingGroupMessage() {
+ return m_matchingGroupMessage;
+ }
+
+ public void setMatchingGroupMessage(int matchingGroupMessage) {
+ m_matchingGroupMessage = matchingGroupMessage;
+ }
+
+ @Override
+ public String getParser() {
+ return m_parser;
+ }
+
+ public void setParser(String parser) {
+ m_parser = parser;
+ }
+
+ @Override
+ public UeiList getUeiList() {
+ return null;
+ }
+
+ @Override
+ public HideMessage getHideMessages() {
+ return null;
+ }
+
+ @Override
+ public String getDiscardUei() {
+ return m_discardUei;
+ }
+
+ public void setDiscardUei(String discardUei) {
+ m_discardUei = discardUei;
+ }
+
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConnection.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConnection.java
new file mode 100644
index 000000000000..f3e214c87dc2
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConnection.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2006-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import java.io.UnsupportedEncodingException;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.concurrent.Callable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+
+import org.opennms.core.network.InetAddressXmlAdapter;
+import org.opennms.netmgt.config.SyslogdConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
This class is a {@link Callable} task that is responsible for converting
+ * the syslog payload into an OpenNMS event by using the {@link ConvertToEvent}
+ * class.
+ *
+ * @author Mathew Brozowski
+ * @author Johan Edstrom
+ * @author Mike Huot
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
+public class SyslogConnection implements Callable> {
+
+ private static final Logger LOG = LoggerFactory.getLogger(SyslogConnection.class);
+
+ public static final int MAX_PACKET_SIZE = 4096;
+
+ private InetAddress m_sourceAddress;
+ private int m_port;
+ private ByteBuffer m_bytes;
+ private SyslogdConfig m_config;
+
+ /**
+ * No-arg constructor so that we can preallocate this object for use with
+ * an LMAX Disruptor or use it with JAXB.
+ */
+ public SyslogConnection() {
+ }
+
+ public SyslogConnection(final DatagramPacket packet, final SyslogdConfig config) {
+ this(packet.getAddress(), packet.getPort(), ByteBuffer.wrap(packet.getData(), 0, packet.getLength()), config);
+ }
+
+ public SyslogConnection(final InetAddress sourceAddress, final int port, final ByteBuffer bytes, final SyslogdConfig config) {
+ if (sourceAddress == null) {
+ throw new IllegalArgumentException("Source address cannot be null");
+ } else if (bytes == null) {
+ throw new IllegalArgumentException("Bytes cannot be null");
+ } else if (config == null) {
+ throw new IllegalArgumentException("Config cannot be null");
+ }
+
+ m_sourceAddress = sourceAddress;
+ m_port = port;
+ m_bytes = bytes;
+ m_config = config;
+ }
+
+ @XmlAttribute
+ @XmlJavaTypeAdapter(InetAddressXmlAdapter.class)
+ public InetAddress getSourceAddress() {
+ return m_sourceAddress;
+ }
+
+ public void setSourceAddress(InetAddress sourceAddress) {
+ m_sourceAddress = sourceAddress;
+ }
+
+ @XmlAttribute
+ public int getPort() {
+ return m_port;
+ }
+
+ public void setPort(int port) {
+ m_port = port;
+ }
+
+ public ByteBuffer getByteBuffer() {
+ return m_bytes;
+ }
+
+ public void setByteBuffer(ByteBuffer bytes) {
+ m_bytes = bytes;
+ }
+
+ @XmlAttribute
+ public byte[] getBytes() {
+ byte[] retval = new byte[m_bytes.remaining()];
+ m_bytes.get(retval);
+ m_bytes.rewind();
+ return retval;
+ }
+
+ public void setBytes(byte[] bytes) {
+ m_bytes = ByteBuffer.wrap(bytes);
+ }
+
+ public SyslogdConfig getConfig() {
+ return m_config;
+ }
+
+ public void setConfig(SyslogdConfig config) {
+ m_config = config;
+ }
+
+ @Override
+ public SyslogProcessor call() {
+
+ try {
+ LOG.debug("Converting syslog message into event ({} bytes)", m_bytes.remaining());
+
+ /***
+
+ THIS CALL NO LONGER FUNCTIONS AFTER BEING COPIED INTO TRAPD
+
+ // TODO: Change to a static call?
+ ConvertToEvent re = new ConvertToEvent(
+ m_sourceAddress,
+ m_port,
+ // Decode the packet content as ASCII
+ // TODO: Support more character encodings?
+ StandardCharsets.US_ASCII.decode(m_bytes).toString(),
+ m_config
+ );
+
+ LOG.debug("Sending syslog event to the SyslogProcessor queue");
+
+ return new SyslogProcessor(re.getEvent(), m_config.getNewSuspectOnMessage());
+ ***/
+
+ return null;
+
+ } catch (final Throwable e) {
+ LOG.debug("Message discarded, returning without enqueueing event.", e);
+ }
+ return null;
+ }
+
+ private static DatagramPacket copyPacket(final DatagramPacket packet) {
+ byte[] message = new byte[packet.getLength()];
+ System.arraycopy(packet.getData(), 0, message, 0, packet.getLength());
+ InetAddress addr = null;
+ try {
+ addr = InetAddress.getByAddress(packet.getAddress().getHostName(), packet.getAddress().getAddress());
+ DatagramPacket retPacket = new DatagramPacket(
+ message,
+ packet.getOffset(),
+ packet.getLength(),
+ addr,
+ packet.getPort()
+ );
+ return retPacket;
+ } catch (UnknownHostException e) {
+ LOG.warn("unable to clone InetAddress object for {}", packet.getAddress());
+ }
+ return null;
+ }
+
+ public static DatagramPacket copyPacket(final InetAddress sourceAddress, final int sourcePort, final ByteBuffer buffer) {
+ byte[] message = new byte[MAX_PACKET_SIZE];
+ int i = 0;
+ // Copy the buffer into the byte array
+ while (buffer.hasRemaining()) {
+ message[i++] = buffer.get();
+ }
+ return copyPacket(sourceAddress, sourcePort, message, i);
+ }
+
+ private static DatagramPacket copyPacket(final InetAddress sourceAddress, final int sourcePort, final byte[] buffer, final int length) {
+ DatagramPacket retPacket = new DatagramPacket(
+ buffer,
+ 0,
+ length,
+ sourceAddress,
+ sourcePort
+ );
+ return retPacket;
+ }
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogProcessor.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogProcessor.java
new file mode 100644
index 000000000000..8bb459fb511f
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogProcessor.java
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2002-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import static org.opennms.core.utils.InetAddressUtils.addr;
+
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import org.opennms.core.utils.InetAddressUtils;
+import org.opennms.netmgt.events.api.EventConstants;
+import org.opennms.netmgt.events.api.EventIpcManagerFactory;
+import org.opennms.netmgt.model.events.EventBuilder;
+import org.opennms.netmgt.xml.event.Event;
+import org.opennms.netmgt.xml.event.Parm;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
This class is a {@link Callable} task that is responsible for broadcasting
+ * an OpenNMS syslog event on the event bus. It also broadcasts newSuspect events
+ * if a syslog message has been received that is not associated with a node.
+ *
+ *
This task is separated out to allow the event receiver to do minimum work
+ * to avoid dropping packets from the syslog agents.
+ *
+ * @author Brian Weaver
+ * @author Oculan Corporation
+ */
+public final class SyslogProcessor implements Callable {
+ private static final Logger LOG = LoggerFactory.getLogger(SyslogProcessor.class);
+
+ private final boolean m_NewSuspectOnMessage;
+
+ private final String m_localAddr;
+
+ private final Event m_event;
+
+ public SyslogProcessor(Event event, boolean newSuspectOnMessage) {
+ m_event = event;
+ m_NewSuspectOnMessage = newSuspectOnMessage;
+ m_localAddr = InetAddressUtils.getLocalHostName();
+ }
+
+ public Event getEvent() {
+ return m_event;
+ }
+
+ /**
+ * The event processing execution context.
+ */
+ @Override
+ public Void call() {
+ // get a logger
+ try {
+ if (LOG.isTraceEnabled()) {
+ LOG.trace("Processing a syslog to event dispatch", m_event.toString());
+ String uuid = m_event.getUuid();
+ LOG.trace("Event {");
+ LOG.trace(" uuid = {}", (uuid != null && uuid.length() > 0 ? uuid : ""));
+ LOG.trace(" uei = {}", m_event.getUei());
+ LOG.trace(" src = {}", m_event.getSource());
+ LOG.trace(" iface = {}", m_event.getInterface());
+ LOG.trace(" time = {}", m_event.getTime());
+ LOG.trace(" Msg = {}", m_event.getLogmsg().getContent());
+ LOG.trace(" Dst = {}", m_event.getLogmsg().getDest());
+ List parms = (m_event.getParmCollection() == null ? null : m_event.getParmCollection());
+ if (parms != null) {
+ LOG.trace(" parms {");
+ for (Parm parm : parms) {
+ if ((parm.getParmName() != null)
+ && (parm.getValue().getContent() != null)) {
+ LOG.trace(" ({}, {})", parm.getParmName().trim(), parm.getValue().getContent().trim());
+ }
+ }
+ LOG.trace(" }");
+ }
+ LOG.trace("}");
+ }
+
+ EventIpcManagerFactory.getIpcManager().sendNow(m_event);
+
+ if (m_NewSuspectOnMessage && !m_event.hasNodeid()) {
+ LOG.trace("Syslogd: Found a new suspect {}", m_event.getInterface());
+ sendNewSuspectEvent(m_localAddr, m_event.getInterface());
+ }
+
+ } catch (Throwable t) {
+ LOG.error("Unexpected error processing SyslogMessage - Could not send", t);
+ }
+
+ // This task is the terminal task of syslogd so it doesn't return a Callable
+ return null;
+ }
+
+ private static void sendNewSuspectEvent(String localAddr, String trapInterface) {
+ EventBuilder bldr = new EventBuilder(EventConstants.NEW_SUSPECT_INTERFACE_EVENT_UEI, "syslogd");
+ bldr.setInterface(addr(trapInterface));
+ bldr.setHost(localAddr);
+ EventIpcManagerFactory.getIpcManager().sendNow(bldr.getEvent());
+ }
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Syslogd.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Syslogd.java
new file mode 100644
index 000000000000..5bc410a3e106
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Syslogd.java
@@ -0,0 +1,146 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2006-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import java.lang.reflect.UndeclaredThrowableException;
+import java.sql.SQLException;
+
+import org.opennms.netmgt.daemon.AbstractServiceDaemon;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ *
+ * The received messages are converted into XML and sent to eventd.
+ *
+ *
+ * Note: Syslogd is a PausableFiber so as to receive control
+ * events. However, a 'pause' on Syslogd has no impact on the receiving and
+ * processing of syslog messages.
+ *
+ * @author Mathew Brozowski
+ * @author David Hustace
+ * @author DJ Gregor
+ * @author Johan Edstrom
+ * @author Mike Huot
+ */
+public class Syslogd extends AbstractServiceDaemon {
+
+ private static final Logger LOG = LoggerFactory.getLogger(Syslogd.class);
+
+ /**
+ * The name of the logging category for Syslogd.
+ */
+ public static final String LOG4J_CATEGORY = "syslogd";
+
+ @Autowired
+ private TrapReceiver m_udpEventReceiver;
+
+ private BroadcastEventProcessorSyslog m_broadcastEventProcessor;
+
+ /**
+ *
+ */
+ @Override
+ protected void onStop() {
+ if (m_broadcastEventProcessor != null) {
+ LOG.debug("stop: Stopping the Syslogd event receiver");
+ m_broadcastEventProcessor.close();
+ LOG.debug("stop: Stopped the Syslogd event receiver");
+ }
+
+ if (m_udpEventReceiver != null) {
+ LOG.debug("stop: Stopping the Syslogd UDP receiver");
+ try {
+ m_udpEventReceiver.stop();
+ } catch (InterruptedException e) {
+ LOG.info("stop: Exception when stopping the Syslog UDP receiver: " + e.getMessage());
+ } catch (Throwable e) {
+ LOG.error("stop: Failed to stop the Syslog UDP receiver", e);
+ throw new UndeclaredThrowableException(e);
+ }
+ LOG.debug("stop: Stopped the Syslogd UDP receiver");
+ }
+ }
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogdConfigProcessor.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogdConfigProcessor.java
new file mode 100644
index 000000000000..7b641d5b43cd
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogdConfigProcessor.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2015-2016 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2016 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import org.opennms.netmgt.config.SyslogdConfig;
+
+/**
+ * This processor will update the {@link SyslogdConfig} on a
+ * {@link SyslogConnection} so that it can be processed according
+ * to the new configuration.
+ *
+ * @author Seth
+ */
+public class SyslogdConfigProcessor {
+
+ private final SyslogdConfig m_config;
+
+ public SyslogdConfigProcessor(SyslogdConfig config) {
+ m_config = config;
+ }
+
+ public SyslogConnection process(SyslogConnection connection) {
+ connection.setConfig(m_config);
+ return connection;
+ }
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandler.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandler.java
new file mode 100644
index 000000000000..d1a2d2fce45d
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandler.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2006-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import org.opennms.netmgt.snmp.TrapNotification;
+
+public interface TrapNotificationHandler {
+ void handleTrapNotification(TrapNotification message);
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerCamelImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerCamelImpl.java
new file mode 100644
index 000000000000..7b399cb873b0
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerCamelImpl.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2006-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import org.apache.camel.InOnly;
+import org.apache.camel.Produce;
+import org.opennms.core.camel.DefaultDispatcher;
+import org.opennms.netmgt.snmp.TrapNotification;
+
+/**
+ * This class is an {@link InOnly} endpoint that will send messages to the
+ * Camel endpoint specified by the endpointUri constructor argument.
+ */
+@InOnly
+public class TrapNotificationHandlerCamelImpl extends DefaultDispatcher implements TrapNotificationHandler {
+
+ @Produce(property="endpointUri")
+ TrapNotificationHandler m_proxy;
+
+ public TrapNotificationHandlerCamelImpl(final String endpointUri) {
+ super(endpointUri);
+ }
+
+ /**
+ * Send the incoming {@link SyslogConnection} message into the Camel route
+ * specified by the {@link #m_endpointUri} property.
+ */
+ @Override
+ public void handleTrapNotification(final TrapNotification message) {
+ m_proxy.handleTrapNotification(message);
+ }
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerDefaultImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerDefaultImpl.java
new file mode 100644
index 000000000000..cb3791c61cc4
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerDefaultImpl.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2015-2015 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2015 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+
+import org.opennms.core.concurrent.ExecutorFactory;
+import org.opennms.core.concurrent.ExecutorFactoryJavaImpl;
+import org.opennms.netmgt.snmp.TrapNotification;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TrapNotificationHandlerDefaultImpl implements TrapNotificationHandler {
+ private static final Logger LOG = LoggerFactory.getLogger(TrapNotificationHandlerDefaultImpl.class);
+
+ /**
+ * This is the number of threads that are used to parse syslog messages into
+ * OpenNMS events.
+ *
+ * TODO: Make this configurable
+ */
+ public static final int EVENT_PARSER_THREADS = Runtime.getRuntime().availableProcessors();
+
+ /**
+ * This is the number of threads that are used to broadcast the OpenNMS events.
+ *
+ * TODO: Make this configurable
+ */
+ public static final int EVENT_SENDER_THREADS = Runtime.getRuntime().availableProcessors();
+
+ private final ExecutorFactory m_executorFactory = new ExecutorFactoryJavaImpl();
+ private final ExecutorService m_syslogConnectionExecutor = m_executorFactory.newExecutor(EVENT_PARSER_THREADS, Integer.MAX_VALUE, "OpenNMS.Syslogd", "syslogConnections");
+ private final ExecutorService m_syslogProcessorExecutor = m_executorFactory.newExecutor(EVENT_SENDER_THREADS, Integer.MAX_VALUE, "OpenNMS.Syslogd", "syslogProcessors");
+
+ @Override
+ public void handleTrapNotification(final TrapNotification message) {
+ try {
+ CompletableFuture.supplyAsync(message::call, m_syslogConnectionExecutor)
+ .thenAcceptAsync(proc -> proc.call(), m_syslogProcessorExecutor);
+ } catch (Throwable e) {
+ LOG.error("Task execution failed in {}", this.getClass().getSimpleName(), e);
+ }
+ }
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapQueueProcessor.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapQueueProcessor.java
index 40847d2422ee..74f43cbc721f 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapQueueProcessor.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapQueueProcessor.java
@@ -58,7 +58,7 @@
* @author OpenNMS.org
*
*/
-class TrapQueueProcessor implements Callable>, InitializingBean {
+class TrapQueueProcessor implements Callable, InitializingBean {
private static final Logger LOG = LoggerFactory.getLogger(TrapQueueProcessor.class);
@@ -163,7 +163,7 @@ class TrapQueueProcessor implements Callable>, InitializingBean {
*
*/
@Override
- public Callable call() {
+ public Void call() {
try {
processTrapEvent(((EventCreator)m_trapNotification.getTrapProcessor()).getEvent());
} catch (IllegalArgumentException e) {
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiver.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiver.java
new file mode 100644
index 000000000000..da9bf4ea7573
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiver.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2002-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+
+/**
+ * @author Seth
+ */
+public interface TrapReceiver extends Runnable {
+
+ @Override
+ void run();
+
+ String getName();
+
+ void stop() throws InterruptedException;
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java
new file mode 100644
index 000000000000..1179bde8eff7
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java
@@ -0,0 +1,269 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2002-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.DatagramPacket;
+import java.net.DatagramSocket;
+import java.net.InetSocketAddress;
+import java.net.SocketException;
+import java.net.SocketTimeoutException;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.opennms.core.concurrent.LogPreservingThreadFactory;
+import org.opennms.core.logging.Logging;
+import org.opennms.core.utils.InetAddressUtils;
+import org.opennms.netmgt.config.SyslogdConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * @author Brian Weaver
+ * @author Oculan Corporation
+ * @fiddler joed
+ */
+public class TrapReceiverSnmp4jImpl implements TrapReceiver {
+ private static final Logger LOG = LoggerFactory.getLogger(TrapReceiverSnmp4jImpl.class);
+
+ private static final int SOCKET_TIMEOUT = 500;
+
+ /**
+ * The Fiber's status.
+ */
+ private volatile boolean m_stop;
+
+ /**
+ * The UDP socket for receipt and transmission of packets from agents.
+ */
+ private DatagramSocket m_dgSock;
+
+ /**
+ * The context thread
+ */
+ private Thread m_context;
+
+ private final SyslogdConfig m_config;
+
+ private List m_trapNotificationHandlers = Collections.emptyList();
+
+ private final ExecutorService m_executor;
+
+ /**
+ * construct a new receiver
+ *
+ * @param sock
+ * @param matchPattern
+ * @param hostGroup
+ * @param messageGroup
+ */
+ public TrapReceiverSnmp4jImpl(final SyslogdConfig config) throws SocketException {
+ if (config == null) {
+ throw new IllegalArgumentException("Config cannot be null");
+ }
+
+ m_stop = false;
+ m_dgSock = null;
+ m_config = config;
+
+ m_executor = new ThreadPoolExecutor(
+ Runtime.getRuntime().availableProcessors() * 2,
+ Runtime.getRuntime().availableProcessors() * 2,
+ 1000L,
+ TimeUnit.MILLISECONDS,
+ new LinkedBlockingQueue(),
+ new LogPreservingThreadFactory(getClass().getSimpleName(), Integer.MAX_VALUE)
+ );
+ }
+
+ public TrapNotificationHandler getSyslogConnectionHandlers() {
+ return m_trapNotificationHandlers.get(0);
+ }
+
+ public void setSyslogConnectionHandlers(TrapNotificationHandler handler) {
+ m_trapNotificationHandlers = Collections.singletonList(handler);
+ }
+
+ @Override
+ public String getName() {
+ String listenAddress = (m_config.getListenAddress() != null && m_config.getListenAddress().length() > 0) ? m_config.getListenAddress() : "0.0.0.0";
+ return getClass().getSimpleName() + " [" + listenAddress + ":" + m_config.getSyslogPort() + "]";
+ }
+
+ /*
+ * stop the current receiver
+ * @throws InterruptedException
+ *
+ */
+ @Override
+ public void stop() throws InterruptedException {
+ m_stop = true;
+
+ // Close the datagram socket
+ if (m_dgSock != null) {
+ m_dgSock.close();
+ }
+
+ // Shut down the thread pools that are executing SyslogConnection and SyslogProcessor tasks
+ m_executor.shutdown();
+
+ if (m_context != null) {
+ LOG.debug("Stopping and joining thread context {}", m_context.getName());
+ m_context.interrupt();
+ m_context.join();
+ LOG.debug("Thread context stopped and joined");
+ }
+ }
+
+ /**
+ * The execution context.
+ */
+ @Override
+ public void run() {
+ // get the context
+ m_context = Thread.currentThread();
+
+ // Get a log instance
+ Logging.putPrefix(Syslogd.LOG4J_CATEGORY);
+
+ if (m_stop) {
+ LOG.debug("Stop flag set before thread started, exiting");
+ return;
+ } else
+ LOG.debug("Thread context started");
+
+ // allocate a buffer
+ final int length = 0xffff;
+ final byte[] buffer = new byte[length];
+
+ try {
+ LOG.debug("Creating syslog socket");
+ m_dgSock = new DatagramSocket(null);
+ } catch (SocketException e) {
+ LOG.warn("Could not create syslog socket: " + e.getMessage(), e);
+ return;
+ }
+
+ // set an SO timeout to make sure we don't block forever
+ // if a socket is closed.
+ try {
+ LOG.debug("Setting socket timeout to {}ms", SOCKET_TIMEOUT);
+ m_dgSock.setSoTimeout(SOCKET_TIMEOUT);
+ } catch (SocketException e) {
+ LOG.warn("An I/O error occured while trying to set the socket timeout", e);
+ }
+
+ // Set SO_REUSEADDR so that we don't run into problems in
+ // unit tests trying to rebind to an address where other tests
+ // also bound. This shouldn't have any effect at runtime.
+ try {
+ LOG.debug("Setting socket SO_REUSEADDR to true");
+ m_dgSock.setReuseAddress(true);
+ } catch (SocketException e) {
+ LOG.warn("An I/O error occured while trying to set SO_REUSEADDR", e);
+ }
+
+ // Increase the receive buffer for the socket
+ try {
+ LOG.debug("Attempting to set receive buffer size to {}", Integer.MAX_VALUE);
+ m_dgSock.setReceiveBufferSize(Integer.MAX_VALUE);
+ LOG.debug("Actual receive buffer size is {}", m_dgSock.getReceiveBufferSize());
+ } catch (SocketException e) {
+ LOG.info("Failed to set the receive buffer to {}", Integer.MAX_VALUE, e);
+ }
+
+ try {
+ LOG.debug("Opening datagram socket");
+ if (m_config.getListenAddress() != null && m_config.getListenAddress().length() != 0) {
+ m_dgSock.bind(new InetSocketAddress(InetAddressUtils.addr(m_config.getListenAddress()), m_config.getSyslogPort()));
+ } else {
+ m_dgSock.bind(new InetSocketAddress(m_config.getSyslogPort()));
+ }
+ } catch (SocketException e) {
+ LOG.info("Failed to open datagram socket", e);
+ }
+
+ // set to avoid numerous tracing message
+ boolean ioInterrupted = false;
+
+ // Construct one mutable {@link DatagramPacket} that will be used for receiving syslog messages
+ DatagramPacket pkt = new DatagramPacket(buffer, length);
+
+ // now start processing incoming requests
+ while (!m_stop) {
+ if (m_context.isInterrupted()) {
+ LOG.debug("Thread context interrupted");
+ break;
+ }
+
+ try {
+ if (!ioInterrupted) {
+ LOG.debug("Waiting on a datagram to arrive");
+ }
+
+ m_dgSock.receive(pkt);
+
+ SyslogConnection connection = new SyslogConnection(pkt, m_config);
+
+ try {
+ for (TrapNotificationHandler handler : m_trapNotificationHandlers) {
+ handler.handleTrapNotification(connection);
+ }
+ } catch (Throwable e) {
+ LOG.error("Handler execution failed in {}", this.getClass().getSimpleName(), e);
+ }
+
+ ioInterrupted = false; // reset the flag
+ } catch (SocketTimeoutException e) {
+ ioInterrupted = true;
+ continue;
+ } catch (InterruptedIOException e) {
+ ioInterrupted = true;
+ continue;
+ } catch (IOException e) {
+ if (m_stop) {
+ // A SocketException can be thrown during normal shutdown so log as debug
+ LOG.debug("Shutting down the datagram receipt port: " + e.getMessage());
+ } else {
+ LOG.error("An I/O exception occured on the datagram receipt port, exiting", e);
+ }
+ break;
+ }
+
+ } // end while status OK
+
+ LOG.debug("Thread context exiting");
+
+ }
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java
index c234eaa91559..30699921fdce 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java
@@ -80,7 +80,7 @@ public class Trapd extends AbstractServiceDaemon implements TrapProcessorFactory
private static final Logger LOG = LoggerFactory.getLogger(Trapd.class);
- private static final String LOG4J_CATEGORY = "trapd";
+ public static final String LOG4J_CATEGORY = "trapd";
/**
* The last status sent to the service control manager.
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerDaoImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerDaoImpl.java
new file mode 100644
index 000000000000..4fb6f41f70d9
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerDaoImpl.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2003-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import java.sql.SQLException;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.opennms.core.utils.InetAddressUtils;
+import org.opennms.netmgt.dao.api.IpInterfaceDao;
+import org.opennms.netmgt.model.OnmsIpInterface;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * This class represents a singular instance that is used to map trap IP
+ * addresses to known nodes.
+ *
+ * @author Johan Edstrom
+ * @author Brian Weaver
+ * @author Tarus Balog
+ * @author OpenNMS
+ */
+final class TrapdIpManagerDaoImpl implements TrapdIpMgr {
+
+ @Autowired
+ private IpInterfaceDao m_ipInterfaceDao;
+
+ /**
+ * A Map of IP addresses and node IDs
+ */
+ private static Map m_knownips = new ConcurrentHashMap();
+
+ public static TrapdIpMgr getInstance() {
+ return new TrapdIpManagerDaoImpl();
+ }
+
+ /**
+ * Clears and synchronizes the internal known IP address cache with the
+ * current information contained in the database. To synchronize the cache
+ * the method opens a new connection to the database, loads the address,
+ * and then closes it's connection.
+ *
+ * @throws java.sql.SQLException
+ * Thrown if the connection cannot be created or a database
+ * error occurs.
+ */
+ @Override
+ public synchronized void dataSourceSync() throws SQLException {
+
+ List list = m_ipInterfaceDao.findAll();
+
+ m_knownips.clear();
+ for (OnmsIpInterface one: list) {
+ if (one != null) {
+ m_knownips.put(InetAddressUtils.str(one.getIpAddress()), (long) one.getId());
+ }
+
+ }
+
+ }
+
+ /**
+ * Returns the nodeid for the IP Address
+ *
+ * @param addr The IP Address to query.
+ * @return The node ID of the IP Address if known.
+ */
+ @Override
+ public synchronized long getNodeId(final String addr) {
+ if (addr == null) {
+ return -1;
+ }
+ return longValue(m_knownips.get(addr));
+ }
+
+ /**
+ * Sets the IP Address and Node ID in the Map.
+ *
+ * @param addr The IP Address to add.
+ * @param nodeid The Node ID to add.
+ * @return The nodeid if it existed in the map.
+ */
+ @Override
+ public long setNodeId(final String addr, final long nodeid) {
+ if (addr == null || nodeid == -1)
+ return -1;
+
+ return longValue(m_knownips.put(addr, nodeid));
+ }
+
+ /**
+ * Removes an address from the node ID map.
+ *
+ * @param addr The address to remove from the node ID map.
+ * @return The nodeid that was in the map.
+ */
+ @Override
+ public long removeNodeId(final String addr) {
+ if (addr == null)
+ return -1;
+ return longValue(m_knownips.remove(addr));
+ }
+
+ @Override
+ public long longValue(final Long result) {
+ return (result == null ? -1 : result);
+ }
+
+} // end SyslodIPMgr
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerJDBCImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerJDBCImpl.java
new file mode 100644
index 000000000000..f87ed02fb93f
--- /dev/null
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerJDBCImpl.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2003-2014 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.opennms.core.db.DataSourceFactory;
+
+/**
+ * This class represents a singular instance that is used to map trap IP
+ * addresses to known nodes.
+ *
+ * @author Johan Edstrom
+ * @author Brian Weaver
+ * @author Tarus Balog
+ * @author OpenNMS
+ */
+final class TrapdIpManagerJDBCImpl implements TrapdIpMgr {
+ /**
+ * The SQL statement used to extract the list of currently known IP
+ * addresses and their node IDs from the IP Interface table.
+ */
+ private static final String IP_LOAD_SQL = "SELECT ipAddr, nodeid FROM ipInterface";
+
+ /**
+ * A Map of IP addresses and node IDs
+ */
+ private static Map m_knownips = new ConcurrentHashMap();
+
+ public static TrapdIpMgr getInstance() {
+ return new TrapdIpManagerJDBCImpl();
+ }
+
+ /**
+ * Clears and synchronizes the internal known IP address cache with the
+ * current information contained in the database. To synchronize the cache
+ * the method opens a new connection to the database, loads the address,
+ * and then closes it's connection.
+ *
+ * @throws java.sql.SQLException
+ * Thrown if the connection cannot be created or a database
+ * error occurs.
+ */
+ @Override
+ public synchronized void dataSourceSync() throws SQLException {
+ java.sql.Connection c = null;
+ Statement s = null;
+ try {
+ // Get database connection
+ c = DataSourceFactory.getInstance().getConnection();
+
+ // Run with it
+ c.setReadOnly(true);
+
+ s = c.createStatement();
+ final ResultSet rs = s.executeQuery(IP_LOAD_SQL);
+
+ if (rs != null) {
+ m_knownips.clear();
+ while (rs.next()) {
+ m_knownips.put(rs.getString(1), rs.getLong(2));
+ }
+ rs.close();
+ }
+ } finally {
+ if (s != null) {
+ try {
+ s.close();
+ } catch (final SQLException sqlE) {
+ }
+ }
+ if (c != null) {
+ try {
+ c.close();
+ } catch (final SQLException sqlE) {
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the nodeid for the IP Address
+ *
+ * @param addr The IP Address to query.
+ * @return The node ID of the IP Address if known.
+ */
+ @Override
+ public synchronized long getNodeId(final String addr) {
+ if (addr == null) {
+ return -1;
+ }
+ return TrapdIpManagerJDBCImpl.getInstance().longValue(m_knownips.get(addr));
+ }
+
+ /**
+ * Sets the IP Address and Node ID in the Map.
+ *
+ * @param addr The IP Address to add.
+ * @param nodeid The Node ID to add.
+ * @return The nodeid if it existed in the map.
+ */
+ @Override
+ public long setNodeId(final String addr, final long nodeid) {
+ if (addr == null || nodeid == -1)
+ return -1;
+
+ return TrapdIpManagerJDBCImpl.getInstance().longValue(m_knownips.put(addr, nodeid));
+ }
+
+ /**
+ * Removes an address from the node ID map.
+ *
+ * @param addr The address to remove from the node ID map.
+ * @return The nodeid that was in the map.
+ */
+ @Override
+ public long removeNodeId(final String addr) {
+ if (addr == null)
+ return -1;
+ return TrapdIpManagerJDBCImpl.getInstance().longValue(m_knownips.remove(addr));
+ }
+
+ @Override
+ public long longValue(final Long result) {
+ return (result == null ? -1 : result);
+ }
+
+} // end SyslodIPMgr
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpMgr.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpMgr.java
index de8cefb05829..f1eecf581b22 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpMgr.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpMgr.java
@@ -79,4 +79,6 @@ public interface TrapdIpMgr {
*/
long removeNodeId(String addr);
+ long longValue(Long result);
+
}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/jmx/Trapd.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/jmx/Trapd.java
index 48a267fecc70..a8fdf126e7f6 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/jmx/Trapd.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/jmx/Trapd.java
@@ -40,13 +40,13 @@ public class Trapd extends AbstractSpringContextJmxServiceDaemon
Date: Thu, 10 Mar 2016 11:51:40 -0500
Subject: [PATCH 02/79] Deleted some code that won't be needed in Trapd and
added comments about JIRA issues related to refactoring.
---
.../syslogd/BroadcastEventProcessor.java | 4 +
.../netmgt/trapd/TrapReceiverSnmp4jImpl.java | 117 ++----------------
.../java/org/opennms/netmgt/trapd/Trapd.java | 29 +----
.../opennms/applicationContext-trapDaemon.xml | 6 -
4 files changed, 14 insertions(+), 142 deletions(-)
diff --git a/features/events/syslog/src/main/java/org/opennms/netmgt/syslogd/BroadcastEventProcessor.java b/features/events/syslog/src/main/java/org/opennms/netmgt/syslogd/BroadcastEventProcessor.java
index 7975a70d8943..b86d4852a69d 100644
--- a/features/events/syslog/src/main/java/org/opennms/netmgt/syslogd/BroadcastEventProcessor.java
+++ b/features/events/syslog/src/main/java/org/opennms/netmgt/syslogd/BroadcastEventProcessor.java
@@ -45,6 +45,9 @@
*/
final class BroadcastEventProcessor implements EventListener {
private static final Logger LOG = LoggerFactory.getLogger(BroadcastEventProcessor.class);
+
+ // TODO: HZN-607: Create field for SyslogdIpMgr implementation (m_ipManager)
+
/**
* Create message selector to set to the subscription
*/
@@ -93,6 +96,7 @@ public void onEvent(Event event) {
if (eventUei.equals(EventConstants.NODE_GAINED_INTERFACE_EVENT_UEI)) {
// add to known nodes
if (Long.toString(event.getNodeid()) != null && event.getInterface() != null) {
+ // TODO: HZN-607: Instead of using the singleton call, use Spring to inject the value
SyslogdIPMgrDaoImpl.getInstance().setNodeId(event.getInterface(), event.getNodeid());
}
LOG.debug("Added {} to known node list", event.getInterface());
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java
index 1179bde8eff7..c8327953a20e 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java
@@ -54,6 +54,7 @@
* @author Oculan Corporation
* @fiddler joed
*/
+// TODO: HZN-609: Change to implement TrapNotificationListener
public class TrapReceiverSnmp4jImpl implements TrapReceiver {
private static final Logger LOG = LoggerFactory.getLogger(TrapReceiverSnmp4jImpl.class);
@@ -149,121 +150,19 @@ public void stop() throws InterruptedException {
/**
* The execution context.
*/
+ // TODO: HZN-609: Change this to TrapdNotificationListener.receive()
@Override
public void run() {
- // get the context
- m_context = Thread.currentThread();
-
- // Get a log instance
- Logging.putPrefix(Syslogd.LOG4J_CATEGORY);
-
- if (m_stop) {
- LOG.debug("Stop flag set before thread started, exiting");
- return;
- } else
- LOG.debug("Thread context started");
-
- // allocate a buffer
- final int length = 0xffff;
- final byte[] buffer = new byte[length];
-
- try {
- LOG.debug("Creating syslog socket");
- m_dgSock = new DatagramSocket(null);
- } catch (SocketException e) {
- LOG.warn("Could not create syslog socket: " + e.getMessage(), e);
- return;
- }
-
- // set an SO timeout to make sure we don't block forever
- // if a socket is closed.
- try {
- LOG.debug("Setting socket timeout to {}ms", SOCKET_TIMEOUT);
- m_dgSock.setSoTimeout(SOCKET_TIMEOUT);
- } catch (SocketException e) {
- LOG.warn("An I/O error occured while trying to set the socket timeout", e);
- }
-
- // Set SO_REUSEADDR so that we don't run into problems in
- // unit tests trying to rebind to an address where other tests
- // also bound. This shouldn't have any effect at runtime.
- try {
- LOG.debug("Setting socket SO_REUSEADDR to true");
- m_dgSock.setReuseAddress(true);
- } catch (SocketException e) {
- LOG.warn("An I/O error occured while trying to set SO_REUSEADDR", e);
- }
-
- // Increase the receive buffer for the socket
- try {
- LOG.debug("Attempting to set receive buffer size to {}", Integer.MAX_VALUE);
- m_dgSock.setReceiveBufferSize(Integer.MAX_VALUE);
- LOG.debug("Actual receive buffer size is {}", m_dgSock.getReceiveBufferSize());
- } catch (SocketException e) {
- LOG.info("Failed to set the receive buffer to {}", Integer.MAX_VALUE, e);
- }
+ SyslogConnection connection = new SyslogConnection(pkt, m_config);
try {
- LOG.debug("Opening datagram socket");
- if (m_config.getListenAddress() != null && m_config.getListenAddress().length() != 0) {
- m_dgSock.bind(new InetSocketAddress(InetAddressUtils.addr(m_config.getListenAddress()), m_config.getSyslogPort()));
- } else {
- m_dgSock.bind(new InetSocketAddress(m_config.getSyslogPort()));
+ for (TrapNotificationHandler handler : m_trapNotificationHandlers) {
+ handler.handleTrapNotification(connection);
}
- } catch (SocketException e) {
- LOG.info("Failed to open datagram socket", e);
+ } catch (Throwable e) {
+ LOG.error("Handler execution failed in {}", this.getClass().getSimpleName(), e);
}
-
- // set to avoid numerous tracing message
- boolean ioInterrupted = false;
-
- // Construct one mutable {@link DatagramPacket} that will be used for receiving syslog messages
- DatagramPacket pkt = new DatagramPacket(buffer, length);
-
- // now start processing incoming requests
- while (!m_stop) {
- if (m_context.isInterrupted()) {
- LOG.debug("Thread context interrupted");
- break;
- }
-
- try {
- if (!ioInterrupted) {
- LOG.debug("Waiting on a datagram to arrive");
- }
-
- m_dgSock.receive(pkt);
-
- SyslogConnection connection = new SyslogConnection(pkt, m_config);
-
- try {
- for (TrapNotificationHandler handler : m_trapNotificationHandlers) {
- handler.handleTrapNotification(connection);
- }
- } catch (Throwable e) {
- LOG.error("Handler execution failed in {}", this.getClass().getSimpleName(), e);
- }
-
- ioInterrupted = false; // reset the flag
- } catch (SocketTimeoutException e) {
- ioInterrupted = true;
- continue;
- } catch (InterruptedIOException e) {
- ioInterrupted = true;
- continue;
- } catch (IOException e) {
- if (m_stop) {
- // A SocketException can be thrown during normal shutdown so log as debug
- LOG.debug("Shutting down the datagram receipt port: " + e.getMessage());
- } else {
- LOG.error("An I/O exception occured on the datagram receipt port, exiting", e);
- }
- break;
- }
-
- } // end while status OK
-
- LOG.debug("Thread context exiting");
+ }
}
}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java
index 30699921fdce..47a49e5cecd3 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java
@@ -87,11 +87,6 @@ public class Trapd extends AbstractServiceDaemon implements TrapProcessorFactory
*/
private int m_status = START_PENDING;
- /**
- * The thread pool that processes traps
- */
- private ExecutorService m_backlogQ;
-
/**
* The queue processing thread
*/
@@ -146,6 +141,7 @@ public TrapProcessor createTrapProcessor() {
}
/** {@inheritDoc} */
+ // TODO: HZN-609: Move this method into TrapReceiverSnmp4jImpl
@Override
public void trapReceived(TrapNotification trapNotification) {
m_backlogQ.submit(m_processorFactory.getInstance(trapNotification));
@@ -158,8 +154,6 @@ public void trapReceived(TrapNotification trapNotification) {
public synchronized void onInit() {
BeanUtils.assertAutowiring(this);
- Assert.state(m_backlogQ != null, "backlogQ must be set");
-
try {
m_trapdIpMgr.dataSourceSync();
} catch (final SQLException e) {
@@ -288,8 +282,6 @@ public synchronized void onStop() {
LOG.debug("stop: Stopping queue processor.");
- m_backlogQ.shutdown();
-
m_eventReader.close();
m_status = STOPPED;
@@ -308,6 +300,7 @@ public synchronized int getStatus() {
}
/** {@inheritDoc} */
+ // TODO: HZN-609: Move this method into TrapReceiverSnmp4jImpl
@Override
public void trapError(final int error, final String msg) {
LOG.warn("Error Processing Received Trap: error = {} {}", error, (msg != null ? ", ref = " + msg : ""));
@@ -331,24 +324,6 @@ public void setEventReader(BroadcastEventProcessor eventReader) {
m_eventReader = eventReader;
}
- /**
- *
- *
- * @param backlogQ a {@link java.util.concurrent.ExecutorService} object.
- */
- public void setBacklogQ(ExecutorService backlogQ) {
- m_backlogQ = backlogQ;
- }
-
public static String getLoggingCategory() {
return LOG4J_CATEGORY;
}
diff --git a/features/events/traps/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml b/features/events/traps/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml
index 94110f93fc15..2d58c64b7941 100644
--- a/features/events/traps/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml
+++ b/features/events/traps/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml
@@ -21,7 +21,6 @@
-
@@ -31,11 +30,6 @@
-
-
-
-
-
From 3d898b450a70ff64086cf870385353a9957ec2b0 Mon Sep 17 00:00:00 2001
From: Pradeep Srivatsa
Date: Wed, 16 Mar 2016 11:38:33 -0400
Subject: [PATCH 03/79] HZN-606 : Added junits to test whether TrapNotification
is serializable.
---
.../snmp/snmp4j/Snmp4JTrapNotifier.java | 12 +-
.../TrapNotificationSerializationTest.java | 129 ++++++++++++++++++
2 files changed, 138 insertions(+), 3 deletions(-)
create mode 100644 features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapNotificationSerializationTest.java
diff --git a/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JTrapNotifier.java b/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JTrapNotifier.java
index df36cc97afd4..19edfc58d3b9 100644
--- a/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JTrapNotifier.java
+++ b/core/snmp/impl-snmp4j/src/main/java/org/opennms/netmgt/snmp/snmp4j/Snmp4JTrapNotifier.java
@@ -28,6 +28,7 @@
package org.opennms.netmgt.snmp.snmp4j;
+import java.io.Serializable;
import java.net.InetAddress;
import org.opennms.netmgt.snmp.SnmpObjId;
@@ -66,11 +67,13 @@ public Snmp4JTrapNotifier(TrapNotificationListener listener, TrapProcessorFactor
m_trapProcessorFactory = processorFactory;
}
- public static class Snmp4JV1TrapInformation extends TrapInformation {
+ public static class Snmp4JV1TrapInformation extends TrapInformation implements Serializable {
+
+ private static final long serialVersionUID = -5130592972765964504L;
private PDUv1 m_pdu;
- protected Snmp4JV1TrapInformation(InetAddress agent, String community, PDUv1 pdu, TrapProcessor trapProcessor) {
+ public Snmp4JV1TrapInformation(InetAddress agent, String community, PDUv1 pdu, TrapProcessor trapProcessor) {
super(agent, community, trapProcessor);
m_pdu = pdu;
}
@@ -112,7 +115,10 @@ protected void processVarBindAt(int i) {
}
}
- public static class Snmp4JV2TrapInformation extends TrapInformation {
+ public static class Snmp4JV2TrapInformation extends TrapInformation implements Serializable {
+
+ private static final long serialVersionUID = 2961743197092484906L;
+
/**
* The received PDU
*/
diff --git a/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapNotificationSerializationTest.java b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapNotificationSerializationTest.java
new file mode 100644
index 000000000000..14c0dc030e2e
--- /dev/null
+++ b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapNotificationSerializationTest.java
@@ -0,0 +1,129 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2016-2016 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2016 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import static org.junit.Assert.*;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opennms.netmgt.snmp.TrapNotification;
+import org.opennms.netmgt.snmp.snmp4j.Snmp4JTrapNotifier;
+import org.snmp4j.PDU;
+import org.snmp4j.PDUv1;
+import org.snmp4j.ScopedPDU;
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.OctetString;
+import org.snmp4j.smi.VariableBinding;
+
+public class TrapNotificationSerializationTest {
+
+ private InetAddress inetAddress;
+
+ @Before
+ public void setup() throws UnknownHostException{
+ inetAddress = InetAddress.getByName("127.0.0.1");
+ }
+
+ @Test
+ public void testsnmp4JV1Serialization() throws UnknownHostException {
+ // create instance of Snmp4JV1
+
+ PDUv1 snmp4JV1TrapPdu = new PDUv1();
+ snmp4JV1TrapPdu.setType(PDU.V1TRAP);
+ snmp4JV1TrapPdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"),
+ new OctetString("mockhost")));
+ snmp4JV1TrapPdu.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.3"),
+ new OctetString("mockhost")));
+ snmp4JV1TrapPdu.add(new VariableBinding(new OID(
+ ".1.3.6.1.6.3.1.1.4.1.0"), new OctetString("mockhost")));
+
+ TrapNotification snmp4JV1Trap = new Snmp4JTrapNotifier.Snmp4JV1TrapInformation(
+ inetAddress, new String("public"), snmp4JV1TrapPdu, null);
+ assertTrue(writeTrapNotificationObject(snmp4JV1Trap));
+ }
+
+ @Test
+ public void testsnmp4JV2cSerialization() throws UnknownHostException {
+ // create instance of snmp4JV2cTrap
+ PDU snmp4JV2cTrapPdu = new PDU();
+ snmp4JV2cTrapPdu.setType(PDU.TRAP);
+ snmp4JV2cTrapPdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"),
+ new OctetString("mockhost")));
+ snmp4JV2cTrapPdu.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.3"),
+ new OctetString("mockhost")));
+ snmp4JV2cTrapPdu.add(new VariableBinding(new OID(
+ ".1.3.6.1.6.3.1.1.4.1.0"), new OctetString("mockhost")));
+
+ TrapNotification snmp4JV2cTrap = new Snmp4JTrapNotifier.Snmp4JV2TrapInformation(
+ inetAddress, new String("public"), snmp4JV2cTrapPdu, null);
+ assertTrue(writeTrapNotificationObject(snmp4JV2cTrap));
+ }
+
+ @Test
+ public void testsnmp4JV3Serialization() throws UnknownHostException {
+
+ // create instance of snmp4JV3Trap
+ PDU snmp4JV3TrapPdu = new ScopedPDU();
+ snmp4JV3TrapPdu.setType(PDU.TRAP);
+ snmp4JV3TrapPdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"),
+ new OctetString("mockhost")));
+ snmp4JV3TrapPdu.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.3"),
+ new OctetString("mockhost")));
+ snmp4JV3TrapPdu.add(new VariableBinding(new OID(
+ ".1.3.6.1.6.3.1.1.4.1.0"), new OctetString("mockhost")));
+
+ TrapNotification snmp4JV3Trap = new Snmp4JTrapNotifier.Snmp4JV2TrapInformation(
+ inetAddress, new String("public"), snmp4JV3TrapPdu, null);
+ assertTrue(writeTrapNotificationObject(snmp4JV3Trap));
+ }
+
+ public boolean writeTrapNotificationObject(TrapNotification object) {
+ try {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream objectOutputStream = new ObjectOutputStream(bos);
+ objectOutputStream.writeObject(object);
+ return true;
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+}
From 669bae138f030a38018f6ad16b43febbb58c79a8 Mon Sep 17 00:00:00 2001
From: Pavan Kumar RP
Date: Wed, 16 Mar 2016 12:02:25 -0400
Subject: [PATCH 04/79] HZN-605: Consolidate TrapdIpMgr implementations.
Removed getInstance() method and changed node IDs to integers inside
TrapdIpManagerDaoImpl.
---
.../netmgt/trapd/HibernateTrapdIpMgr.java | 154 -----------------
.../org/opennms/netmgt/trapd/Syslogd.java | 2 +-
.../netmgt/trapd/TrapdIpManagerDaoImpl.java | 69 ++++----
.../netmgt/trapd/TrapdIpManagerJDBCImpl.java | 158 ------------------
.../org/opennms/netmgt/trapd/TrapdIpMgr.java | 16 +-
.../opennms/applicationContext-trapDaemon.xml | 2 +-
.../opennms/netmgt/trapd/MockTrapdIpMgr.java | 6 +-
.../opennms/netmgt/trapd/trapdIpMgr-test.xml | 2 +-
8 files changed, 50 insertions(+), 359 deletions(-)
delete mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/HibernateTrapdIpMgr.java
delete mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerJDBCImpl.java
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/HibernateTrapdIpMgr.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/HibernateTrapdIpMgr.java
deleted file mode 100644
index dbf9b1b97a81..000000000000
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/HibernateTrapdIpMgr.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * This file is part of OpenNMS(R).
- *
- * Copyright (C) 2003-2014 The OpenNMS Group, Inc.
- * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License,
- * or (at your option) any later version.
- *
- * OpenNMS(R) is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with OpenNMS(R). If not, see:
- * http://www.gnu.org/licenses/
- *
- * For more information contact:
- * OpenNMS(R) Licensing
- * http://www.opennms.org/
- * http://www.opennms.com/
- *******************************************************************************/
-
-package org.opennms.netmgt.trapd;
-
-import java.net.InetAddress;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.opennms.core.utils.InetAddressUtils;
-import org.opennms.netmgt.dao.api.IpInterfaceDao;
-import org.opennms.netmgt.model.OnmsIpInterface;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.InitializingBean;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.Assert;
-
-/**
- * This class represents a singular instance that is used to map trap IP
- * addresses to known nodes.
- *
- * @author Brian Weaver
- * @author Tarus Balog
- * @author OpenNMS
- */
-public class HibernateTrapdIpMgr implements TrapdIpMgr, InitializingBean {
-
- private static final Logger LOG = LoggerFactory.getLogger(HibernateTrapdIpMgr.class);
-
- @Autowired
- private IpInterfaceDao m_ipInterfaceDao;
-
- /**
- * A Map of IP addresses and node IDs
- */
- protected Map m_knownips = new HashMap();
-
- /**
- * Default construct for the instance.
- */
- public HibernateTrapdIpMgr() {
- }
-
- /* (non-Javadoc)
- * @see org.opennms.netmgt.trapd.TrapdIpMgr#dataSourceSync()
- */
- /**
- *
dataSourceSync
- */
- @Transactional(readOnly = true)
- @Override
- public synchronized void dataSourceSync() {
- m_knownips = m_ipInterfaceDao.getInterfacesForNodes();
- }
-
- /* (non-Javadoc)
- * @see org.opennms.netmgt.trapd.TrapdIpMgr#getNodeId(java.lang.String)
- */
- /** {@inheritDoc} */
- @Override
- public synchronized long getNodeId(String addr) {
- if (addr == null) {
- return -1;
- }
- return longValue(m_knownips.get(InetAddressUtils.getInetAddress(addr)));
- }
-
- /* (non-Javadoc)
- * @see org.opennms.netmgt.trapd.TrapdIpMgr#setNodeId(java.lang.String, long)
- */
- /** {@inheritDoc} */
- @Override
- public synchronized long setNodeId(String addr, long nodeid) {
- if (addr == null || nodeid == -1) {
- return -1;
- }
- // Only add the address if it doesn't exist on the map. If it exists, only replace the current one if the new address is primary.
- boolean add = true;
- if (m_knownips.containsKey(InetAddressUtils.getInetAddress(addr))) {
- OnmsIpInterface intf = m_ipInterfaceDao.findByNodeIdAndIpAddress(Integer.valueOf((int) nodeid), addr);
- add = intf != null && intf.isPrimary();
- LOG.info("setNodeId: address found {}. Should be added? {}", intf, add);
- }
- return add ? longValue(m_knownips.put(InetAddressUtils.getInetAddress(addr), Integer.valueOf((int) nodeid))) : -1;
- }
-
- /* (non-Javadoc)
- * @see org.opennms.netmgt.trapd.TrapdIpMgr#removeNodeId(java.lang.String)
- */
- /** {@inheritDoc} */
- @Override
- public synchronized long removeNodeId(String addr) {
- if (addr == null) {
- return -1;
- }
- return longValue(m_knownips.remove(InetAddressUtils.getInetAddress(addr)));
- }
-
- private static long longValue(Integer result) {
- return (result == null ? -1 : result.longValue());
- }
-
- /**
- *
afterPropertiesSet
- *
- * @throws java.lang.Exception if any.
- */
- @Override
- public void afterPropertiesSet() throws Exception {
- Assert.state(m_ipInterfaceDao != null, "property ipInterfaceDao must be set");
- }
-
- /**
- *
getIpInterfaceDao
- *
- * @return a {@link org.opennms.netmgt.dao.api.IpInterfaceDao} object.
- */
- public IpInterfaceDao getIpInterfaceDao() {
- return m_ipInterfaceDao;
- }
-
- @Override
- public long longValue(final Long result) {
- return (result == null ? -1 : result);
- }
-
-}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Syslogd.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Syslogd.java
index 5bc410a3e106..86331c0cf79f 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Syslogd.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Syslogd.java
@@ -88,7 +88,7 @@ protected void onInit() {
try {
// clear out the known nodes
- TrapdIpManagerJDBCImpl.getInstance().dataSourceSync();
+ TrapdIpManagerDaoImpl.getInstance().dataSourceSync();
} catch (SQLException e) {
LOG.error("Failed to load known IP address list", e);
throw new UndeclaredThrowableException(e);
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerDaoImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerDaoImpl.java
index 4fb6f41f70d9..e2a1ca285411 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerDaoImpl.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerDaoImpl.java
@@ -28,38 +28,40 @@
package org.opennms.netmgt.trapd;
-import java.sql.SQLException;
-import java.util.List;
+import java.net.InetAddress;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.opennms.core.utils.InetAddressUtils;
import org.opennms.netmgt.dao.api.IpInterfaceDao;
import org.opennms.netmgt.model.OnmsIpInterface;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
* This class represents a singular instance that is used to map trap IP
* addresses to known nodes.
+ *
+ * TODO: Replace method-level synchronization with collection-level
+ * synchronization.
*
* @author Johan Edstrom
* @author Brian Weaver
* @author Tarus Balog
* @author OpenNMS
*/
-final class TrapdIpManagerDaoImpl implements TrapdIpMgr {
-
+public class TrapdIpManagerDaoImpl implements TrapdIpMgr {
+
+ private static final Logger LOG = LoggerFactory.getLogger(TrapdIpManagerDaoImpl.class);
+
@Autowired
private IpInterfaceDao m_ipInterfaceDao;
/**
* A Map of IP addresses and node IDs
*/
- private static Map m_knownips = new ConcurrentHashMap();
-
- public static TrapdIpMgr getInstance() {
- return new TrapdIpManagerDaoImpl();
- }
+ protected Map m_knownips = new ConcurrentHashMap();
/**
* Clears and synchronizes the internal known IP address cache with the
@@ -72,18 +74,8 @@ public static TrapdIpMgr getInstance() {
* error occurs.
*/
@Override
- public synchronized void dataSourceSync() throws SQLException {
-
- List list = m_ipInterfaceDao.findAll();
-
- m_knownips.clear();
- for (OnmsIpInterface one: list) {
- if (one != null) {
- m_knownips.put(InetAddressUtils.str(one.getIpAddress()), (long) one.getId());
- }
-
- }
-
+ public synchronized void dataSourceSync() {
+ m_knownips = m_ipInterfaceDao.getInterfacesForNodes();
}
/**
@@ -93,11 +85,11 @@ public synchronized void dataSourceSync() throws SQLException {
* @return The node ID of the IP Address if known.
*/
@Override
- public synchronized long getNodeId(final String addr) {
+ public synchronized int getNodeId(String addr) {
if (addr == null) {
return -1;
}
- return longValue(m_knownips.get(addr));
+ return intValue(m_knownips.get(InetAddressUtils.getInetAddress(addr)));
}
/**
@@ -108,11 +100,22 @@ public synchronized long getNodeId(final String addr) {
* @return The nodeid if it existed in the map.
*/
@Override
- public long setNodeId(final String addr, final long nodeid) {
- if (addr == null || nodeid == -1)
+ public synchronized int setNodeId(String addr, int nodeid) {
+ if (addr == null || nodeid == -1) {
return -1;
-
- return longValue(m_knownips.put(addr, nodeid));
+ }
+ // Only add the address if it doesn't exist on the map. If it exists, only replace the current one if the new address is primary.
+ if (m_knownips.containsKey(InetAddressUtils.getInetAddress(addr))) {
+ OnmsIpInterface intf = m_ipInterfaceDao.findByNodeIdAndIpAddress(nodeid, addr);
+ if (intf != null && intf.isPrimary()) {
+ LOG.info("setNodeId: adding SNMP primary IP address {} to known IP list", intf);
+ return intValue(m_knownips.put(InetAddressUtils.getInetAddress(addr), nodeid));
+ } else {
+ return -1;
+ }
+ } else {
+ return intValue(m_knownips.put(InetAddressUtils.getInetAddress(addr), nodeid));
+ }
}
/**
@@ -122,15 +125,15 @@ public long setNodeId(final String addr, final long nodeid) {
* @return The nodeid that was in the map.
*/
@Override
- public long removeNodeId(final String addr) {
- if (addr == null)
+ public synchronized int removeNodeId(String addr) {
+ if (addr == null) {
return -1;
- return longValue(m_knownips.remove(addr));
+ }
+ return intValue(m_knownips.remove(InetAddressUtils.getInetAddress(addr)));
}
@Override
- public long longValue(final Long result) {
+ public int intValue(final Integer result) {
return (result == null ? -1 : result);
}
-
-} // end SyslodIPMgr
+}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerJDBCImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerJDBCImpl.java
deleted file mode 100644
index f87ed02fb93f..000000000000
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpManagerJDBCImpl.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * This file is part of OpenNMS(R).
- *
- * Copyright (C) 2003-2014 The OpenNMS Group, Inc.
- * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License,
- * or (at your option) any later version.
- *
- * OpenNMS(R) is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with OpenNMS(R). If not, see:
- * http://www.gnu.org/licenses/
- *
- * For more information contact:
- * OpenNMS(R) Licensing
- * http://www.opennms.org/
- * http://www.opennms.com/
- *******************************************************************************/
-
-package org.opennms.netmgt.trapd;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.opennms.core.db.DataSourceFactory;
-
-/**
- * This class represents a singular instance that is used to map trap IP
- * addresses to known nodes.
- *
- * @author Johan Edstrom
- * @author Brian Weaver
- * @author Tarus Balog
- * @author OpenNMS
- */
-final class TrapdIpManagerJDBCImpl implements TrapdIpMgr {
- /**
- * The SQL statement used to extract the list of currently known IP
- * addresses and their node IDs from the IP Interface table.
- */
- private static final String IP_LOAD_SQL = "SELECT ipAddr, nodeid FROM ipInterface";
-
- /**
- * A Map of IP addresses and node IDs
- */
- private static Map m_knownips = new ConcurrentHashMap();
-
- public static TrapdIpMgr getInstance() {
- return new TrapdIpManagerJDBCImpl();
- }
-
- /**
- * Clears and synchronizes the internal known IP address cache with the
- * current information contained in the database. To synchronize the cache
- * the method opens a new connection to the database, loads the address,
- * and then closes it's connection.
- *
- * @throws java.sql.SQLException
- * Thrown if the connection cannot be created or a database
- * error occurs.
- */
- @Override
- public synchronized void dataSourceSync() throws SQLException {
- java.sql.Connection c = null;
- Statement s = null;
- try {
- // Get database connection
- c = DataSourceFactory.getInstance().getConnection();
-
- // Run with it
- c.setReadOnly(true);
-
- s = c.createStatement();
- final ResultSet rs = s.executeQuery(IP_LOAD_SQL);
-
- if (rs != null) {
- m_knownips.clear();
- while (rs.next()) {
- m_knownips.put(rs.getString(1), rs.getLong(2));
- }
- rs.close();
- }
- } finally {
- if (s != null) {
- try {
- s.close();
- } catch (final SQLException sqlE) {
- }
- }
- if (c != null) {
- try {
- c.close();
- } catch (final SQLException sqlE) {
- }
- }
- }
- }
-
- /**
- * Returns the nodeid for the IP Address
- *
- * @param addr The IP Address to query.
- * @return The node ID of the IP Address if known.
- */
- @Override
- public synchronized long getNodeId(final String addr) {
- if (addr == null) {
- return -1;
- }
- return TrapdIpManagerJDBCImpl.getInstance().longValue(m_knownips.get(addr));
- }
-
- /**
- * Sets the IP Address and Node ID in the Map.
- *
- * @param addr The IP Address to add.
- * @param nodeid The Node ID to add.
- * @return The nodeid if it existed in the map.
- */
- @Override
- public long setNodeId(final String addr, final long nodeid) {
- if (addr == null || nodeid == -1)
- return -1;
-
- return TrapdIpManagerJDBCImpl.getInstance().longValue(m_knownips.put(addr, nodeid));
- }
-
- /**
- * Removes an address from the node ID map.
- *
- * @param addr The address to remove from the node ID map.
- * @return The nodeid that was in the map.
- */
- @Override
- public long removeNodeId(final String addr) {
- if (addr == null)
- return -1;
- return TrapdIpManagerJDBCImpl.getInstance().longValue(m_knownips.remove(addr));
- }
-
- @Override
- public long longValue(final Long result) {
- return (result == null ? -1 : result);
- }
-
-} // end SyslodIPMgr
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpMgr.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpMgr.java
index f1eecf581b22..d45cda549435 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpMgr.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdIpMgr.java
@@ -28,7 +28,6 @@
package org.opennms.netmgt.trapd;
-import java.sql.SQLException;
/**
*
TrapdIpMgr interface.
@@ -48,7 +47,7 @@ public interface TrapdIpMgr {
* Thrown if the connection cannot be created or a database
* error occurs.
*/
- void dataSourceSync() throws SQLException;
+ void dataSourceSync();
/**
* Returns the nodeid for the IP Address
@@ -57,7 +56,7 @@ public interface TrapdIpMgr {
* The IP Address to query.
* @return The node ID of the IP Address if known.
*/
- long getNodeId(String addr);
+ int getNodeId(String addr);
/**
* Sets the IP Address and Node ID in the Map.
@@ -68,7 +67,7 @@ public interface TrapdIpMgr {
* The Node ID to add.
* @return The nodeid if it existed in the map.
*/
- long setNodeId(String addr, long nodeid);
+ int setNodeId(String addr, int nodeid);
/**
* Removes an address from the node ID map.
@@ -77,8 +76,13 @@ public interface TrapdIpMgr {
* The address to remove from the node ID map.
* @return The nodeid that was in the map.
*/
- long removeNodeId(String addr);
+ int removeNodeId(String addr);
- long longValue(Long result);
+ /**
+ * Method will check value for null.
+ * @param result
+ * @return If result is null returns -1 else returns result itself
+ */
+ int intValue(Integer result);
}
diff --git a/features/events/traps/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml b/features/events/traps/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml
index 2d58c64b7941..eed09c0501c7 100644
--- a/features/events/traps/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml
+++ b/features/events/traps/src/main/resources/META-INF/opennms/applicationContext-trapDaemon.xml
@@ -23,7 +23,7 @@
-
+
diff --git a/features/events/traps/src/test/java/org/opennms/netmgt/trapd/MockTrapdIpMgr.java b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/MockTrapdIpMgr.java
index e62d074086ba..1ae87ed595bf 100644
--- a/features/events/traps/src/test/java/org/opennms/netmgt/trapd/MockTrapdIpMgr.java
+++ b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/MockTrapdIpMgr.java
@@ -34,11 +34,7 @@
*
* @author DJ Gregor
*/
-public class MockTrapdIpMgr extends HibernateTrapdIpMgr {
- @Override
- public void afterPropertiesSet() throws Exception {
- // Don't check for the dataSource property being set
- }
+public class MockTrapdIpMgr extends TrapdIpManagerDaoImpl {
@Override
public synchronized void dataSourceSync() {
diff --git a/features/events/traps/src/test/resources/org/opennms/netmgt/trapd/trapdIpMgr-test.xml b/features/events/traps/src/test/resources/org/opennms/netmgt/trapd/trapdIpMgr-test.xml
index c7f1271d9aa0..c7d79fe36ce8 100644
--- a/features/events/traps/src/test/resources/org/opennms/netmgt/trapd/trapdIpMgr-test.xml
+++ b/features/events/traps/src/test/resources/org/opennms/netmgt/trapd/trapdIpMgr-test.xml
@@ -19,6 +19,6 @@
-
+
From 43530d71b6a6b224dfbfe6e75737bb2d99b8018e Mon Sep 17 00:00:00 2001
From: Malatesh Sudarshan
Date: Wed, 16 Mar 2016 16:06:21 -0400
Subject: [PATCH 05/79] HZN-608: Update of BroadcastEventProcessor's onEvent()
method and removed BroadcastEventProcessorSyslog.java
---
.../netmgt/trapd/BroadcastEventProcessor.java | 41 +++---
.../trapd/BroadcastEventProcessorSyslog.java | 122 ------------------
2 files changed, 19 insertions(+), 144 deletions(-)
delete mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessorSyslog.java
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessor.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessor.java
index d784a276c6a7..272376b226aa 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessor.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessor.java
@@ -48,12 +48,12 @@
* @author OpenNMS
*/
public final class BroadcastEventProcessor implements EventListener, InitializingBean, DisposableBean {
-
- private static final Logger LOG = LoggerFactory.getLogger(BroadcastEventProcessor.class);
-
+
+ private static final Logger LOG = LoggerFactory.getLogger(BroadcastEventProcessor.class);
+
private final EventIpcManager m_eventMgr;
private final TrapdIpMgr m_trapdIpMgr;
-
+
/**
*
Constructor for BroadcastEventProcessor.
*
@@ -131,32 +131,29 @@ public void destroy() throws Exception {
public void onEvent(Event event) {
String eventUei = event.getUei();
- if (eventUei == null) {
- LOG.warn("Received an unexpected event with a null UEI");
+ if (eventUei == null)
return;
- }
LOG.debug("Received event: {}", eventUei);
- if (eventUei.equals(EventConstants.NODE_GAINED_INTERFACE_EVENT_UEI)
- || eventUei.equals(EventConstants.INTERFACE_REPARENTED_EVENT_UEI)) {
- String action = eventUei.equals(EventConstants.INTERFACE_REPARENTED_EVENT_UEI) ?
- "reparent" : "add";
- if (Long.toString(event.getNodeid()) == null) {
- LOG.warn("Not {}ing interface to known node list: nodeId is null", action);
- } else if (event.getInterface() == null) {
- LOG.warn("Not {}ing interface to known node list: interface is null", action);
- } else {
- m_trapdIpMgr.setNodeId(event.getInterface(), event.getNodeid());
- LOG.debug("Successfully {}ed {} to known node list", action, event.getInterface());
+ if (EventConstants.NODE_GAINED_INTERFACE_EVENT_UEI.equals(eventUei)) {
+ // add to known nodes
+ if (event.getNodeid() != null && event.getInterface() != null) {
+ m_trapdIpMgr.setNodeId(event.getInterface(), event.getNodeid().intValue());
}
- } else if (eventUei.equals(EventConstants.INTERFACE_DELETED_EVENT_UEI)) {
+ LOG.debug("Added {} to known node list", event.getInterface());
+ } else if (EventConstants.INTERFACE_DELETED_EVENT_UEI.equals(eventUei)) {
+ // remove from known nodes
if (event.getInterface() != null) {
m_trapdIpMgr.removeNodeId(event.getInterface());
- LOG.debug("Removed {} from known node list", event.getInterface());
}
- } else {
- LOG.warn("Received an unexpected event with UEI of \"{}\"" , eventUei);
+ LOG.debug("Removed {} from known node list", event.getInterface());
+ } else if (EventConstants.INTERFACE_REPARENTED_EVENT_UEI.equals(eventUei)) {
+ // add to known nodes
+ if (event.getNodeid() != null && event.getInterface() != null) {
+ m_trapdIpMgr.setNodeId(event.getInterface(), event.getNodeid().intValue());
+ }
+ LOG.debug("Reparented {} to known node list", event.getInterface());
}
}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessorSyslog.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessorSyslog.java
deleted file mode 100644
index 819bd42942a3..000000000000
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/BroadcastEventProcessorSyslog.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * This file is part of OpenNMS(R).
- *
- * Copyright (C) 2002-2014 The OpenNMS Group, Inc.
- * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License,
- * or (at your option) any later version.
- *
- * OpenNMS(R) is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with OpenNMS(R). If not, see:
- * http://www.gnu.org/licenses/
- *
- * For more information contact:
- * OpenNMS(R) Licensing
- * http://www.opennms.org/
- * http://www.opennms.com/
- *******************************************************************************/
-
-package org.opennms.netmgt.trapd;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.opennms.netmgt.events.api.EventConstants;
-import org.opennms.netmgt.events.api.EventIpcManagerFactory;
-import org.opennms.netmgt.events.api.EventListener;
-import org.opennms.netmgt.xml.event.Event;
-
-/**
- * @author Johan Edstrom
- * @author Tarus Balog
- * @author OpenNMS
- */
-final class BroadcastEventProcessorSyslog implements EventListener {
- private static final Logger LOG = LoggerFactory.getLogger(BroadcastEventProcessor.class);
- /**
- * Create message selector to set to the subscription
- */
- BroadcastEventProcessorSyslog() {
- // Create the selector for the ueis this service is interested in
- //
- List ueiList = new ArrayList();
-
- // nodeGainedInterface
- ueiList.add(EventConstants.NODE_GAINED_INTERFACE_EVENT_UEI);
-
- // interfaceDeleted
- ueiList.add(EventConstants.INTERFACE_DELETED_EVENT_UEI);
-
- EventIpcManagerFactory.init();
- EventIpcManagerFactory.getIpcManager().addEventListener(this, ueiList);
- }
-
-
-
- /**
- * Unsubscribe from eventd
- */
- public void close() {
- EventIpcManagerFactory.getIpcManager().removeEventListener(this);
- }
-
- /**
- * {@inheritDoc}
- *
- * This method is invoked by the EventIpcManager when a new event is
- * available for processing. Each message is examined for its Universal
- * Event Identifier and the appropriate action is taking based on each UEI.
- */
- @Override
- public void onEvent(Event event) {
-
- String eventUei = event.getUei();
- if (eventUei == null)
- return;
-
-
- LOG.debug("Received event: {}", eventUei);
-
- if (eventUei.equals(EventConstants.NODE_GAINED_INTERFACE_EVENT_UEI)) {
- // add to known nodes
- if (Long.toString(event.getNodeid()) != null && event.getInterface() != null) {
- TrapdIpManagerDaoImpl.getInstance().setNodeId(event.getInterface(), event.getNodeid());
- }
- LOG.debug("Added {} to known node list", event.getInterface());
- } else if (eventUei.equals(EventConstants.INTERFACE_DELETED_EVENT_UEI)) {
- // remove from known nodes
- if (event.getInterface() != null) {
- TrapdIpManagerDaoImpl.getInstance().removeNodeId(event.getInterface());
- }
- LOG.debug("Removed {} from known node list", event.getInterface());
- } else if (eventUei.equals(EventConstants.INTERFACE_REPARENTED_EVENT_UEI)) {
- // add to known nodes
- if (Long.toString(event.getNodeid()) != null && event.getInterface() != null) {
- TrapdIpManagerDaoImpl.getInstance().setNodeId(event.getInterface(), event.getNodeid());
- }
- LOG.debug("Reparented {} to known node list", event.getInterface());
- }
- }
-
- /**
- * Return an id for this event listener
- *
- * @return a {@link java.lang.String} object.
- */
- @Override
- public String getName() {
- return "Syslogd:BroadcastEventProcessor";
- }
-}
From afda5cb91c127f3da80661ec409cbfb6c89639cf Mon Sep 17 00:00:00 2001
From: Seth Leger
Date: Wed, 16 Mar 2016 16:08:04 -0400
Subject: [PATCH 06/79] Fixed a couple of compile errors.
---
.../org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java | 2 --
.../src/main/java/org/opennms/netmgt/trapd/Trapd.java | 7 +------
.../java/org/opennms/netmgt/trapd/TrapHandlerITCase.java | 2 +-
3 files changed, 2 insertions(+), 9 deletions(-)
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java
index c8327953a20e..077b4cfb139b 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapReceiverSnmp4jImpl.java
@@ -163,6 +163,4 @@ public void run() {
LOG.error("Handler execution failed in {}", this.getClass().getSimpleName(), e);
}
}
-
- }
}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java
index 47a49e5cecd3..b07f66809bb0 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/Trapd.java
@@ -154,12 +154,7 @@ public void trapReceived(TrapNotification trapNotification) {
public synchronized void onInit() {
BeanUtils.assertAutowiring(this);
- try {
- m_trapdIpMgr.dataSourceSync();
- } catch (final SQLException e) {
- LOG.error("init: Failed to load known IP address list", e);
- throw new UndeclaredThrowableException(e);
- }
+ m_trapdIpMgr.dataSourceSync();
try {
InetAddress address = getInetAddress();
diff --git a/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapHandlerITCase.java b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapHandlerITCase.java
index e78c3e490783..cd607232127f 100644
--- a/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapHandlerITCase.java
+++ b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapHandlerITCase.java
@@ -108,7 +108,7 @@ public class TrapHandlerITCase implements InitializingBean {
private static final String m_ip = "127.0.0.1";
- private static final long m_nodeId = 1;
+ private static final int m_nodeId = 1;
@BeforeClass
public static void setUpLogging() {
From a34fe277ec7f06b0bf23c90a7df2c6132acf29fd Mon Sep 17 00:00:00 2001
From: Seth Leger
Date: Wed, 16 Mar 2016 17:19:26 -0400
Subject: [PATCH 07/79] Removed some unnecessary example code copied from
Syslogd.
---
.../netmgt/trapd/SyslogConfigBean.java | 132 -----------
.../netmgt/trapd/SyslogConnection.java | 218 ------------------
.../TrapNotificationHandlerDefaultImpl.java | 25 +-
3 files changed, 11 insertions(+), 364 deletions(-)
delete mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConfigBean.java
delete mode 100644 features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConnection.java
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConfigBean.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConfigBean.java
deleted file mode 100644
index 8e5db4a4733a..000000000000
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConfigBean.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * This file is part of OpenNMS(R).
- *
- * Copyright (C) 2002-2014 The OpenNMS Group, Inc.
- * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License,
- * or (at your option) any later version.
- *
- * OpenNMS(R) is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with OpenNMS(R). If not, see:
- * http://www.gnu.org/licenses/
- *
- * For more information contact:
- * OpenNMS(R) Licensing
- * http://www.opennms.org/
- * http://www.opennms.com/
- *******************************************************************************/
-
-package org.opennms.netmgt.trapd;
-
-import org.opennms.netmgt.config.SyslogdConfig;
-import org.opennms.netmgt.config.syslogd.HideMessage;
-import org.opennms.netmgt.config.syslogd.UeiList;
-
-/**
- * This is a bean container that can be used as a {@link SyslogConfig}
- * service.
- */
-public final class SyslogConfigBean implements SyslogdConfig {
-
- private int m_syslogPort;
- private String m_listenAddress;
- private String m_forwardingRegexp;
- private int m_matchingGroupHost;
- private int m_matchingGroupMessage;
- private String m_parser;
- private String m_discardUei;
- private boolean m_newSuspectOnMessage;
-
- @Override
- public int getSyslogPort() {
- return m_syslogPort;
- }
-
- public void setSyslogPort(int syslogPort) {
- m_syslogPort = syslogPort;
- }
-
- @Override
- public String getListenAddress() {
- return m_listenAddress;
- }
-
- public void setListenAddress(String listenAddress) {
- m_listenAddress = listenAddress;
- }
-
- @Override
- public boolean getNewSuspectOnMessage() {
- return m_newSuspectOnMessage;
- }
-
- public void setNewSuspectOnMessage(boolean newSuspectOnMessage) {
- m_newSuspectOnMessage = newSuspectOnMessage;
- }
-
- @Override
- public String getForwardingRegexp() {
- return m_forwardingRegexp;
- }
-
- public void setForwardingRegexp(String forwardingRegexp) {
- m_forwardingRegexp = forwardingRegexp;
- }
-
- @Override
- public int getMatchingGroupHost() {
- return m_matchingGroupHost;
- }
-
- public void setMatchingGroupHost(int matchingGroupHost) {
- m_matchingGroupHost = matchingGroupHost;
- }
-
- @Override
- public int getMatchingGroupMessage() {
- return m_matchingGroupMessage;
- }
-
- public void setMatchingGroupMessage(int matchingGroupMessage) {
- m_matchingGroupMessage = matchingGroupMessage;
- }
-
- @Override
- public String getParser() {
- return m_parser;
- }
-
- public void setParser(String parser) {
- m_parser = parser;
- }
-
- @Override
- public UeiList getUeiList() {
- return null;
- }
-
- @Override
- public HideMessage getHideMessages() {
- return null;
- }
-
- @Override
- public String getDiscardUei() {
- return m_discardUei;
- }
-
- public void setDiscardUei(String discardUei) {
- m_discardUei = discardUei;
- }
-
-}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConnection.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConnection.java
deleted file mode 100644
index f3e214c87dc2..000000000000
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogConnection.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * This file is part of OpenNMS(R).
- *
- * Copyright (C) 2006-2014 The OpenNMS Group, Inc.
- * OpenNMS(R) is Copyright (C) 1999-2014 The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
- *
- * OpenNMS(R) is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published
- * by the Free Software Foundation, either version 3 of the License,
- * or (at your option) any later version.
- *
- * OpenNMS(R) is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with OpenNMS(R). If not, see:
- * http://www.gnu.org/licenses/
- *
- * For more information contact:
- * OpenNMS(R) Licensing
- * http://www.opennms.org/
- * http://www.opennms.com/
- *******************************************************************************/
-
-package org.opennms.netmgt.trapd;
-
-import java.io.UnsupportedEncodingException;
-import java.net.DatagramPacket;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.nio.charset.StandardCharsets;
-import java.util.concurrent.Callable;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-
-import org.opennms.core.network.InetAddressXmlAdapter;
-import org.opennms.netmgt.config.SyslogdConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- *
This class is a {@link Callable} task that is responsible for converting
- * the syslog payload into an OpenNMS event by using the {@link ConvertToEvent}
- * class.
- *
- * @author Mathew Brozowski
- * @author Johan Edstrom
- * @author Mike Huot
- */
-@XmlRootElement
-@XmlAccessorType(XmlAccessType.NONE)
-public class SyslogConnection implements Callable> {
-
- private static final Logger LOG = LoggerFactory.getLogger(SyslogConnection.class);
-
- public static final int MAX_PACKET_SIZE = 4096;
-
- private InetAddress m_sourceAddress;
- private int m_port;
- private ByteBuffer m_bytes;
- private SyslogdConfig m_config;
-
- /**
- * No-arg constructor so that we can preallocate this object for use with
- * an LMAX Disruptor or use it with JAXB.
- */
- public SyslogConnection() {
- }
-
- public SyslogConnection(final DatagramPacket packet, final SyslogdConfig config) {
- this(packet.getAddress(), packet.getPort(), ByteBuffer.wrap(packet.getData(), 0, packet.getLength()), config);
- }
-
- public SyslogConnection(final InetAddress sourceAddress, final int port, final ByteBuffer bytes, final SyslogdConfig config) {
- if (sourceAddress == null) {
- throw new IllegalArgumentException("Source address cannot be null");
- } else if (bytes == null) {
- throw new IllegalArgumentException("Bytes cannot be null");
- } else if (config == null) {
- throw new IllegalArgumentException("Config cannot be null");
- }
-
- m_sourceAddress = sourceAddress;
- m_port = port;
- m_bytes = bytes;
- m_config = config;
- }
-
- @XmlAttribute
- @XmlJavaTypeAdapter(InetAddressXmlAdapter.class)
- public InetAddress getSourceAddress() {
- return m_sourceAddress;
- }
-
- public void setSourceAddress(InetAddress sourceAddress) {
- m_sourceAddress = sourceAddress;
- }
-
- @XmlAttribute
- public int getPort() {
- return m_port;
- }
-
- public void setPort(int port) {
- m_port = port;
- }
-
- public ByteBuffer getByteBuffer() {
- return m_bytes;
- }
-
- public void setByteBuffer(ByteBuffer bytes) {
- m_bytes = bytes;
- }
-
- @XmlAttribute
- public byte[] getBytes() {
- byte[] retval = new byte[m_bytes.remaining()];
- m_bytes.get(retval);
- m_bytes.rewind();
- return retval;
- }
-
- public void setBytes(byte[] bytes) {
- m_bytes = ByteBuffer.wrap(bytes);
- }
-
- public SyslogdConfig getConfig() {
- return m_config;
- }
-
- public void setConfig(SyslogdConfig config) {
- m_config = config;
- }
-
- @Override
- public SyslogProcessor call() {
-
- try {
- LOG.debug("Converting syslog message into event ({} bytes)", m_bytes.remaining());
-
- /***
-
- THIS CALL NO LONGER FUNCTIONS AFTER BEING COPIED INTO TRAPD
-
- // TODO: Change to a static call?
- ConvertToEvent re = new ConvertToEvent(
- m_sourceAddress,
- m_port,
- // Decode the packet content as ASCII
- // TODO: Support more character encodings?
- StandardCharsets.US_ASCII.decode(m_bytes).toString(),
- m_config
- );
-
- LOG.debug("Sending syslog event to the SyslogProcessor queue");
-
- return new SyslogProcessor(re.getEvent(), m_config.getNewSuspectOnMessage());
- ***/
-
- return null;
-
- } catch (final Throwable e) {
- LOG.debug("Message discarded, returning without enqueueing event.", e);
- }
- return null;
- }
-
- private static DatagramPacket copyPacket(final DatagramPacket packet) {
- byte[] message = new byte[packet.getLength()];
- System.arraycopy(packet.getData(), 0, message, 0, packet.getLength());
- InetAddress addr = null;
- try {
- addr = InetAddress.getByAddress(packet.getAddress().getHostName(), packet.getAddress().getAddress());
- DatagramPacket retPacket = new DatagramPacket(
- message,
- packet.getOffset(),
- packet.getLength(),
- addr,
- packet.getPort()
- );
- return retPacket;
- } catch (UnknownHostException e) {
- LOG.warn("unable to clone InetAddress object for {}", packet.getAddress());
- }
- return null;
- }
-
- public static DatagramPacket copyPacket(final InetAddress sourceAddress, final int sourcePort, final ByteBuffer buffer) {
- byte[] message = new byte[MAX_PACKET_SIZE];
- int i = 0;
- // Copy the buffer into the byte array
- while (buffer.hasRemaining()) {
- message[i++] = buffer.get();
- }
- return copyPacket(sourceAddress, sourcePort, message, i);
- }
-
- private static DatagramPacket copyPacket(final InetAddress sourceAddress, final int sourcePort, final byte[] buffer, final int length) {
- DatagramPacket retPacket = new DatagramPacket(
- buffer,
- 0,
- length,
- sourceAddress,
- sourcePort
- );
- return retPacket;
- }
-}
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerDefaultImpl.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerDefaultImpl.java
index cb3791c61cc4..521c8793946e 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerDefaultImpl.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapNotificationHandlerDefaultImpl.java
@@ -36,34 +36,31 @@
import org.opennms.netmgt.snmp.TrapNotification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
public class TrapNotificationHandlerDefaultImpl implements TrapNotificationHandler {
private static final Logger LOG = LoggerFactory.getLogger(TrapNotificationHandlerDefaultImpl.class);
/**
- * This is the number of threads that are used to parse syslog messages into
- * OpenNMS events.
+ * This is the number of threads that are used to process traps.
*
* TODO: Make this configurable
*/
- public static final int EVENT_PARSER_THREADS = Runtime.getRuntime().availableProcessors();
-
- /**
- * This is the number of threads that are used to broadcast the OpenNMS events.
- *
- * TODO: Make this configurable
- */
- public static final int EVENT_SENDER_THREADS = Runtime.getRuntime().availableProcessors();
+ public static final int TRAP_PROCESSOR_THREADS = Runtime.getRuntime().availableProcessors();
private final ExecutorFactory m_executorFactory = new ExecutorFactoryJavaImpl();
- private final ExecutorService m_syslogConnectionExecutor = m_executorFactory.newExecutor(EVENT_PARSER_THREADS, Integer.MAX_VALUE, "OpenNMS.Syslogd", "syslogConnections");
- private final ExecutorService m_syslogProcessorExecutor = m_executorFactory.newExecutor(EVENT_SENDER_THREADS, Integer.MAX_VALUE, "OpenNMS.Syslogd", "syslogProcessors");
+ private final ExecutorService m_processorExecutor = m_executorFactory.newExecutor(TRAP_PROCESSOR_THREADS, Integer.MAX_VALUE, "OpenNMS.Trapd", "trapProcessors");
+
+ @Autowired
+ private TrapQueueProcessorFactory m_processorFactory;
@Override
public void handleTrapNotification(final TrapNotification message) {
try {
- CompletableFuture.supplyAsync(message::call, m_syslogConnectionExecutor)
- .thenAcceptAsync(proc -> proc.call(), m_syslogProcessorExecutor);
+ // Use the TrapQueueProcessorFactory to construct a TrapQueueProcessor
+ TrapQueueProcessor processor = m_processorFactory.getInstance(message);
+ // Call the processor asynchronously
+ CompletableFuture.supplyAsync(processor::call, m_processorExecutor);
} catch (Throwable e) {
LOG.error("Task execution failed in {}", this.getClass().getSimpleName(), e);
}
From 4f0939405b68bd80ce44afcae8475081f0ae5aaa Mon Sep 17 00:00:00 2001
From: Pradeep S
Date: Mon, 21 Mar 2016 11:12:08 +0530
Subject: [PATCH 08/79] HZN-629: created blueprint file and junit
---
.../events/traps/blueprint-trapd-listener.xml | 33 ++++++
features/events/traps/pom.xml | 6 +
.../trapd/TrapdListenerBlueprintIT.java | 104 ++++++++++++++++++
3 files changed, 143 insertions(+)
create mode 100644 features/events/traps/blueprint-trapd-listener.xml
create mode 100644 features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapdListenerBlueprintIT.java
diff --git a/features/events/traps/blueprint-trapd-listener.xml b/features/events/traps/blueprint-trapd-listener.xml
new file mode 100644
index 000000000000..b427bf34f6d8
--- /dev/null
+++ b/features/events/traps/blueprint-trapd-listener.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/features/events/traps/pom.xml b/features/events/traps/pom.xml
index d346006fa361..834fc1148bec 100644
--- a/features/events/traps/pom.xml
+++ b/features/events/traps/pom.xml
@@ -122,5 +122,11 @@
org.opennms.features.collection.persistence.rrdtest
+
+ org.opennms.dependencies
+ camel-test-dependencies
+ pom
+ test
+
diff --git a/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapdListenerBlueprintIT.java b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapdListenerBlueprintIT.java
new file mode 100644
index 000000000000..dfa27ca67081
--- /dev/null
+++ b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapdListenerBlueprintIT.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2016-2016 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2016 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import java.util.Dictionary;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
+import org.apache.camel.util.KeyValueHolder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opennms.core.test.OpenNMSJUnit4ClassRunner;
+import org.opennms.netmgt.snmp.TrapNotification;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.test.context.ContextConfiguration;
+
+@RunWith(OpenNMSJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:/META-INF/opennms/emptyContext.xml" })
+public class TrapdListenerBlueprintIT extends CamelBlueprintTestSupport {
+
+ private static final Logger LOG = LoggerFactory.getLogger(TrapdListenerBlueprintIT.class);
+
+ /**
+ * Use Aries Blueprint synchronous mode to avoid a blueprint deadlock bug.
+ *
+ * @see https://issues.apache.org/jira/browse/ARIES-1051
+ * @see https://access.redhat.com/site/solutions/640943
+ */
+ @Override
+ public void doPreSetup() throws Exception {
+ System.setProperty("org.apache.aries.blueprint.synchronous", Boolean.TRUE.toString());
+ System.setProperty("de.kalpatec.pojosr.framework.events.sync", Boolean.TRUE.toString());
+ }
+
+ @Override
+ public boolean isUseAdviceWith() {
+ return true;
+ }
+
+ @Override
+ public boolean isUseDebugger() {
+ // must enable debugger
+ return true;
+ }
+
+ @Override
+ public String isMockEndpoints() {
+ return "*";
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ protected void addServicesOnStartup(Map> services) {
+ // Register any mock OSGi services here
+ services.put(TrapNotificationHandler.class.getName(), new KeyValueHolder
+
+
+
+
+
+
From 82fd803570c6217a0e9feed33d3e9b7a869fa538 Mon Sep 17 00:00:00 2001
From: Pavan Kumar RP
Date: Wed, 23 Mar 2016 12:29:42 -0400
Subject: [PATCH 11/79] HZN-632: Create blueprint-trapd-handler-default.xml.
JUNIT test case modifications for the blueprint. Moved trap processor
creation to the TrapdHandlerDefaultIT. Renamed the TrapdIpManagerDaoImplIT to
be consistent with the TrapdIpManagerDaoImpl class. Added creation of the
SNMP V2 in test used proper format and pom format change.
---
.../traps/blueprint-trapd-handler-default.xml | 61 ++++
features/events/traps/pom.xml | 46 +++
...ocessor.java => TrapdConfigProcessor.java} | 19 +-
.../netmgt/trapd/TrapdHandlerDefaultIT.java | 298 ++++++++++++++++++
...grIT.java => TrapdIpManagerDaoImplIT.java} | 2 +-
.../blueprint-empty-camel-context.xml | 4 +-
6 files changed, 419 insertions(+), 11 deletions(-)
create mode 100644 features/events/traps/blueprint-trapd-handler-default.xml
rename features/events/traps/src/main/java/org/opennms/netmgt/trapd/{SyslogdConfigProcessor.java => TrapdConfigProcessor.java} (74%)
create mode 100644 features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapdHandlerDefaultIT.java
rename features/events/traps/src/test/java/org/opennms/netmgt/trapd/{HibernateTrapdIpMgrIT.java => TrapdIpManagerDaoImplIT.java} (98%)
diff --git a/features/events/traps/blueprint-trapd-handler-default.xml b/features/events/traps/blueprint-trapd-handler-default.xml
new file mode 100644
index 000000000000..54cba86d342e
--- /dev/null
+++ b/features/events/traps/blueprint-trapd-handler-default.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/features/events/traps/pom.xml b/features/events/traps/pom.xml
index 834fc1148bec..4e75a9477054 100644
--- a/features/events/traps/pom.xml
+++ b/features/events/traps/pom.xml
@@ -128,5 +128,51 @@
pomtest
+
+ org.mockito
+ mockito-all
+ 1.10.19
+ test
+
+
+ org.apache.activemq
+ activemq-camel
+ ${activemqVersion}
+ test
+
+
+ javax.xml.bind
+ jaxb-api
+
+
+ com.sun.xml.bind
+ jaxb-impl
+
+
+ commons-logging
+ commons-logging
+
+
+ org.springframework
+ spring-beans
+
+
+ org.springframework
+ spring-context
+
+
+ org.springframework
+ spring-jms
+
+
+ org.springframework
+ spring-aop
+
+
+ org.springframework
+ spring-tx
+
+
+
diff --git a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogdConfigProcessor.java b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdConfigProcessor.java
similarity index 74%
rename from features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogdConfigProcessor.java
rename to features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdConfigProcessor.java
index 7b641d5b43cd..be4abb4b55f5 100644
--- a/features/events/traps/src/main/java/org/opennms/netmgt/trapd/SyslogdConfigProcessor.java
+++ b/features/events/traps/src/main/java/org/opennms/netmgt/trapd/TrapdConfigProcessor.java
@@ -28,25 +28,26 @@
package org.opennms.netmgt.trapd;
-import org.opennms.netmgt.config.SyslogdConfig;
+import org.opennms.netmgt.config.TrapdConfig;
+import org.opennms.netmgt.snmp.TrapNotification;
/**
- * This processor will update the {@link SyslogdConfig} on a
- * {@link SyslogConnection} so that it can be processed according
+ * This processor will update the {@link TrapdConfig} on a
+ * {@link TrapQueueProcessor} so that it can be processed according
* to the new configuration.
*
* @author Seth
*/
-public class SyslogdConfigProcessor {
+public class TrapdConfigProcessor {
- private final SyslogdConfig m_config;
+ private final TrapdConfig m_config;
- public SyslogdConfigProcessor(SyslogdConfig config) {
+ public TrapdConfigProcessor(TrapdConfig config) {
m_config = config;
}
- public SyslogConnection process(SyslogConnection connection) {
- connection.setConfig(m_config);
- return connection;
+ public TrapNotification process(TrapNotification trapNotification) {
+
+ return trapNotification;
}
}
diff --git a/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapdHandlerDefaultIT.java b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapdHandlerDefaultIT.java
new file mode 100644
index 000000000000..e4d88a7a2c8e
--- /dev/null
+++ b/features/events/traps/src/test/java/org/opennms/netmgt/trapd/TrapdHandlerDefaultIT.java
@@ -0,0 +1,298 @@
+/*******************************************************************************
+ * This file is part of OpenNMS(R).
+ *
+ * Copyright (C) 2016-2016 The OpenNMS Group, Inc.
+ * OpenNMS(R) is Copyright (C) 1999-2016 The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
+ *
+ * OpenNMS(R) is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
+ *
+ * OpenNMS(R) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with OpenNMS(R). If not, see:
+ * http://www.gnu.org/licenses/
+ *
+ * For more information contact:
+ * OpenNMS(R) Licensing
+ * http://www.opennms.org/
+ * http://www.opennms.com/
+ *******************************************************************************/
+
+package org.opennms.netmgt.trapd;
+
+import java.net.InetAddress;
+import java.util.Dictionary;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.activemq.broker.BrokerService;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
+import org.apache.camel.util.KeyValueHolder;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.MockitoAnnotations;
+import org.opennms.core.test.OpenNMSJUnit4ClassRunner;
+import org.opennms.core.test.db.annotations.JUnitTemporaryDatabase;
+import org.opennms.core.utils.InetAddressUtils;
+import org.opennms.netmgt.config.TrapdConfig;
+import org.opennms.netmgt.config.api.EventConfDao;
+import org.opennms.netmgt.snmp.SnmpObjId;
+import org.opennms.netmgt.snmp.SnmpValue;
+import org.opennms.netmgt.snmp.TrapIdentity;
+import org.opennms.netmgt.snmp.TrapNotification;
+import org.opennms.netmgt.snmp.TrapProcessor;
+import org.opennms.netmgt.snmp.snmp4j.Snmp4JTrapNotifier;
+import org.opennms.test.JUnitConfigurationEnvironment;
+import org.opennms.test.mock.EasyMockUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.snmp4j.PDU;
+import org.snmp4j.mp.SnmpConstants;
+import org.snmp4j.smi.IpAddress;
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.OctetString;
+import org.snmp4j.smi.TimeTicks;
+import org.snmp4j.smi.VariableBinding;
+import org.springframework.test.context.ContextConfiguration;
+
+@RunWith(OpenNMSJUnit4ClassRunner.class)
+@ContextConfiguration(locations = { "classpath:/META-INF/opennms/emptyContext.xml" })
+@JUnitConfigurationEnvironment
+@JUnitTemporaryDatabase
+public class TrapdHandlerDefaultIT extends CamelBlueprintTestSupport {
+
+ private boolean mockInitialized = false;
+
+ private static final Logger LOG = LoggerFactory.getLogger(TrapdHandlerDefaultIT.class);
+
+ private static BrokerService m_broker = null;
+
+ private EasyMockUtils m_mocks = new EasyMockUtils();
+
+ private EventConfDao m_eventConfDao = m_mocks
+ .createMock(EventConfDao.class);
+
+ /**
+ * Use Aries Blueprint synchronous mode to avoid a blueprint deadlock bug.
+ *
+ * @see https://issues.apache.org/jira/browse/ARIES-1051
+ * @see https://access.redhat.com/site/solutions/640943
+ */
+ @Override
+ public void doPreSetup() throws Exception {
+ System.setProperty("org.apache.aries.blueprint.synchronous",
+ Boolean.TRUE.toString());
+ System.setProperty("de.kalpatec.pojosr.framework.events.sync",
+ Boolean.TRUE.toString());
+
+ if (!mockInitialized) {
+ MockitoAnnotations.initMocks(this);
+ mockInitialized = true;
+ }
+ }
+
+ @Override
+ public boolean isUseAdviceWith() {
+ return true;
+ }
+
+ @Override
+ public boolean isUseDebugger() {
+ // must enable debugger
+ return true;
+ }
+
+ @Override
+ public String isMockEndpoints() {
+ return "*";
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ protected void addServicesOnStartup(
+ Map> services) {
+ // Create a mock SyslogdConfig
+ TrapdConfigBean config = new TrapdConfigBean();
+ config.setSnmpTrapPort(10514);
+ config.setSnmpTrapAddress("127.0.0.1");
+ config.setNewSuspectOnTrap(false);
+
+ services.put(
+ TrapdConfig.class.getName(),
+ new KeyValueHolder