You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2023/05/16 14:54:11 UTC
[camel] branch camel-3.18.x updated: CAMEL-19298 Snmp: version 3 is not supported for several actions for the component (#10106)
This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-3.18.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-3.18.x by this push:
new 2ba8932b0cb CAMEL-19298 Snmp: version 3 is not supported for several actions for the component (#10106)
2ba8932b0cb is described below
commit 2ba8932b0cbcb7d9adedaf31e6173561b322f225
Author: JiriOndrusek <on...@gmail.com>
AuthorDate: Tue May 16 16:54:04 2023 +0200
CAMEL-19298 Snmp: version 3 is not supported for several actions for the component (#10106)
---
components/camel-snmp/pom.xml | 6 +
.../apache/camel/component/snmp/SnmpHelper.java | 192 +++++++++++++++++++
.../apache/camel/component/snmp/SnmpOIDPoller.java | 126 +------------
.../apache/camel/component/snmp/SnmpProducer.java | 28 ++-
.../camel/component/snmp/SnmpTrapProducer.java | 20 +-
.../camel/component/snmp/AbstractTrapTest.java | 73 --------
.../apache/camel/component/snmp/PollOIDTest.java | 56 +++---
.../apache/camel/component/snmp/ProducerTest.java | 50 +++--
.../component/snmp/SnmpRespondTestSupport.java | 204 +++++++++++++++++++++
.../camel/component/snmp/SnmpTestSupport.java | 29 +++
.../camel/component/snmp/Snmpv1TrapTest.java | 73 --------
.../camel/component/snmp/Snmpv2TrapTest.java | 75 --------
.../org/apache/camel/component/snmp/TrapTest.java | 128 +++++++++++++
.../apache/camel/component/snmp/WalkOIDTest.java | 55 +++---
14 files changed, 664 insertions(+), 451 deletions(-)
diff --git a/components/camel-snmp/pom.xml b/components/camel-snmp/pom.xml
index f01a8ead461..b202bced05f 100644
--- a/components/camel-snmp/pom.xml
+++ b/components/camel-snmp/pom.xml
@@ -62,6 +62,12 @@
<artifactId>log4j-slf4j-impl</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.awaitility</groupId>
+ <artifactId>awaitility</artifactId>
+ <version>${awaitility-version}</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
</project>
diff --git a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpHelper.java b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpHelper.java
new file mode 100644
index 00000000000..959a8d7bad8
--- /dev/null
+++ b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpHelper.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.snmp;
+
+import org.snmp4j.CommunityTarget;
+import org.snmp4j.PDU;
+import org.snmp4j.PDUv1;
+import org.snmp4j.ScopedPDU;
+import org.snmp4j.Target;
+import org.snmp4j.UserTarget;
+import org.snmp4j.mp.MPv3;
+import org.snmp4j.mp.SnmpConstants;
+import org.snmp4j.security.AuthMD5;
+import org.snmp4j.security.AuthSHA;
+import org.snmp4j.security.Priv3DES;
+import org.snmp4j.security.PrivAES128;
+import org.snmp4j.security.PrivAES192;
+import org.snmp4j.security.PrivAES256;
+import org.snmp4j.security.PrivDES;
+import org.snmp4j.security.SecurityModels;
+import org.snmp4j.security.SecurityProtocols;
+import org.snmp4j.security.USM;
+import org.snmp4j.security.UsmUser;
+import org.snmp4j.smi.GenericAddress;
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.OctetString;
+
+final class SnmpHelper {
+
+ private SnmpHelper() {
+ }
+
+ static PDU createPDU(SnmpEndpoint endpoint) {
+ switch (endpoint.getSnmpVersion()) {
+ case SnmpConstants.version1:
+ case SnmpConstants.version2c:
+ return createPDU(endpoint.getSnmpVersion());
+ case SnmpConstants.version3:
+ return createScopedPDU(endpoint);
+ default:
+ return null;
+ }
+ }
+
+ static PDU createPDU(int version) {
+ switch (version) {
+ case SnmpConstants.version1:
+ return new PDUv1();
+ case SnmpConstants.version2c:
+ return new PDU();
+ case SnmpConstants.version3:
+ return createScopedPDU(null);
+ default:
+ return null;
+ }
+ }
+
+ static Target createTarget(SnmpEndpoint endpoint) {
+ switch (endpoint.getSnmpVersion()) {
+ case SnmpConstants.version1:
+ case SnmpConstants.version2c:
+ return createCommunityTarget(endpoint);
+ case SnmpConstants.version3:
+ return createUserTarget(endpoint);
+ default:
+ return null;
+ }
+ }
+
+ static USM createAndSetUSM(SnmpEndpoint endpoint) {
+ switch (endpoint.getSnmpVersion()) {
+ case SnmpConstants.version3:
+ return internalCreateAndSetUSM(endpoint);
+ default:
+ return null;
+ }
+ }
+
+ private static USM internalCreateAndSetUSM(SnmpEndpoint endpoint) {
+ if (endpoint.getSecurityName() == null) {
+ throw new IllegalArgumentException("SecurityNme is required for SNMP v3");
+ }
+
+ USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
+ SecurityModels.getInstance().addSecurityModel(usm);
+
+ OID authProtocol = convertAuthenticationProtocol(endpoint.getAuthenticationProtocol());
+
+ OctetString authPwd = convertToOctetString(endpoint.getAuthenticationPassphrase());
+
+ OID privProtocol = convertPrivacyProtocol(endpoint.getPrivacyProtocol());
+
+ OctetString privPwd = convertToOctetString(endpoint.getPrivacyPassphrase());
+
+ UsmUser user = new UsmUser(
+ convertToOctetString(endpoint.getSecurityName()), authProtocol, authPwd, privProtocol, privPwd);
+
+ usm.addUser(convertToOctetString(endpoint.getSecurityName()), user);
+
+ return usm;
+ }
+
+ private static ScopedPDU createScopedPDU(SnmpEndpoint endpoint) {
+ ScopedPDU scopedPDU = new ScopedPDU();
+ if (endpoint != null && endpoint.getSnmpContextEngineId() != null) {
+ scopedPDU.setContextEngineID(convertToOctetString(endpoint.getSnmpContextEngineId()));
+ }
+ if (endpoint != null && endpoint.getSnmpContextName() != null) {
+ scopedPDU.setContextName(convertToOctetString(endpoint.getSnmpContextName()));
+ }
+
+ return scopedPDU;
+ }
+
+ private static CommunityTarget createCommunityTarget(SnmpEndpoint endpoint) {
+ CommunityTarget communityTarget = new CommunityTarget();
+
+ communityTarget.setCommunity(convertToOctetString(endpoint.getSnmpCommunity()));
+ communityTarget.setAddress(GenericAddress.parse(endpoint.getAddress()));
+ communityTarget.setRetries(endpoint.getRetries());
+ communityTarget.setTimeout(endpoint.getTimeout());
+ communityTarget.setVersion(endpoint.getSnmpVersion());
+
+ return communityTarget;
+ }
+
+ private static UserTarget createUserTarget(SnmpEndpoint endpoint) {
+ UserTarget userTarget = new UserTarget();
+
+ userTarget.setSecurityLevel(endpoint.getSecurityLevel());
+ userTarget.setSecurityName(convertToOctetString(endpoint.getSecurityName()));
+ userTarget.setAddress(GenericAddress.parse(endpoint.getAddress()));
+ userTarget.setRetries(endpoint.getRetries());
+ userTarget.setTimeout(endpoint.getTimeout());
+ userTarget.setVersion(endpoint.getSnmpVersion());
+
+ return userTarget;
+ }
+
+ private static OctetString convertToOctetString(String value) {
+ if (value == null) {
+ return null;
+ }
+ return new OctetString(value);
+ }
+
+ private static OID convertAuthenticationProtocol(String authenticationProtocol) {
+ if (authenticationProtocol == null) {
+ return null;
+ }
+ if ("MD5".equals(authenticationProtocol)) {
+ return AuthMD5.ID;
+ } else if ("SHA1".equals(authenticationProtocol)) {
+ return AuthSHA.ID;
+ } else {
+ throw new IllegalArgumentException("Unknown authentication protocol: " + authenticationProtocol);
+ }
+ }
+
+ private static OID convertPrivacyProtocol(String privacyProtocol) {
+ if (privacyProtocol == null) {
+ return null;
+ }
+ if ("DES".equals(privacyProtocol)) {
+ return PrivDES.ID;
+ } else if ("TRIDES".equals(privacyProtocol)) {
+ return Priv3DES.ID;
+ } else if ("AES128".equals(privacyProtocol)) {
+ return PrivAES128.ID;
+ } else if ("AES192".equals(privacyProtocol)) {
+ return PrivAES192.ID;
+ } else if ("AES256".equals(privacyProtocol)) {
+ return PrivAES256.ID;
+ } else {
+ throw new IllegalArgumentException("Unknown privacy protocol: " + privacyProtocol);
+ }
+ }
+}
diff --git a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpOIDPoller.java b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpOIDPoller.java
index 0d715be65b5..d9b1110f7d2 100644
--- a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpOIDPoller.java
+++ b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpOIDPoller.java
@@ -23,32 +23,15 @@ import org.apache.camel.Processor;
import org.apache.camel.support.ScheduledPollConsumer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
-import org.snmp4j.ScopedPDU;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
-import org.snmp4j.UserTarget;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
-import org.snmp4j.mp.MPv3;
-import org.snmp4j.mp.SnmpConstants;
-import org.snmp4j.security.AuthMD5;
-import org.snmp4j.security.AuthSHA;
-import org.snmp4j.security.Priv3DES;
-import org.snmp4j.security.PrivAES128;
-import org.snmp4j.security.PrivAES192;
-import org.snmp4j.security.PrivAES256;
-import org.snmp4j.security.PrivDES;
-import org.snmp4j.security.SecurityModels;
-import org.snmp4j.security.SecurityProtocols;
-import org.snmp4j.security.USM;
-import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
-import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
@@ -89,59 +72,9 @@ public class SnmpOIDPoller extends ScheduledPollConsumer implements ResponseList
}
this.snmp = new Snmp(this.transport);
-
- if (SnmpConstants.version3 == endpoint.getSnmpVersion()) {
- UserTarget userTarget = new UserTarget();
-
- userTarget.setSecurityLevel(endpoint.getSecurityLevel());
- userTarget.setSecurityName(convertToOctetString(endpoint.getSecurityName()));
- userTarget.setAddress(targetAddress);
- userTarget.setRetries(endpoint.getRetries());
- userTarget.setTimeout(endpoint.getTimeout());
- userTarget.setVersion(endpoint.getSnmpVersion());
-
- this.target = userTarget;
-
- USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
- SecurityModels.getInstance().addSecurityModel(usm);
-
- OID authProtocol = convertAuthenticationProtocol(endpoint.getAuthenticationProtocol());
-
- OctetString authPwd = convertToOctetString(endpoint.getAuthenticationPassphrase());
-
- OID privProtocol = convertPrivacyProtocol(endpoint.getPrivacyProtocol());
-
- OctetString privPwd = convertToOctetString(endpoint.getPrivacyPassphrase());
-
- UsmUser user = new UsmUser(
- convertToOctetString(endpoint.getSecurityName()), authProtocol, authPwd, privProtocol, privPwd);
-
- usm.addUser(convertToOctetString(endpoint.getSecurityName()), user);
-
- ScopedPDU scopedPDU = new ScopedPDU();
-
- if (endpoint.getSnmpContextEngineId() != null) {
- scopedPDU.setContextEngineID(new OctetString(endpoint.getSnmpContextEngineId()));
- }
-
- if (endpoint.getSnmpContextName() != null) {
- scopedPDU.setContextName(new OctetString(endpoint.getSnmpContextName()));
- }
-
- this.pdu = scopedPDU;
- } else {
- CommunityTarget communityTarget = new CommunityTarget();
-
- communityTarget.setCommunity(convertToOctetString(endpoint.getSnmpCommunity()));
- communityTarget.setAddress(targetAddress);
- communityTarget.setRetries(endpoint.getRetries());
- communityTarget.setTimeout(endpoint.getTimeout());
- communityTarget.setVersion(endpoint.getSnmpVersion());
-
- this.target = communityTarget;
-
- this.pdu = new PDU();
- }
+ SnmpHelper.createAndSetUSM(endpoint);
+ this.pdu = SnmpHelper.createPDU(endpoint);
+ this.target = SnmpHelper.createTarget(endpoint);
// listen to the transport
if (LOG.isDebugEnabled()) {
@@ -247,59 +180,6 @@ public class SnmpOIDPoller extends ScheduledPollConsumer implements ResponseList
}
}
- /**
- * * @return Returns the target.
- */
- public Target getTarget() {
- return this.target;
- }
-
- /**
- * @param target The target to set.
- */
- public void setTarget(Target target) {
- this.target = target;
- }
-
- private OctetString convertToOctetString(String value) {
- if (value == null) {
- return null;
- }
- return new OctetString(value);
- }
-
- private OID convertAuthenticationProtocol(String authenticationProtocol) {
- if (authenticationProtocol == null) {
- return null;
- }
- if ("MD5".equals(authenticationProtocol)) {
- return AuthMD5.ID;
- } else if ("SHA1".equals(authenticationProtocol)) {
- return AuthSHA.ID;
- } else {
- throw new IllegalArgumentException("Unknown authentication protocol: " + authenticationProtocol);
- }
- }
-
- private OID convertPrivacyProtocol(String privacyProtocol) {
- if (privacyProtocol == null) {
- return null;
- }
- if ("DES".equals(privacyProtocol)) {
- return PrivDES.ID;
- } else if ("TRIDES".equals(privacyProtocol)) {
- return Priv3DES.ID;
- } else if ("AES128".equals(privacyProtocol)) {
- return PrivAES128.ID;
- } else if ("AES192".equals(privacyProtocol)) {
- return PrivAES192.ID;
- } else if ("AES256".equals(privacyProtocol)) {
- return PrivAES256.ID;
- } else {
- throw new IllegalArgumentException("Unknown privacy protocol: " + privacyProtocol);
- }
- }
-
private int getPduType(SnmpActionType type) {
if (SnmpActionType.GET_NEXT == type) {
return PDU.GETNEXT;
diff --git a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java
index 7c7fd1b846e..81754956d9c 100644
--- a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java
+++ b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java
@@ -25,20 +25,18 @@ import org.apache.camel.Exchange;
import org.apache.camel.support.DefaultProducer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
+import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
-import org.snmp4j.mp.MPv3;
+import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.SecurityModels;
-import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.OID;
-import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
@@ -54,7 +52,7 @@ public class SnmpProducer extends DefaultProducer {
private Address targetAddress;
private USM usm;
- private CommunityTarget target;
+ private Target target;
private SnmpActionType actionType;
private PDU pdu;
@@ -71,18 +69,10 @@ public class SnmpProducer extends DefaultProducer {
this.targetAddress = GenericAddress.parse(this.endpoint.getAddress());
LOG.debug("targetAddress: {}", targetAddress);
- this.usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
- SecurityModels.getInstance().addSecurityModel(this.usm);
+ this.usm = SnmpHelper.createAndSetUSM(endpoint);
+ this.pdu = SnmpHelper.createPDU(endpoint);
+ this.target = SnmpHelper.createTarget(endpoint);
- // setting up target
- this.target = new CommunityTarget();
- this.target.setCommunity(new OctetString(endpoint.getSnmpCommunity()));
- this.target.setAddress(this.targetAddress);
- this.target.setRetries(this.endpoint.getRetries());
- this.target.setTimeout(this.endpoint.getTimeout());
- this.target.setVersion(this.endpoint.getSnmpVersion());
-
- this.pdu = new PDU();
// in here,only POLL do set the oids
if (this.actionType == SnmpActionType.POLL) {
for (OID oid : this.endpoint.getOids()) {
@@ -91,13 +81,16 @@ public class SnmpProducer extends DefaultProducer {
}
this.pdu.setErrorIndex(0);
this.pdu.setErrorStatus(0);
- this.pdu.setMaxRepetitions(0);
+ if (endpoint.getSnmpVersion() > SnmpConstants.version1) {
+ this.pdu.setMaxRepetitions(0);
+ }
// support POLL and GET_NEXT
if (this.actionType == SnmpActionType.GET_NEXT) {
this.pdu.setType(PDU.GETNEXT);
} else {
this.pdu.setType(PDU.GET);
}
+
}
@Override
@@ -194,4 +187,5 @@ public class SnmpProducer extends DefaultProducer {
}
}
} //end process
+
}
diff --git a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpTrapProducer.java b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpTrapProducer.java
index 034fec6e5ee..265379ceab9 100644
--- a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpTrapProducer.java
+++ b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpTrapProducer.java
@@ -20,19 +20,16 @@ import org.apache.camel.Exchange;
import org.apache.camel.support.DefaultProducer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
+import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
-import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.SecurityModels;
-import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.Integer32;
-import org.snmp4j.smi.OctetString;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
@@ -47,7 +44,7 @@ public class SnmpTrapProducer extends DefaultProducer {
private Address targetAddress;
private USM usm;
- private CommunityTarget target;
+ private Target target;
public SnmpTrapProducer(SnmpEndpoint endpoint) {
super(endpoint);
@@ -61,16 +58,8 @@ public class SnmpTrapProducer extends DefaultProducer {
this.targetAddress = GenericAddress.parse(this.endpoint.getAddress());
LOG.debug("targetAddress: {}", targetAddress);
- this.usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
- SecurityModels.getInstance().addSecurityModel(this.usm);
-
- // setting up target
- this.target = new CommunityTarget();
- this.target.setCommunity(new OctetString(endpoint.getSnmpCommunity()));
- this.target.setAddress(this.targetAddress);
- this.target.setRetries(this.endpoint.getRetries());
- this.target.setTimeout(this.endpoint.getTimeout());
- this.target.setVersion(this.endpoint.getSnmpVersion());
+ this.usm = SnmpHelper.createAndSetUSM(endpoint);
+ this.target = SnmpHelper.createTarget(endpoint);
}
@Override
@@ -117,7 +106,6 @@ public class SnmpTrapProducer extends DefaultProducer {
trap.setType(PDU.TRAP);
trap.setMaxRepetitions(0);
}
-
LOG.debug("SnmpTrap: sending");
snmp.send(trap, this.target);
LOG.debug("SnmpTrap: sent");
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/AbstractTrapTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/AbstractTrapTest.java
deleted file mode 100644
index b955596d0b2..00000000000
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/AbstractTrapTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.snmp;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.apache.camel.Endpoint;
-import org.apache.camel.Exchange;
-import org.apache.camel.Producer;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.snmp4j.PDU;
-import org.snmp4j.smi.VariableBinding;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-public abstract class AbstractTrapTest extends CamelTestSupport {
- private static final Logger LOG = LoggerFactory.getLogger(AbstractTrapTest.class);
-
- protected abstract PDU createTrap();
-
- @Test
- public void testSendReceiveTraps() throws Exception {
- PDU trap = createTrap();
-
- // Send it
- LOG.info("Sending pdu " + trap);
- Endpoint endpoint = context.getEndpoint("direct:snmptrap");
- Exchange exchange = endpoint.createExchange();
- exchange.getIn().setBody(trap);
- Producer producer = endpoint.createProducer();
- producer.process(exchange);
-
- synchronized (this) {
- Thread.sleep(1000);
- }
-
- // If all goes right it should come here
- MockEndpoint mock = getMockEndpoint("mock:result");
- mock.expectedMessageCount(1);
- mock.assertIsSatisfied();
-
- List<Exchange> exchanges = mock.getExchanges();
- SnmpMessage msg = (SnmpMessage) exchanges.get(0).getIn();
- PDU receivedTrap = msg.getSnmpMessage();
- assertEquals(trap, receivedTrap);
- if (LOG.isInfoEnabled()) {
- LOG.info("Received SNMP TRAP:");
- Vector<? extends VariableBinding> variableBindings = receivedTrap.getVariableBindings();
- for (VariableBinding vb : variableBindings) {
- LOG.info(" " + vb.toString());
- }
- }
- }
-}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/PollOIDTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/PollOIDTest.java
index 3ebe0e57a0e..3e02c5205d0 100644
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/PollOIDTest.java
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/PollOIDTest.java
@@ -16,49 +16,45 @@
*/
package org.apache.camel.component.snmp;
-import java.util.List;
-
-import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.snmp4j.mp.SnmpConstants;
-public class PollOIDTest extends CamelTestSupport {
- private static final Logger LOG = LoggerFactory.getLogger(PollOIDTest.class);
+public class PollOIDTest extends SnmpRespondTestSupport {
- // a disabled test... before enabling you must fill in a working IP, Port
- // and maybe oids in the route below
- @Disabled
- @Test
- public void testOIDPolling() throws Exception {
- MockEndpoint mock = getMockEndpoint("mock:result");
+ @ParameterizedTest
+ @MethodSource("supportedVersions")
+ public void testOIDPolling(int version) throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:resultV" + version);
mock.expectedMinimumMessageCount(1);
mock.assertIsSatisfied();
- List<Exchange> oids = mock.getExchanges();
- if (LOG.isInfoEnabled()) {
- for (Exchange e : oids) {
- LOG.info("OID: " + e.getIn().getBody(String.class));
- }
- }
- }
- @Test
- public void testStartRoute() {
- // do nothing here , just make sure the camel route can started.
+ SnmpMessage snmpMessage = mock.getReceivedExchanges().get(0).getIn().getBody(SnmpMessage.class);
+ String responseToMatch = "My Printer - response #\\d+, using version: " + version;
+ String receivedMessage = snmpMessage.getSnmpMessage().getVariable(SnmpConstants.sysDescr).toString();
+ Assertions.assertTrue(receivedMessage.matches(responseToMatch),
+ "Expected string matching '" + responseToMatch + "'. Got: " + receivedMessage);
}
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
- // START SNIPPET: e1
- from("snmp:192.168.178.23:161?protocol=udp&type=POLL&oids=1.3.6.1.2.1.1.5.0")
- .transform(body().convertToString()).to("mock:result");
- // END SNIPPET: e1
+ from(String.format("snmp:%s?protocol=udp&type=POLL&snmpVersion=0&oids=%s&delay=100", getListeningAddress(),
+ SnmpConstants.sysName))
+ .to("mock:resultV0");
+
+ from(String.format("snmp:%s?protocol=udp&type=POLL&snmpVersion=1&oids=%s&delay=100", getListeningAddress(),
+ SnmpConstants.sysName))
+ .to("mock:resultV1");
+
+ from(String.format(
+ "snmp:%s?protocol=udp&type=POLL&snmpVersion=3&securityName=%s&securityLevel=1&oids=%s&delay=100",
+ getListeningAddress(), SECURITY_NAME, SnmpConstants.sysName))
+ .to("mock:resultV3");
}
};
}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java
index 78b10b2e8fc..99591e9d395 100644
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java
@@ -20,35 +20,53 @@ import java.util.concurrent.TimeUnit;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
+import org.awaitility.Awaitility;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.snmp4j.mp.SnmpConstants;
-@Disabled("CAMEL-10319: Set host, port and oids to test snmp producer.")
-public class ProducerTest extends CamelTestSupport {
+public class ProducerTest extends SnmpRespondTestSupport {
- private String host = "192.168.0.254";
- private String port = "161";
private String oids = "1.3.6.1.2.1.1.3.0,1.3.6.1.2.1.25.3.2.1.5.1,1.3.6.1.2.1.25.3.5.1.1.1,1.3.6.1.2.1.43.5.1.1.11.1";
- @Test
- public void testSnmpProducer() throws Exception {
- template.sendBody("direct:in", "");
+ @ParameterizedTest
+ @MethodSource("supportedVersions")
+ public void testSnmpProducer(int version) throws Exception {
+ template.sendBody("direct:inV" + version, "");
- MockEndpoint mock = getMockEndpoint("mock:result");
+ MockEndpoint mock = getMockEndpoint("mock:resultV" + version);
mock.expectedMinimumMessageCount(1);
- assertMockEndpointsSatisfied(5, TimeUnit.SECONDS);
+ // wait a bit
+ Awaitility.await().atMost(5, TimeUnit.SECONDS)
+ .untilAsserted(() -> mock.assertIsSatisfied());
+
+ SnmpMessage snmpMessage = mock.getReceivedExchanges().get(0).getIn().getBody(SnmpMessage.class);
+ String responseToMatch = "My Printer - response #\\d+, using version: " + version;
+ String receivedMessage = snmpMessage.getSnmpMessage().getVariable(SnmpConstants.sysDescr).toString();
+ Assertions.assertTrue(receivedMessage.matches(responseToMatch),
+ "Expected string matching '" + responseToMatch + "'. Got: " + receivedMessage);
}
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
- from("direct:in")
- .to("snmp://" + host + ":" + port + "?oids=" + oids)
- .log("${body}")
- .to("mock:result");
+ from("direct:inV0")
+ .to("snmp://" + getListeningAddress() + "?oids=" + oids)
+ .log("V0: ${body}")
+ .to("mock:resultV0");
+
+ from("direct:inV1")
+ .to("snmp://" + getListeningAddress() + "?snmpVersion=1&oids=" + oids)
+ .log("V0: ${body}")
+ .to("mock:resultV1");
+
+ from("direct:inV3")
+ .to("snmp://" + getListeningAddress() + "?securityName=test&securityLevel=1&snmpVersion=3&oids=" + oids)
+ .log("V0: ${body}")
+ .to("mock:resultV3");
}
};
}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpRespondTestSupport.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpRespondTestSupport.java
new file mode 100644
index 00000000000..2e0e38dc9e6
--- /dev/null
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpRespondTestSupport.java
@@ -0,0 +1,204 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.snmp;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Vector;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.TestInstance;
+import org.snmp4j.CommandResponder;
+import org.snmp4j.CommandResponderEvent;
+import org.snmp4j.MessageException;
+import org.snmp4j.PDU;
+import org.snmp4j.PDUv1;
+import org.snmp4j.ScopedPDU;
+import org.snmp4j.Snmp;
+import org.snmp4j.mp.CounterSupport;
+import org.snmp4j.mp.DefaultCounterListener;
+import org.snmp4j.mp.MPv3;
+import org.snmp4j.mp.SnmpConstants;
+import org.snmp4j.mp.StatusInformation;
+import org.snmp4j.security.AuthSHA;
+import org.snmp4j.security.SecurityModels;
+import org.snmp4j.security.SecurityProtocols;
+import org.snmp4j.security.USM;
+import org.snmp4j.security.UsmUser;
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.OctetString;
+import org.snmp4j.smi.UdpAddress;
+import org.snmp4j.smi.VariableBinding;
+import org.snmp4j.transport.DefaultUdpTransportMapping;
+
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class SnmpRespondTestSupport extends SnmpTestSupport {
+ static final String SECURITY_NAME = "test";
+ private static final String LOCAL_ADDRESS = "127.0.0.1/0";
+
+ Snmp snmpResponder;
+ String listeningAddress;
+
+ @BeforeAll
+ public void beforeAll() {
+ SecurityProtocols.getInstance().addDefaultProtocols();
+ DefaultUdpTransportMapping udpTransportMapping;
+ try {
+ udpTransportMapping = new DefaultUdpTransportMapping(new UdpAddress(LOCAL_ADDRESS));
+ snmpResponder = new Snmp(udpTransportMapping);
+
+ TestCommandResponder responder = new TestCommandResponder(snmpResponder);
+ snmpResponder.addCommandResponder(responder);
+
+ SecurityModels respSecModels = new SecurityModels() {
+ };
+
+ CounterSupport.getInstance().addCounterListener(new DefaultCounterListener());
+ MPv3 mpv3CR = (MPv3) snmpResponder.getMessageDispatcher().getMessageProcessingModel(MPv3.ID);
+ mpv3CR.setLocalEngineID(MPv3.createLocalEngineID(new OctetString("responder")));
+ respSecModels.addSecurityModel(new USM(
+ SecurityProtocols.getInstance(),
+ new OctetString(mpv3CR.getLocalEngineID()), 0));
+ mpv3CR.setSecurityModels(respSecModels);
+
+ snmpResponder.getUSM().addUser(
+ new UsmUser(
+ new OctetString(SECURITY_NAME), AuthSHA.ID, new OctetString("changeit"),
+ AuthSHA.ID, new OctetString("changeit")));
+
+ snmpResponder.listen();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ listeningAddress = udpTransportMapping.getListenAddress().toString().replaceFirst("/", ":");
+ }
+
+ @AfterAll
+ public void afterAll(/*ExtensionContext context*/) {
+ if (snmpResponder != null) {
+ try {
+ snmpResponder.close();
+ } catch (IOException e) {
+ //nothing
+ }
+ }
+ }
+
+ static class TestCommandResponder implements CommandResponder {
+
+ private final Snmp commandResponder;
+ private final Map<String, Integer> counts = new ConcurrentHashMap<>();
+
+ public TestCommandResponder(Snmp commandResponder) {
+ this.commandResponder = commandResponder;
+ }
+
+ @Override
+ public synchronized void processPdu(CommandResponderEvent event) {
+ PDU pdu = event.getPDU();
+ Vector<? extends VariableBinding> vbs;
+ if (pdu.getVariableBindings() != null) {
+ vbs = new Vector<>(pdu.getVariableBindings());
+ } else {
+ vbs = new Vector<>(0);
+ }
+ String key = vbs.stream().sequential().map(vb -> vb.getOid().toString()).collect(Collectors.joining(","));
+
+ int version;
+ //differ snmp versions
+ if (pdu instanceof PDUv1) {
+ version = SnmpConstants.version1;
+ key = "v1_" + key;
+ } else if (pdu instanceof ScopedPDU) {
+ version = SnmpConstants.version3;
+ key = "v3_" + key;
+ } else {
+ version = SnmpConstants.version2c;
+ key = "v2_" + key;
+ }
+ int numberOfSent = counts.getOrDefault(key, 0);
+
+ try {
+ PDU response = makeResponse(pdu, ++numberOfSent, version, vbs);
+ if (response != null) {
+ response.setRequestID(pdu.getRequestID());
+ commandResponder.getMessageDispatcher().returnResponsePdu(
+ event.getMessageProcessingModel(), event.getSecurityModel(),
+ event.getSecurityName(), event.getSecurityLevel(),
+ response, event.getMaxSizeResponsePDU(),
+ event.getStateReference(), new StatusInformation());
+ }
+ } catch (MessageException e) {
+ Assertions.assertNull(e);
+ }
+ counts.put(key, numberOfSent);
+ }
+
+ private PDU makeResponse(PDU originalPDU, int counter, int version, Vector<? extends VariableBinding> vbs) {
+ PDU responsePDU = (PDU) originalPDU.clone();
+ responsePDU.setType(PDU.RESPONSE);
+ responsePDU.setErrorStatus(PDU.noError);
+ responsePDU.setErrorIndex(0);
+ if (vbs.isEmpty()) {
+ VariableBinding vb = generateResponseBinding(counter, version, SnmpConstants.sysDescr);
+ if (vb != null) {
+ responsePDU.add(vb);
+ }
+ } else {
+ vbs.stream().forEach(vb -> responsePDU.add(generateResponseBinding(counter, version, vb.getOid())));
+ }
+ return responsePDU;
+ }
+
+ private VariableBinding generateResponseBinding(int counter, int version, OID oid) {
+ //real responses
+ //1.3.6.1.2.1.2.2.1.2 -> 1.3.6.1.2.1.2.2.1.2.1 = ether1
+ if ("1.3.6.1.2.1.2.2.1.2".equals(oid.toString())) {
+ return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.2.1"), new OctetString("ether1"));
+ }
+ //1.3.6.1.2.1.2.2.1.2.1 -> 1.3.6.1.2.1.2.2.1.2.2 = ether2
+ if ("1.3.6.1.2.1.2.2.1.2.1".equals(oid.toString())) {
+ return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.2.2"), new OctetString("ether2"));
+ }
+ //1.3.6.1.2.1.2.2.1.2.2 -> 1.3.6.1.2.1.2.2.1.2.3 = ether3
+ if ("1.3.6.1.2.1.2.2.1.2.2".equals(oid.toString())) {
+ return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.2.3"), new OctetString("ether3"));
+ }
+ //1.3.6.1.2.1.2.2.1.2.3 -> 1.3.6.1.2.1.2.2.1.2.4 = ether4
+ if ("1.3.6.1.2.1.2.2.1.2.3".equals(oid.toString())) {
+ return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.2.4"), new OctetString("ether4"));
+ }
+ //1.3.6.1.2.1.2.2.1.2.4 -> 1.3.6.1.2.1.2.2.1.3.1 = 6
+ if ("1.3.6.1.2.1.2.2.1.2.4".equals(oid.toString())) {
+ return new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.3.1"), new OctetString("6"));
+ }
+
+ return new VariableBinding(
+ SnmpConstants.sysDescr,
+ new OctetString("My Printer - response #" + counter + ", using version: " + version));
+ }
+ }
+
+ public String getListeningAddress() {
+ return listeningAddress;
+ }
+}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpTestSupport.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpTestSupport.java
new file mode 100644
index 00000000000..390eeb30d97
--- /dev/null
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/SnmpTestSupport.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.snmp;
+
+import java.util.stream.Stream;
+
+import org.apache.camel.test.junit5.CamelTestSupport;
+
+public class SnmpTestSupport extends CamelTestSupport {
+
+ static Stream<Integer> supportedVersions() {
+ return Stream.of(0, 1, 3);
+ }
+
+}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv1TrapTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv1TrapTest.java
deleted file mode 100644
index a740e9f27f9..00000000000
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv1TrapTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.snmp;
-
-import org.apache.camel.LoggingLevel;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.snmp4j.PDU;
-import org.snmp4j.PDUv1;
-import org.snmp4j.mp.SnmpConstants;
-import org.snmp4j.smi.OID;
-import org.snmp4j.smi.OctetString;
-import org.snmp4j.smi.TimeTicks;
-import org.snmp4j.smi.Variable;
-import org.snmp4j.smi.VariableBinding;
-
-public class Snmpv1TrapTest extends AbstractTrapTest {
-
- @Override
- public PDU createTrap() {
- PDUv1 trap = new PDUv1();
- trap.setGenericTrap(PDUv1.ENTERPRISE_SPECIFIC);
- trap.setSpecificTrap(1);
-
- OID oid = new OID("1.2.3.4.5");
- trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
- trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000))); // put your uptime here
- trap.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("System Description")));
- trap.setEnterprise(oid);
-
- //Add Payload
- Variable var = new OctetString("some string");
- trap.add(new VariableBinding(oid, var));
- return trap;
- }
-
- /**
- * RouteBuilders for the SNMP TRAP producer and consumer
- */
- @Override
- protected RoutesBuilder[] createRouteBuilders() {
- return new RoutesBuilder[] {
- new RouteBuilder() {
- public void configure() {
- from("direct:snmptrap")
- .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
- .to("snmp:127.0.0.1:1662?protocol=udp&type=TRAP&snmpVersion=0");
- }
- },
- new RouteBuilder() {
- public void configure() {
- from("snmp:0.0.0.0:1662?protocol=udp&type=TRAP&snmpVersion=0")
- .id("SnmpTrapConsumer")
- .to("mock:result");
- }
- }
- };
- }
-}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv2TrapTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv2TrapTest.java
deleted file mode 100644
index 1f210b2e8e8..00000000000
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/Snmpv2TrapTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.component.snmp;
-
-import org.apache.camel.LoggingLevel;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.snmp4j.PDU;
-import org.snmp4j.mp.SnmpConstants;
-import org.snmp4j.smi.OID;
-import org.snmp4j.smi.OctetString;
-import org.snmp4j.smi.TimeTicks;
-import org.snmp4j.smi.Variable;
-import org.snmp4j.smi.VariableBinding;
-
-/**
- * This test covers both producing and consuming snmp traps
- */
-public class Snmpv2TrapTest extends AbstractTrapTest {
-
- @Override
- protected PDU createTrap() {
- // Create a trap PDU
- PDU trap = new PDU();
- trap.setType(PDU.TRAP);
-
- OID oid = new OID("1.2.3.4.5");
- trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
- trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000))); // put your uptime here
- trap.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("System Description")));
-
- //Add Payload
- Variable var = new OctetString("some string");
- trap.add(new VariableBinding(oid, var));
-
- return trap;
- }
-
- /**
- * RouteBuilders for the SNMP TRAP producer and consumer
- */
- @Override
- protected RoutesBuilder[] createRouteBuilders() {
- return new RoutesBuilder[] {
- new RouteBuilder() {
- public void configure() {
- from("direct:snmptrap")
- .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
- .to("snmp:127.0.0.1:1662?protocol=udp&type=TRAP&snmpVersion=" + SnmpConstants.version2c);
- }
- },
- new RouteBuilder() {
- public void configure() {
- from("snmp:0.0.0.0:1662?protocol=udp&type=TRAP&snmpVersion=" + SnmpConstants.version2c)
- .id("SnmpTrapConsumer")
- .to("mock:result");
- }
- }
- };
- }
-}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/TrapTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/TrapTest.java
new file mode 100644
index 00000000000..71c79ce363e
--- /dev/null
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/TrapTest.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.snmp;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.LoggingLevel;
+import org.apache.camel.Message;
+import org.apache.camel.Producer;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.AvailablePortFinder;
+import org.awaitility.Awaitility;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.snmp4j.PDU;
+import org.snmp4j.PDUv1;
+import org.snmp4j.mp.SnmpConstants;
+import org.snmp4j.smi.OID;
+import org.snmp4j.smi.OctetString;
+import org.snmp4j.smi.TimeTicks;
+import org.snmp4j.smi.Variable;
+import org.snmp4j.smi.VariableBinding;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class TrapTest extends SnmpTestSupport {
+ private static final Logger LOG = LoggerFactory.getLogger(TrapTest.class);
+
+ @ParameterizedTest
+ @MethodSource("supportedVersions")
+ public void testSendReceiveTraps(int version) throws Exception {
+ PDU trap = createTrap(version);
+
+ // Send it
+ LOG.info("Sending pdu " + trap);
+ Endpoint endpoint = context.getEndpoint("direct:snmptrapV" + version);
+ Exchange exchange = endpoint.createExchange();
+ exchange.getIn().setBody(trap);
+ Producer producer = endpoint.createProducer();
+ producer.process(exchange);
+
+ // If all goes right it should come here
+ MockEndpoint mock = getMockEndpoint("mock:resultV" + version);
+ mock.expectedMessageCount(1);
+
+ // wait a bit
+ Awaitility.await().atMost(5, TimeUnit.SECONDS)
+ .untilAsserted(() -> mock.assertIsSatisfied());
+
+ Message in = mock.getReceivedExchanges().get(0).getIn();
+ Assertions.assertTrue(in instanceof SnmpMessage, "Expected received object 'SnmpMessage.class'. Got: " + in.getClass());
+ String msg = in.getBody(String.class);
+ String expected = "<oid>1.2.3.4.5</oid><value>some string</value>";
+ Assertions.assertTrue(msg.contains(expected), "Expected string containing '" + expected + "'. Got: " + msg);
+ }
+
+ private PDU createTrap(int version) {
+ PDU trap = SnmpHelper.createPDU(version);
+
+ OID oid = new OID("1.2.3.4.5");
+ trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, oid));
+ trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(5000))); // put your uptime here
+ trap.add(new VariableBinding(SnmpConstants.sysDescr, new OctetString("System Description")));
+ if (version == 0) {
+ ((PDUv1) trap).setEnterprise(oid); //?
+ }
+
+ //Add Payload
+ Variable var = new OctetString("some string");
+ trap.add(new VariableBinding(oid, var));
+ return trap;
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() {
+ return new RouteBuilder() {
+ public void configure() {
+ //genrate ports for trap consumers/producers
+ int portV0 = AvailablePortFinder.getNextAvailable();
+ int portV1 = AvailablePortFinder.getNextAvailable();
+ int portV3 = AvailablePortFinder.getNextAvailable();
+
+ from("direct:snmptrapV0")
+ .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
+ .to("snmp:127.0.0.1:" + portV0 + "?protocol=udp&type=TRAP&snmpVersion=0");
+
+ from("snmp:0.0.0.0:" + portV0 + "?protocol=udp&type=TRAP&snmpVersion=0")
+ .to("mock:resultV0");
+
+ from("direct:snmptrapV1")
+ .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
+ .to("snmp:127.0.0.1:" + portV1 + "?protocol=udp&type=TRAP&snmpVersion=1");
+
+ from("snmp:0.0.0.0:" + portV1 + "?protocol=udp&type=TRAP&snmpVersion=1")
+ .to("mock:resultV1");
+
+ from("direct:snmptrapV3")
+ .log(LoggingLevel.INFO, "Sending Trap pdu ${body}")
+ .to("snmp:127.0.0.1:" + portV3
+ + "?securityName=test&securityLevel=1&protocol=udp&type=TRAP&snmpVersion=3");
+
+ from("snmp:0.0.0.0:" + portV3 + "?securityName=test&securityLevel=1&protocol=udp&type=TRAP&snmpVersion=3")
+ .to("mock:resultV3");
+ }
+ };
+ }
+
+}
diff --git a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/WalkOIDTest.java b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/WalkOIDTest.java
index a3a60c8833d..41736b1d35c 100644
--- a/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/WalkOIDTest.java
+++ b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/WalkOIDTest.java
@@ -16,49 +16,48 @@
*/
package org.apache.camel.component.snmp;
-import java.util.List;
-
-import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.test.junit5.CamelTestSupport;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class WalkOIDTest extends CamelTestSupport {
+public class WalkOIDTest extends SnmpRespondTestSupport {
private static final Logger LOG = LoggerFactory.getLogger(PollOIDTest.class);
- // a disabled test... before enabling you must fill in a working IP, Port
- // and maybe oids in the route below
- @Disabled
- @Test
- public void testOIDWalk() throws Exception {
- MockEndpoint mock = getMockEndpoint("mock:result");
+ @ParameterizedTest
+ @MethodSource("supportedVersions")
+ public void testOIDWalk(int version) throws Exception {
+ template.sendBody("direct:inV" + version, "");
+
+ MockEndpoint mock = getMockEndpoint("mock:resultV" + version);
mock.expectedMinimumMessageCount(1);
mock.assertIsSatisfied();
- List<Exchange> oids = mock.getExchanges();
- if (LOG.isInfoEnabled()) {
- for (Exchange e : oids) {
- LOG.info("OID: " + e.getIn().getBody(String.class));
- }
- }
- }
- @Test
- public void testStartRoute() {
- // do nothing here , just make sure the camel route can started.
+ String msg = mock.getReceivedExchanges().get(0).getIn().getBody(String.class);
+ String pattern = ".*<value>ether1</value>.*<value>ether2</value>.*<value>ether3</value>.*<value>ether4</value>.*";
+ Assertions.assertTrue(msg.matches(pattern), "Expected string matching '" + pattern + "'. Got: " + msg);
}
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
- // START SNIPPET: e1
- from("timer:foo?repeatCount=1")
- .to("snmp:10.211.55.6:161?protocol=udp&type=GET_NEXT&oids=1.3.6.1.2.1.2.2.1.2,1.3.6.1.2.1.25.3.3.1.2")
- .transform(body().convertToString()).to("mock:result");
- // END SNIPPET: e1
+
+ from("direct:inV0")
+ .to("snmp:" + getListeningAddress() + "?protocol=udp&type=GET_NEXT&oids=1.3.6.1.2.1.2.2.1.2")
+ .transform(body().convertToString()).to("mock:resultV0");
+
+ from("direct:inV1")
+ .to("snmp:" + getListeningAddress()
+ + "?protocol=udp&snmpVersion=1&type=GET_NEXT&oids=1.3.6.1.2.1.2.2.1.2")
+ .transform(body().convertToString()).to("mock:resultV1");
+
+ from("direct:inV3")
+ .to("snmp:" + getListeningAddress()
+ + "?protocol=udp&snmpVersion=3&type=GET_NEXT&securityName=test&securityLevel=1&oids=1.3.6.1.2.1.2.2.1.2")
+ .transform(body().convertToString()).to("mock:resultV3");
}
};
}