CAMEL-10319, SNMP Producer

Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/64441b9f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/64441b9f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/64441b9f

Branch: refs/heads/master
Commit: 64441b9fc067be1f22e315474fb4f5cbe50d863f
Parents: 404fae8
Author: Fabrizio Spataro <fabrizio.spat...@bizmate.it>
Authored: Wed Sep 14 17:34:53 2016 +0200
Committer: Andrea Cosentino <anco...@gmail.com>
Committed: Thu Sep 15 10:52:13 2016 +0200

----------------------------------------------------------------------
 .../src/main/docs/snmp-component.adoc           |  13 +-
 .../camel/component/snmp/SnmpEndpoint.java      |   2 +-
 .../camel/component/snmp/SnmpProducer.java      | 125 +++++++++++++++++++
 .../camel/component/snmp/ProducerTest.java      |  54 ++++++++
 4 files changed, 191 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/64441b9f/components/camel-snmp/src/main/docs/snmp-component.adoc
----------------------------------------------------------------------
diff --git a/components/camel-snmp/src/main/docs/snmp-component.adoc 
b/components/camel-snmp/src/main/docs/snmp-component.adoc
index e6d24d3..ba6edbd 100644
--- a/components/camel-snmp/src/main/docs/snmp-component.adoc
+++ b/components/camel-snmp/src/main/docs/snmp-component.adoc
@@ -5,7 +5,7 @@ SNMP Component
 *Available as of Camel 2.1*
 
 The *snmp:* component gives you the ability to poll SNMP capable devices
-or receiving traps.
+or receiving traps
 
 Maven users will need to add the following dependency to their `pom.xml`
 for this component:
@@ -35,6 +35,16 @@ and receiving traps.
 You can append query options to the URI in the following format,
 `?option=value&option=value&...`
 
+[[SNMP-Producer]]
+Snmp Producer 
+^^^^^^^^^^^^^
+
+*Available from 2.18 release*
+
+It can also be used to request information using GET method.
+
+The response body type is org.apache.camel.component.snmp.SnmpMessage
+
 [[SNMP-Options]]
 Options
 ^^^^^^^
@@ -93,7 +103,6 @@ The SNMP component supports 36 endpoint options which are 
listed below:
 {% endraw %}
 // endpoint options: END
 
-
 [[SNMP-Theresultofapoll]]
 The result of a poll
 ^^^^^^^^^^^^^^^^^^^^

http://git-wip-us.apache.org/repos/asf/camel/blob/64441b9f/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpEndpoint.java
----------------------------------------------------------------------
diff --git 
a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpEndpoint.java
 
b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpEndpoint.java
index ebb2f63..005e635 100644
--- 
a/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpEndpoint.java
+++ 
b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpEndpoint.java
@@ -111,7 +111,7 @@ public class SnmpEndpoint extends DefaultPollingEndpoint {
     }
 
     public Producer createProducer() throws Exception {
-        throw new UnsupportedOperationException("SnmpProducer is not 
implemented");
+        return new SnmpProducer(this);
     }
 
     public boolean isSingleton() {

http://git-wip-us.apache.org/repos/asf/camel/blob/64441b9f/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..1db6696
--- /dev/null
+++ 
b/components/camel-snmp/src/main/java/org/apache/camel/component/snmp/SnmpProducer.java
@@ -0,0 +1,125 @@
+/**
+ * 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.Exchange;
+import org.apache.camel.impl.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.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 SnmpProducer extends DefaultProducer {
+   
+    private static final Logger LOG = 
LoggerFactory.getLogger(SnmpProducer.class);
+    
+    private SnmpEndpoint endpoint;
+    
+    public SnmpProducer(SnmpEndpoint endpoint) {
+        super(endpoint);
+        this.endpoint = endpoint;
+    }
+    
+    @Override
+    public void process(final Exchange exchange) throws Exception {
+        // load connection data only if the endpoint is enabled
+        Snmp snmp = null;
+        USM usm;
+        TransportMapping<? extends Address> transport = null;
+        CommunityTarget target = null;
+        PDU pdu = null;
+        Address targetAddress = null;
+
+        try {
+            LOG.debug("Starting SNMP producer on {}", endpoint.getAddress());
+    
+            targetAddress = GenericAddress.parse(endpoint.getAddress());
+            
+            LOG.debug("targetAddress: " + targetAddress);
+            
+            // either tcp or udp
+            if ("tcp".equals(endpoint.getProtocol())) {
+                transport = new DefaultTcpTransportMapping();
+            } else if ("udp".equals(endpoint.getProtocol())) {
+                transport = new DefaultUdpTransportMapping();
+            } else {
+                throw new IllegalArgumentException("Unknown protocol: " + 
endpoint.getProtocol());
+            }
+    
+            snmp = new Snmp(transport);
+            usm = new USM(SecurityProtocols.getInstance(), new 
OctetString(MPv3.createLocalEngineID()), 0);
+            
+            SecurityModels.getInstance().addSecurityModel(usm);
+    
+            // setting up target
+            target = new CommunityTarget();
+            target.setCommunity(new OctetString(endpoint.getSnmpCommunity()));
+            target.setAddress(targetAddress);
+            target.setRetries(this.endpoint.getRetries());
+            target.setTimeout(this.endpoint.getTimeout());
+            target.setVersion(this.endpoint.getSnmpVersion());
+    
+            pdu = new PDU();
+            for (OID oid : endpoint.getOids()) {
+                pdu.add(new VariableBinding(oid));
+            }
+            pdu.setErrorIndex(0);
+            pdu.setErrorStatus(0);
+            pdu.setMaxRepetitions(0);
+            pdu.setType(PDU.GET);
+            
+            LOG.debug("Snmp: i am sending");
+    
+            snmp.listen();
+            ResponseEvent responseEvent = snmp.send(pdu, target);
+            
+            LOG.debug("Snmp: sended");
+    
+            if (responseEvent.getResponse() != null) {
+                exchange.getIn().setBody(new 
SnmpMessage(responseEvent.getResponse()));
+            } else {
+                throw new Exception("SNMP Producer Timeout");
+            }
+        } finally {
+            try {
+                transport.close(); 
+            } catch (Exception e) { }
+            try {
+                snmp.close(); 
+            } catch (Exception e) { }
+        }
+    } //end process
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/64441b9f/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..d667f36
--- /dev/null
+++ 
b/components/camel-snmp/src/test/java/org/apache/camel/component/snmp/ProducerTest.java
@@ -0,0 +1,54 @@
+/**
+ * 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.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class ProducerTest extends CamelTestSupport {
+
+    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", "");
+
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedMinimumMessageCount(1);
+
+        assertMockEndpointsSatisfied(60, TimeUnit.SECONDS);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            public void configure() {
+                from("direct:in")
+                        .to("snmp://" + host + ":" + port + "?oids=" + oids)
+                        .log("${body}")
+                        .to("mock:result");
+            }
+        };
+    }
+}
+

Reply via email to