/* * 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.lsof; import java.io.File; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.pluginapi.inventory.DiscoveredResourceDetails; import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException; import org.rhq.core.pluginapi.inventory.ResourceDiscoveryContext; import org.rhq.core.system.SystemInfoFactory; import org.rhq.plugins.script.ScriptDiscoveryComponent; /** * Discovers a lsof tool. * * @author John Mazzitelli */ public class LsofDiscoveryComponent extends ScriptDiscoveryComponent { private final Log log = LogFactory.getLog(LsofDiscoveryComponent.class); private static final String DEFAULT_NAME = "Network Resource Detector"; private static final String DEFAULT_DESCRIPTION = "A resource that is used to detect network resources."; @Override public DiscoveredResourceDetails discoverResource(Configuration pluginConfig, ResourceDiscoveryContext discoveryContext) throws InvalidPluginConfigurationException { DiscoveredResourceDetails details; DetectionMechanism detectionMechanism = getDetectionMechanism(pluginConfig); log.debug("resource will have detection mechanism of [" + detectionMechanism + "]"); switch (detectionMechanism) { case INTERNAL: if (SystemInfoFactory.isNativeSystemInfoDisabled()) { throw new InvalidPluginConfigurationException( "The native system is disabled - cannot use the internal detection mechanism"); } if (!SystemInfoFactory.isNativeSystemInfoAvailable()) { throw new InvalidPluginConfigurationException( "The native system is not available - cannot use the internal detection mechanism"); } String version = LsofComponent.VERSION; details = new DiscoveredResourceDetails(discoveryContext.getResourceType(), "*lsof-internal*", DEFAULT_NAME, version, DEFAULT_DESCRIPTION, pluginConfig, null); break; case EXTERNAL: // do all that we can to make sure we have a valid full path to the executable PropertySimple executable = pluginConfig.getSimple(LsofComponent.PLUGINCONFIG_EXECUTABLE); executable.setStringValue(findExecutable(executable.getStringValue())); details = super.discoverResource(pluginConfig, discoveryContext); details.setResourceName(DEFAULT_NAME); break; default: throw new InvalidPluginConfigurationException("Unknown detection mechanism: " + detectionMechanism); } return details; } private String findExecutable(String executable) { File findIt = new File(executable); if (!findIt.isAbsolute()) { // the typical locations where lsof can usually be found String[] possibleLocations = { "/usr/bin", "/usr/sbin", "/bin", "/sbin", "/usr/local/bin" }; for (String possibleLocation : possibleLocations) { findIt = new File(possibleLocation, executable); if (findIt.exists()) { executable = findIt.getAbsolutePath(); break; } } } return executable; } @Override protected String determineDescription(ResourceDiscoveryContext context, Configuration pluginConfig) { return DEFAULT_DESCRIPTION; // we don't use the discovery tool to get us a description - we hard code one } public static DetectionMechanism getDetectionMechanism(Configuration pluginConfig) { String mechanism = pluginConfig.getSimpleValue(LsofComponent.PLUGINCONFIG_DETECTION_MECHANISM, "external"); return DetectionMechanism.valueOf(mechanism); } }