/*
* 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.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hyperic.sigar.NetConnection;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.PropertyList;
import org.rhq.core.domain.configuration.PropertyMap;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.pluginapi.operation.OperationResult;
import org.rhq.core.util.exception.ThrowableUtil;
import org.rhq.plugins.script.ScriptServerComponent;
/**
* Component that represents the lsof tool.
*
* @author John Mazzitelli
*/
public class LsofComponent extends ScriptServerComponent {
private final Log log = LogFactory.getLog(LsofComponent.class);
protected static final String VERSION = "1.0"; // our plugin version, used when this resource is told to use its internal mechanism
protected static final String PLUGINCONFIG_DETECTION_MECHANISM = "detectionMechanism"; // also used for operation results
protected static final String PLUGINCONFIG_EXECUTABLE = ScriptServerComponent.PLUGINCONFIG_EXECUTABLE;
@Override
public OperationResult invokeOperation(String name, Configuration params) throws Exception {
OperationResult result;
if ("getNetworkConnections".equals(name)) {
Configuration pluginConfiguration = getResourcContext().getPluginConfiguration();
DetectionMechanism mechanism = LsofDiscoveryComponent.getDetectionMechanism(pluginConfiguration);
if (mechanism == DetectionMechanism.EXTERNAL) {
log.info("Getting network connections using the external mechanism");
// compile the regex that will be used to parse the output
String regex = params.getSimpleValue("regex", "");
if (regex.length() == 0) {
throw new Exception("missing regex parameter");
}
Pattern pattern = Pattern.compile(regex);
// first run the executable
OperationResult intermediaryResult = super.invokeOperation(name, params);
Configuration intermediaryConfig = intermediaryResult.getComplexResults();
// now build our results object
result = new OperationResult();
Configuration config = result.getComplexResults();
config.put(new PropertySimple("detectionMechanism", mechanism.toString()));
config.put(intermediaryConfig.getSimple(OPERATION_RESULT_EXITCODE));
if (intermediaryResult.getErrorMessage() != null) {
result.setErrorMessage(intermediaryResult.getErrorMessage());
} else {
String output = intermediaryConfig.getSimpleValue(OPERATION_RESULT_OUTPUT, "");
if (output.length() > 0) {
PropertyList list = new PropertyList("networkConnections");
config.put(list);
String[] lines = output.split("\n");
for (String line : lines) {
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
PropertyMap map = new PropertyMap("networkConnection");
list.add(map);
map.put(new PropertySimple("localHost", matcher.group(1)));
map.put(new PropertySimple("localPort", matcher.group(2)));
map.put(new PropertySimple("remoteHost", matcher.group(3)));
map.put(new PropertySimple("remotePort", matcher.group(4)));
}
}
}
}
} else {
log.info("Getting network connections using the internal mechanism");
result = new OperationResult();
Configuration config = result.getComplexResults();
config.put(new PropertySimple("detectionMechanism", mechanism.toString()));
try {
List<NetConnection> conns;
conns = getResourcContext().getSystemInformation().getNetworkConnections(null, 0);
config.put(new PropertySimple(OPERATION_RESULT_EXITCODE, "0"));
if (conns.size() > 0) {
PropertyList list = new PropertyList("networkConnections");
config.put(list);
for (NetConnection conn : conns) {
PropertyMap map = new PropertyMap("networkConnection");
list.add(map);
map.put(new PropertySimple("localHost", conn.getLocalAddress()));
map.put(new PropertySimple("localPort", conn.getLocalPort()));
map.put(new PropertySimple("remoteHost", conn.getRemoteAddress()));
map.put(new PropertySimple("remotePort", conn.getRemotePort()));
}
}
} catch (Exception e) {
config.put(new PropertySimple(OPERATION_RESULT_EXITCODE, "1"));
result.setErrorMessage(ThrowableUtil.getAllMessages(e));
}
}
} else {
result = super.invokeOperation(name, params);
}
return result;
}
}