/*
* RHQ Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.plugins.snmptrapd;
import java.io.IOException;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.snmp4j.Snmp;
import org.snmp4j.log.Log4jLogFactory;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.pluginapi.event.EventContext;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.measurement.MeasurementFacet;
import org.rhq.core.util.exception.ThrowableUtil;
/**
* The actual implementation of the Snmp trapd
* @author Heiko W. Rupp
*
*/
public class SnmpTrapdComponent implements ResourceComponent<ResourceComponent<?>>, MeasurementFacet {
private final Log log = LogFactory.getLog(SnmpTrapdComponent.class);
public static final String TRAP_TYPE = "SnmpTrap";
private EventContext eventContext;
private Snmp snmp;
private SnmpTrapEventPoller snmpTrapEventPoller;
public static int trapCount = 0;
static {
org.snmp4j.log.LogFactory.setLogFactory(new Log4jLogFactory());
}
/* (non-Javadoc)
* @see org.rhq.core.pluginapi.inventory.ResourceComponent#getAvailability()
*/
public AvailabilityType getAvailability() {
return AvailabilityType.UP;
}
/**
* Start the event polling mechanism and the actual trap listener.
* @see org.rhq.core.pluginapi.inventory.ResourceComponent#start(org.rhq.core.pluginapi.inventory.ResourceContext)
*/
public void start(ResourceContext context) throws InvalidPluginConfigurationException, Exception {
Configuration conf = context.getPluginConfiguration();
PropertySimple ps = conf.getSimple("port");
Integer port = ps.getIntegerValue();
ps = conf.getSimple("community");
String community = ps.getStringValue();
ps = conf.getSimple("eventSeverityOid");
String severityOid = ps.getStringValue();
ps = conf.getSimple("pollInterval");
int pollInterval = ps.getIntegerValue();
eventContext = context.getEventContext();
// TODO: check if the engine is already alive
try {
UdpAddress targetAddress = new UdpAddress(port);
// TransportMapping transport = new DefaultUdpTransportMapping(targetAddress);
snmp = new Snmp(new DefaultUdpTransportMapping());
snmpTrapEventPoller = new SnmpTrapEventPoller(severityOid);
eventContext.registerEventPoller(snmpTrapEventPoller, pollInterval);
// TODO set up the community here
if (!snmp.addNotificationListener(targetAddress, snmpTrapEventPoller))
throw new IOException("cannot attach to " + targetAddress);
//transport.listen();
} catch (IOException e) {
log.error("Cannot start snmp engine. Cause: " + ThrowableUtil.getAllMessages(e));
}
}
/**
* Tear down the trap listener and stop polling for events.
* @see org.rhq.core.pluginapi.inventory.ResourceComponent#stop()
*/
public void stop() {
if (snmp != null) {
snmp.removeCommandResponder(snmpTrapEventPoller);
try {
snmp.close();
} catch (IOException e) {
log.error("Cannot stop snmp engine. Cause: " + ThrowableUtil.getAllMessages(e));
}
snmp = null;
}
eventContext.unregisterEventPoller(TRAP_TYPE);
}
/* (non-Javadoc)
* @see org.rhq.core.pluginapi.measurement.MeasurementFacet#getValues(org.rhq.core.domain.measurement.MeasurementReport, java.util.Set)
*/
public void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> metrics) throws Exception {
for (MeasurementScheduleRequest req : metrics) {
if (req.getName().equals("trap_count")) {
MeasurementDataNumeric res = new MeasurementDataNumeric(req, Double.valueOf(trapCount)); // TODO FIXME
report.addData(res);
}
}
}
}