You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "wwei (Jira)" <ji...@apache.org> on 2019/09/04 03:48:00 UTC

[jira] [Created] (CAMEL-13936) SNMP Component support ‘snmp walk’

wwei created CAMEL-13936:
----------------------------

             Summary: SNMP Component support ‘snmp walk’
                 Key: CAMEL-13936
                 URL: https://issues.apache.org/jira/browse/CAMEL-13936
             Project: Camel
          Issue Type: New Feature
          Components: camel-snmp
    Affects Versions: 3.0.0.M4
         Environment: SnmpEndpoint.java>>


 public Producer createProducer() throws Exception {
 if (this.type == SnmpActionType.TRAP) {
 return new SnmpTrapProducer(this);
 } else {
// return new SnmpProducer(this);
 return new SnmpProducer(this, this.type); // add the snmp walk
 }
 }

 

SnmpProducer.java>>

public class SnmpProducer extends DefaultProducer {
 
 private SnmpEndpoint endpoint;
 
 private Address targetAddress;
 private USM usm;
 private CommunityTarget target;
 private PDU pdu;
 private SnmpActionType actionType;
 
 public SnmpProducer(SnmpEndpoint endpoint) {
 super(endpoint);
 this.endpoint = endpoint;
 }

 public SnmpProducer(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();
 // only POLL do
 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);
// this.pdu.setType(PDU.GET);
 // add the snmp walk
 if (this.actionType == SnmpActionType.POLL)
 this.pdu.setType(PDU.GET);
 else 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);
 Variable variable = variableBinding.getVariable();
 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
}
            Reporter: wwei
             Fix For: Future


The current version, the SNMP Component can not support 'snmp walk'.

Although the source code has appear 'GET_NEXT' in SnmpActionType.java, but no found in processor.

Now, i add the 'snmp walk' and in my application it run successfully.

So, if it need add to the next camel version, please check.

Thanks!



--
This message was sent by Atlassian Jira
(v8.3.2#803003)