You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by pp...@apache.org on 2023/05/05 22:21:05 UTC
[camel-quarkus] branch 2.13.x updated: Fixup cc4c84e Upgraded snmp4j to another provider to avoid flaky tests
This is an automated email from the ASF dual-hosted git repository.
ppalaga pushed a commit to branch 2.13.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
The following commit(s) were added to refs/heads/2.13.x by this push:
new 0454f1f94e Fixup cc4c84e Upgraded snmp4j to another provider to avoid flaky tests
0454f1f94e is described below
commit 0454f1f94ef5d724e0799c2e6ef8f544cfe1c754
Author: JiriOndrusek <on...@gmail.com>
AuthorDate: Fri May 5 10:49:48 2023 +0200
Fixup cc4c84e Upgraded snmp4j to another provider to avoid flaky tests
---
.../ROOT/pages/reference/extensions/snmp.adoc | 14 +
.../component/snmp/deployment/SnmpProcessor.java | 2 +-
.../snmp/runtime/src/main/doc/limitations.adoc | 9 +
.../quarkus/component/snm/graal/SnmpRecorder.java | 352 ---------------------
.../component/snmp/QuarkusSnmpProducer.java | 200 ++++++++++++
.../component/snmp/QuarkusSnmpTrapProducer.java | 136 ++++++++
.../camel/quarkus/component/snmp/SnmpRecorder.java | 71 +++++
.../component/snmp/it/SnmpTestResource.java | 2 +-
8 files changed, 432 insertions(+), 354 deletions(-)
diff --git a/docs/modules/ROOT/pages/reference/extensions/snmp.adoc b/docs/modules/ROOT/pages/reference/extensions/snmp.adoc
index 1e23cb119f..b4ec34c86c 100644
--- a/docs/modules/ROOT/pages/reference/extensions/snmp.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/snmp.adoc
@@ -39,3 +39,17 @@ Please refer to the above link for usage and configuration details.
ifeval::[{doc-show-user-guide-link} == true]
Check the xref:user-guide/index.adoc[User guide] for more information about writing Camel Quarkus applications.
endif::[]
+
+[id="extensions-snmp-camel-quarkus-limitations"]
+== Camel Quarkus limitations
+
+This extension uses `org.snmp4j:snmp4j` as an SNMP protocol implementation.
+This is different from Camel 3.18.x using `org.apache.servicemix.bundles.snmp4j:org.apache.servicemix.bundles`.
+
+The motivation for this change is twofold:
+
+1. `org.snmp4j:snmp4j` brings more stability and fixes many vulnerabilities.
+2. Camel switches to `org.snmp4j.snmp4j` in version 4 anyway, so Camel Quarkus users can enjoy the same benefits a bit earlier.
+
+This change has no impact on configuration of the SNMP component.
+
diff --git a/extensions-jvm/snmp/deployment/src/main/java/org/apache/camel/quarkus/component/snmp/deployment/SnmpProcessor.java b/extensions-jvm/snmp/deployment/src/main/java/org/apache/camel/quarkus/component/snmp/deployment/SnmpProcessor.java
index 22d2acf371..6d280bcab8 100644
--- a/extensions-jvm/snmp/deployment/src/main/java/org/apache/camel/quarkus/component/snmp/deployment/SnmpProcessor.java
+++ b/extensions-jvm/snmp/deployment/src/main/java/org/apache/camel/quarkus/component/snmp/deployment/SnmpProcessor.java
@@ -22,7 +22,7 @@ import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.pkg.steps.NativeBuild;
import org.apache.camel.component.snmp.SnmpComponent;
-import org.apache.camel.quarkus.component.snm.graal.SnmpRecorder;
+import org.apache.camel.quarkus.component.snmp.SnmpRecorder;
import org.apache.camel.quarkus.core.JvmOnlyRecorder;
import org.apache.camel.quarkus.core.deployment.spi.CamelBeanBuildItem;
import org.jboss.logging.Logger;
diff --git a/extensions-jvm/snmp/runtime/src/main/doc/limitations.adoc b/extensions-jvm/snmp/runtime/src/main/doc/limitations.adoc
new file mode 100644
index 0000000000..c8fa3ba71b
--- /dev/null
+++ b/extensions-jvm/snmp/runtime/src/main/doc/limitations.adoc
@@ -0,0 +1,9 @@
+This extension uses `org.snmp4j:snmp4j` as an SNMP protocol implementation.
+This is different from Camel 3.18.x using `org.apache.servicemix.bundles.snmp4j:org.apache.servicemix.bundles`.
+
+The motivation for this change is twofold:
+
+1. `org.snmp4j:snmp4j` brings more stability and fixes many vulnerabilities.
+2. Camel switches to `org.snmp4j.snmp4j` in version 4 anyway, so Camel Quarkus users can enjoy the same benefits a bit earlier.
+
+This change has no impact on configuration of the SNMP component.
diff --git a/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snm/graal/SnmpRecorder.java b/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snm/graal/SnmpRecorder.java
deleted file mode 100644
index 468f104edb..0000000000
--- a/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snm/graal/SnmpRecorder.java
+++ /dev/null
@@ -1,352 +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.quarkus.component.snm.graal;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-import java.util.concurrent.TimeoutException;
-
-import io.quarkus.runtime.RuntimeValue;
-import io.quarkus.runtime.annotations.Recorder;
-import org.apache.camel.Endpoint;
-import org.apache.camel.Exchange;
-import org.apache.camel.Producer;
-import org.apache.camel.component.snmp.SnmpActionType;
-import org.apache.camel.component.snmp.SnmpComponent;
-import org.apache.camel.component.snmp.SnmpEndpoint;
-import org.apache.camel.component.snmp.SnmpMessage;
-import org.apache.camel.component.snmp.SnmpProducer;
-import org.apache.camel.component.snmp.SnmpTrapProducer;
-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.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;
-
-@Recorder
-public class SnmpRecorder {
-
- /**
- * Camel 3.18.6 uses org.apache.servicemix.bundles.snmp4j which differs in method signature of
- * SecurityModels.getInstance().addSecurityModel(this.usm)
- * compared to org.snmp4j.snmp4j.
- * For that reason CQ heeds to introduce its own SnmpProducer (with the same code as in Ca,mel 3.18.6)
- * This recorder could be removed as soon as the Camel is upgraded to 4.x (which brings org.snmp4j.snmp4j)
- */
- public RuntimeValue<SnmpComponent> configureSnmpComponent() {
- return new RuntimeValue<>(new QuarkusSnmpComponent());
- }
-
- @org.apache.camel.spi.annotations.Component("snmp")
- static class QuarkusSnmpComponent extends SnmpComponent {
-
- @Override
- protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
- SnmpEndpoint endpoint = new QuarkusSnmpEndpoint(uri, this);
- setProperties(endpoint, parameters);
- return endpoint;
- }
- }
-
- static class QuarkusSnmpEndpoint extends SnmpEndpoint {
-
- public QuarkusSnmpEndpoint(String uri, SnmpComponent component) {
- super(uri, component);
- }
-
- @Override
- public Producer createProducer() throws Exception {
- //code from Camel 3.18.6
- if (getType() == SnmpActionType.TRAP) {
- return new QuarkusSnmpTrapProducer(this);
- } else {
- // add the support: snmp walk (use snmp4j GET_NEXT)
- return new QuarkusSnmpProducer(this, getType());
- }
- }
- }
-
- //code from Camel 3.18.6
- static class QuarkusSnmpProducer extends DefaultProducer {
-
- private static final Logger LOG = LoggerFactory.getLogger(SnmpProducer.class);
-
- private SnmpEndpoint endpoint;
-
- private Address targetAddress;
- private USM usm;
- private CommunityTarget target;
- private SnmpActionType actionType;
- private PDU pdu;
-
- public QuarkusSnmpProducer(SnmpEndpoint endpoint, SnmpActionType actionType) {
- super(endpoint);
- this.endpoint = endpoint;
- this.actionType = actionType;
- }
-
- @Override
- protected void doStart() throws Exception {
- super.doStart();
-
- this.targetAddress = GenericAddress.parse(this.endpoint.getAddress());
- LOG.debug("targetAddress: {}", targetAddress);
-
- this.usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
- try {
- SecurityModels.getInstance().addSecurityModel(this.usm);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- // 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()) {
- this.pdu.add(new VariableBinding(oid));
- }
- }
- this.pdu.setErrorIndex(0);
- this.pdu.setErrorStatus(0);
- 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
- protected void doStop() throws Exception {
- super.doStop();
-
- try {
- SecurityModels.getInstance().removeSecurityModel(new Integer32(this.usm.getID()));
- } finally {
- this.targetAddress = null;
- this.usm = null;
- this.target = null;
- this.pdu = null;
- }
- }
-
- @Override
- public void process(final Exchange exchange) throws Exception {
- // load connection data only if the endpoint is enabled
- Snmp snmp = null;
- TransportMapping<? extends Address> transport = null;
-
- try {
- LOG.debug("Starting SNMP producer on {}", this.endpoint.getAddress());
-
- // either tcp or udp
- if ("tcp".equals(this.endpoint.getProtocol())) {
- transport = new DefaultTcpTransportMapping();
- } else if ("udp".equals(this.endpoint.getProtocol())) {
- transport = new DefaultUdpTransportMapping();
- } else {
- throw new IllegalArgumentException("Unknown protocol: " + this.endpoint.getProtocol());
- }
-
- snmp = new Snmp(transport);
-
- LOG.debug("Snmp: i am sending");
-
- snmp.listen();
-
- if (this.actionType == SnmpActionType.GET_NEXT) {
- // snmp walk
- List<SnmpMessage> smLst = new ArrayList<>();
- for (OID oid : this.endpoint.getOids()) {
- this.pdu.clear();
- this.pdu.add(new VariableBinding(oid));
-
- boolean matched = true;
- while (matched) {
- ResponseEvent responseEvent = snmp.send(this.pdu, this.target);
- if (responseEvent == null || responseEvent.getResponse() == null) {
- break;
- }
- PDU response = responseEvent.getResponse();
- String nextOid = null;
- Vector<? extends VariableBinding> variableBindings = response.getVariableBindings();
- for (int i = 0; i < variableBindings.size(); i++) {
- VariableBinding variableBinding = variableBindings.elementAt(i);
- nextOid = variableBinding.getOid().toDottedString();
- if (!nextOid.startsWith(oid.toDottedString())) {
- matched = false;
- break;
- }
- }
- if (!matched) {
- break;
- }
- this.pdu.clear();
- pdu.add(new VariableBinding(new OID(nextOid)));
- smLst.add(new SnmpMessage(getEndpoint().getCamelContext(), response));
- }
- }
- exchange.getIn().setBody(smLst);
- } else {
- // snmp get
- ResponseEvent responseEvent = snmp.send(this.pdu, this.target);
-
- LOG.debug("Snmp: sended");
-
- if (responseEvent.getResponse() != null) {
- exchange.getIn().setBody(new SnmpMessage(getEndpoint().getCamelContext(), responseEvent.getResponse()));
- } else {
- throw new TimeoutException("SNMP Producer Timeout");
- }
- }
- } finally {
- try {
- transport.close();
- } catch (Exception e) {
- }
- try {
- snmp.close();
- } catch (Exception e) {
- }
- }
- } //end process
- }
-
- //code from Camel 3.18.6
- static class QuarkusSnmpTrapProducer extends DefaultProducer {
-
- private static final Logger LOG = LoggerFactory.getLogger(SnmpTrapProducer.class);
-
- private SnmpEndpoint endpoint;
-
- private Address targetAddress;
- private USM usm;
- private CommunityTarget target;
-
- public QuarkusSnmpTrapProducer(SnmpEndpoint endpoint) {
- super(endpoint);
- this.endpoint = endpoint;
- }
-
- @Override
- protected void doStart() throws Exception {
- super.doStart();
-
- 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());
- }
-
- @Override
- protected void doStop() throws Exception {
- super.doStop();
-
- try {
- SecurityModels.getInstance().removeSecurityModel(new Integer32(this.usm.getID()));
- } finally {
- this.targetAddress = null;
- this.usm = null;
- this.target = null;
- }
- }
-
- @Override
- public void process(final Exchange exchange) throws Exception {
- // load connection data only if the endpoint is enabled
- Snmp snmp = null;
- TransportMapping<? extends Address> transport = null;
-
- try {
- LOG.debug("Starting SNMP Trap producer on {}", this.endpoint.getAddress());
-
- // either tcp or udp
- if ("tcp".equals(this.endpoint.getProtocol())) {
- transport = new DefaultTcpTransportMapping();
- } else if ("udp".equals(this.endpoint.getProtocol())) {
- transport = new DefaultUdpTransportMapping();
- } else {
- throw new IllegalArgumentException("Unknown protocol: " + this.endpoint.getProtocol());
- }
-
- snmp = new Snmp(transport);
-
- LOG.debug("SnmpTrap: getting pdu from body");
- PDU trap = exchange.getIn().getBody(PDU.class);
-
- trap.setErrorIndex(0);
- trap.setErrorStatus(0);
- if (this.endpoint.getSnmpVersion() == SnmpConstants.version1) {
- trap.setType(PDU.V1TRAP);
- } else {
- trap.setType(PDU.TRAP);
- trap.setMaxRepetitions(0);
- }
-
- LOG.debug("SnmpTrap: sending");
- snmp.send(trap, this.target);
- LOG.debug("SnmpTrap: sent");
- } finally {
- try {
- transport.close();
- } catch (Exception e) {
- }
- try {
- snmp.close();
- } catch (Exception e) {
- }
- }
- } //end process
- }
-
-}
diff --git a/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snmp/QuarkusSnmpProducer.java b/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snmp/QuarkusSnmpProducer.java
new file mode 100644
index 0000000000..03da3711e7
--- /dev/null
+++ b/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snmp/QuarkusSnmpProducer.java
@@ -0,0 +1,200 @@
+/*
+ * 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.quarkus.component.snmp;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.snmp.SnmpActionType;
+import org.apache.camel.component.snmp.SnmpEndpoint;
+import org.apache.camel.component.snmp.SnmpMessage;
+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.TransportMapping;
+import org.snmp4j.event.ResponseEvent;
+import org.snmp4j.mp.MPv3;
+import org.snmp4j.security.SecurityModels;
+import org.snmp4j.security.SecurityProtocols;
+import org.snmp4j.security.USM;
+import org.snmp4j.smi.Address;
+import org.snmp4j.smi.GenericAddress;
+import org.snmp4j.smi.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;
+
+/**
+ * A snmp producer
+ */
+public class QuarkusSnmpProducer extends DefaultProducer {
+
+ private static final Logger LOG = LoggerFactory.getLogger(QuarkusSnmpProducer.class);
+
+ private SnmpEndpoint endpoint;
+
+ private Address targetAddress;
+ private USM usm;
+ private CommunityTarget target;
+ private SnmpActionType actionType;
+ private PDU pdu;
+
+ public QuarkusSnmpProducer(SnmpEndpoint endpoint, SnmpActionType actionType) {
+ super(endpoint);
+ this.endpoint = endpoint;
+ this.actionType = actionType;
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+
+ 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.pdu = new PDU();
+ // in here,only POLL do set the oids
+ if (this.actionType == SnmpActionType.POLL) {
+ for (OID oid : this.endpoint.getOids()) {
+ this.pdu.add(new VariableBinding(oid));
+ }
+ }
+ this.pdu.setErrorIndex(0);
+ this.pdu.setErrorStatus(0);
+ 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
+ protected void doStop() throws Exception {
+ super.doStop();
+
+ try {
+ SecurityModels.getInstance().removeSecurityModel(new Integer32(this.usm.getID()));
+ } finally {
+ this.targetAddress = null;
+ this.usm = null;
+ this.target = null;
+ this.pdu = null;
+ }
+ }
+
+ @Override
+ public void process(final Exchange exchange) throws Exception {
+ // load connection data only if the endpoint is enabled
+ Snmp snmp = null;
+ TransportMapping<? extends Address> transport = null;
+
+ try {
+ LOG.debug("Starting SNMP producer on {}", this.endpoint.getAddress());
+
+ // either tcp or udp
+ if ("tcp".equals(this.endpoint.getProtocol())) {
+ transport = new DefaultTcpTransportMapping();
+ } else if ("udp".equals(this.endpoint.getProtocol())) {
+ transport = new DefaultUdpTransportMapping();
+ } else {
+ throw new IllegalArgumentException("Unknown protocol: " + this.endpoint.getProtocol());
+ }
+
+ snmp = new Snmp(transport);
+
+ LOG.debug("Snmp: i am sending");
+
+ snmp.listen();
+
+ if (this.actionType == SnmpActionType.GET_NEXT) {
+ // snmp walk
+ List<SnmpMessage> smLst = new ArrayList<>();
+ for (OID oid : this.endpoint.getOids()) {
+ this.pdu.clear();
+ this.pdu.add(new VariableBinding(oid));
+
+ boolean matched = true;
+ while (matched) {
+ ResponseEvent responseEvent = snmp.send(this.pdu, this.target);
+ if (responseEvent == null || responseEvent.getResponse() == null) {
+ break;
+ }
+ PDU response = responseEvent.getResponse();
+ String nextOid = null;
+ Vector<? extends VariableBinding> variableBindings = response.getVariableBindings();
+ for (int i = 0; i < variableBindings.size(); i++) {
+ VariableBinding variableBinding = variableBindings.elementAt(i);
+ nextOid = variableBinding.getOid().toDottedString();
+ if (!nextOid.startsWith(oid.toDottedString())) {
+ matched = false;
+ break;
+ }
+ }
+ if (!matched) {
+ break;
+ }
+ this.pdu.clear();
+ pdu.add(new VariableBinding(new OID(nextOid)));
+ smLst.add(new SnmpMessage(getEndpoint().getCamelContext(), response));
+ }
+ }
+ exchange.getIn().setBody(smLst);
+ } else {
+ // snmp get
+ ResponseEvent responseEvent = snmp.send(this.pdu, this.target);
+
+ LOG.debug("Snmp: sended");
+
+ if (responseEvent.getResponse() != null) {
+ exchange.getIn().setBody(new SnmpMessage(getEndpoint().getCamelContext(), responseEvent.getResponse()));
+ } else {
+ throw new TimeoutException("SNMP Producer Timeout");
+ }
+ }
+ } finally {
+ try {
+ transport.close();
+ } catch (Exception e) {
+ }
+ try {
+ snmp.close();
+ } catch (Exception e) {
+ }
+ }
+ } //end process
+}
diff --git a/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snmp/QuarkusSnmpTrapProducer.java b/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snmp/QuarkusSnmpTrapProducer.java
new file mode 100644
index 0000000000..2a3e41cdb2
--- /dev/null
+++ b/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snmp/QuarkusSnmpTrapProducer.java
@@ -0,0 +1,136 @@
+/*
+ * 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.quarkus.component.snmp;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.component.snmp.SnmpEndpoint;
+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.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;
+
+/**
+ * A snmp trap producer
+ */
+public class QuarkusSnmpTrapProducer extends DefaultProducer {
+
+ private static final Logger LOG = LoggerFactory.getLogger(QuarkusSnmpTrapProducer.class);
+
+ private SnmpEndpoint endpoint;
+
+ private Address targetAddress;
+ private USM usm;
+ private CommunityTarget target;
+
+ public QuarkusSnmpTrapProducer(SnmpEndpoint endpoint) {
+ super(endpoint);
+ this.endpoint = endpoint;
+ }
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+
+ 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());
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ super.doStop();
+
+ try {
+ SecurityModels.getInstance().removeSecurityModel(new Integer32(this.usm.getID()));
+ } finally {
+ this.targetAddress = null;
+ this.usm = null;
+ this.target = null;
+ }
+ }
+
+ @Override
+ public void process(final Exchange exchange) throws Exception {
+ // load connection data only if the endpoint is enabled
+ Snmp snmp = null;
+ TransportMapping<? extends Address> transport = null;
+
+ try {
+ LOG.debug("Starting SNMP Trap producer on {}", this.endpoint.getAddress());
+
+ // either tcp or udp
+ if ("tcp".equals(this.endpoint.getProtocol())) {
+ transport = new DefaultTcpTransportMapping();
+ } else if ("udp".equals(this.endpoint.getProtocol())) {
+ transport = new DefaultUdpTransportMapping();
+ } else {
+ throw new IllegalArgumentException("Unknown protocol: " + this.endpoint.getProtocol());
+ }
+
+ snmp = new Snmp(transport);
+
+ LOG.debug("SnmpTrap: getting pdu from body");
+ PDU trap = exchange.getIn().getBody(PDU.class);
+
+ trap.setErrorIndex(0);
+ trap.setErrorStatus(0);
+ if (this.endpoint.getSnmpVersion() == SnmpConstants.version1) {
+ trap.setType(PDU.V1TRAP);
+ } else {
+ trap.setType(PDU.TRAP);
+ trap.setMaxRepetitions(0);
+ }
+
+ LOG.debug("SnmpTrap: sending");
+ snmp.send(trap, this.target);
+ LOG.debug("SnmpTrap: sent");
+ } finally {
+ try {
+ transport.close();
+ } catch (Exception e) {
+ }
+ try {
+ snmp.close();
+ } catch (Exception e) {
+ }
+ }
+ } //end process
+}
diff --git a/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snmp/SnmpRecorder.java b/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snmp/SnmpRecorder.java
new file mode 100644
index 0000000000..8e357e5664
--- /dev/null
+++ b/extensions-jvm/snmp/runtime/src/main/java/org/apache/camel/quarkus/component/snmp/SnmpRecorder.java
@@ -0,0 +1,71 @@
+/*
+ * 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.quarkus.component.snmp;
+
+import java.util.Map;
+
+import io.quarkus.runtime.RuntimeValue;
+import io.quarkus.runtime.annotations.Recorder;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Producer;
+import org.apache.camel.component.snmp.SnmpActionType;
+import org.apache.camel.component.snmp.SnmpComponent;
+import org.apache.camel.component.snmp.SnmpEndpoint;
+
+@Recorder
+public class SnmpRecorder {
+
+ /**
+ * Camel 3.18.6 uses org.apache.servicemix.bundles.snmp4j which differs in method signature of
+ * SecurityModels.getInstance().addSecurityModel(this.usm)
+ * compared to org.snmp4j.snmp4j.
+ * For that reason CQ heeds to introduce its own SnmpProducer (with the same code as in Ca,mel 3.18.6)
+ * This recorder could be removed as soon as the Camel is upgraded to 4.x (which brings org.snmp4j.snmp4j)
+ */
+ public RuntimeValue<SnmpComponent> configureSnmpComponent() {
+ return new RuntimeValue<>(new QuarkusSnmpComponent());
+ }
+
+ @org.apache.camel.spi.annotations.Component("snmp")
+ static class QuarkusSnmpComponent extends SnmpComponent {
+
+ @Override
+ protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+ SnmpEndpoint endpoint = new QuarkusSnmpEndpoint(uri, this);
+ setProperties(endpoint, parameters);
+ return endpoint;
+ }
+ }
+
+ static class QuarkusSnmpEndpoint extends SnmpEndpoint {
+
+ public QuarkusSnmpEndpoint(String uri, SnmpComponent component) {
+ super(uri, component);
+ }
+
+ @Override
+ public Producer createProducer() throws Exception {
+ //code from Camel 3.18.6
+ if (getType() == SnmpActionType.TRAP) {
+ return new QuarkusSnmpTrapProducer(this);
+ } else {
+ // add the support: snmp walk (use snmp4j GET_NEXT)
+ return new QuarkusSnmpProducer(this, getType());
+ }
+ }
+ }
+}
diff --git a/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTestResource.java b/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTestResource.java
index 9f0f1db6e3..769c7824b6 100644
--- a/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTestResource.java
+++ b/integration-tests-jvm/snmp/src/test/java/org/apache/camel/quarkus/component/snmp/it/SnmpTestResource.java
@@ -98,7 +98,7 @@ public class SnmpTestResource implements QuarkusTestResourceLifecycleManager {
PDU pdu = event.getPDU();
Vector<? extends VariableBinding> vbs;
if (pdu.getVariableBindings() != null) {
- vbs = (Vector<? extends VariableBinding>) new Vector(pdu.getVariableBindings());
+ vbs = new Vector<>(pdu.getVariableBindings());
} else {
vbs = new Vector<>(0);
}