blob: 4be46369da82bdabbdcbf337f046d122a1a21dce [file] [log] [blame]
/**
* 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.net.URI;
import org.apache.camel.Consumer;
import org.apache.camel.Exchange;
import org.apache.camel.ExchangePattern;
import org.apache.camel.Processor;
import org.apache.camel.Producer;
import org.apache.camel.impl.DefaultExchange;
import org.apache.camel.impl.DefaultPollingEndpoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.snmp4j.PDU;
import org.snmp4j.mp.SnmpConstants;
public class SnmpEndpoint extends DefaultPollingEndpoint {
public static final String DEFAULT_COMMUNITY = "public";
public static final int DEFAULT_SNMP_VERSION = SnmpConstants.version1;
public static final int DEFAULT_SNMP_RETRIES = 2;
public static final int DEFAULT_SNMP_TIMEOUT = 1500;
private static final Logger LOG = LoggerFactory.getLogger(SnmpEndpoint.class);
private OIDList oids = new OIDList();
private String address;
private String protocol = "udp";
private int retries = DEFAULT_SNMP_RETRIES;
private int timeout = DEFAULT_SNMP_TIMEOUT;
private int snmpVersion = DEFAULT_SNMP_VERSION;
private String snmpCommunity = DEFAULT_COMMUNITY;
private SnmpActionType type;
private int delay = 60;
/**
* creates a snmp endpoint
*
* @param uri the endpoint uri
* @param component the component
*/
public SnmpEndpoint(String uri, SnmpComponent component) {
super(uri, component);
}
public Consumer createConsumer(Processor processor) throws Exception {
if (this.type == SnmpActionType.TRAP) {
return new SnmpTrapConsumer(this, processor);
} else if (this.type == SnmpActionType.POLL) {
return new SnmpOIDPoller(this, processor);
} else {
throw new IllegalArgumentException("The type '" + this.type + "' is not valid!");
}
}
public Producer createProducer() throws Exception {
throw new UnsupportedOperationException("SnmpProducer is not implemented");
}
public boolean isSingleton() {
return true;
}
/**
* creates an exchange for the given message
*
* @param pdu the pdu
* @return an exchange
*/
public Exchange createExchange(PDU pdu) {
return createExchange(getExchangePattern(), pdu);
}
/**
* creates an exchange for the given pattern and message
*
* @param pattern the message exchange pattern
* @param pdu the pdu
* @return the exchange
*/
private Exchange createExchange(ExchangePattern pattern, PDU pdu) {
Exchange exchange = new DefaultExchange(this, pattern);
exchange.setIn(new SnmpMessage(pdu));
return exchange;
}
/**
* creates and configures the endpoint
*
* @throws Exception if unable to setup connection
*/
public void initiate() throws Exception {
URI uri = URI.create(getEndpointUri());
String host = uri.getHost();
int port = uri.getPort();
if (host == null || host.trim().length() < 1) {
host = "127.0.0.1";
}
if (port == -1) {
if (getType() == SnmpActionType.POLL) {
port = 161; // default snmp poll port
} else {
port = 162; // default trap port
}
}
// set the address
String address = String.format("%s:%s/%d", getProtocol(), host, port);
LOG.debug("Using snmp address {}", address);
setAddress(address);
}
public int getDelay() {
return delay;
}
/**
* Sets update rate in seconds
*
* @param updateEvery the update rate in seconds
*/
public void setDelay(int updateEvery) {
this.delay = updateEvery;
}
public SnmpActionType getType() {
return this.type;
}
public void setType(SnmpActionType type) {
this.type = type;
}
public OIDList getOids() {
return this.oids;
}
public void setOids(OIDList oids) {
this.oids = oids;
}
public String getAddress() {
return this.address;
}
public void setAddress(String address) {
this.address = address;
}
public int getRetries() {
return this.retries;
}
public void setRetries(int retries) {
this.retries = retries;
}
public int getTimeout() {
return this.timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public int getSnmpVersion() {
return this.snmpVersion;
}
public void setSnmpVersion(int snmpVersion) {
this.snmpVersion = snmpVersion;
}
public String getSnmpCommunity() {
return this.snmpCommunity;
}
public void setSnmpCommunity(String snmpCommunity) {
this.snmpCommunity = snmpCommunity;
}
public String getProtocol() {
return this.protocol;
}
public void setProtocol(String protocol) {
this.protocol = protocol;
}
@Override
public String toString() {
// only show address to avoid user and password details to be shown
return "SnmpEndpoint[" + address + "]";
}
}