/**
* Copyright (c) 2013--2014 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.rhn.manager.satellite;
import org.apache.log4j.Logger;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
/**
* SystemCommandThreadedExecutor - implementation of the Executor interface that
* will take in the list of arguments and call Runtime.exec().
*/
public class SystemCommandThreadedExecutor implements Executor {
private boolean logError;
private class StreamThread extends Thread {
private InputStream inputStream;
private boolean logError;
private Logger logger;
StreamThread(InputStream in, boolean err, Logger log) {
inputStream = in;
logError = err;
logger = log;
}
public void run() {
StringBuilder sb = new StringBuilder();
try {
BufferedReader input = new BufferedReader(
new InputStreamReader(inputStream));
String line;
while ((line = input.readLine()) != null) {
sb.append(line);
sb.append('\n');
}
}
catch (IOException e) {
logger.warn("Error reading from process ", e);
}
if (sb.length() > 0) {
if (logError) {
logger.error(sb.toString());
}
else {
logger.info(sb.toString());
}
}
}
}
/**
* Logger for this class
*/
private final Logger logger;
/**
* Constructor
* @param log Desired logger
*/
public SystemCommandThreadedExecutor(Logger log) {
logError = true;
logger = log;
}
/**
* Whether to log errors as an ERROR within log4j
* Even if this is set to false, the error will still be logged
* with DEBUG priority
* @param toLog true to log as an error
*/
public void setLogError(boolean toLog) {
logError = toLog;
}
/**
* {@inheritDoc}
*/
public int execute(String[] args) {
if (logger.isDebugEnabled()) {
logger.debug("execute(String[] args=" + Arrays.asList(args) + ") - start");
}
int retval;
Runtime r = Runtime.getRuntime();
try {
if (logger.isDebugEnabled()) {
logger.debug("execute() - Calling r.exec ..");
}
Process p = r.exec(args);
Thread inStream = new StreamThread(
p.getInputStream(), false, logger);
Thread errStream = new StreamThread(
p.getErrorStream(), logError, logger);
inStream.start();
errStream.start();
try {
if (logger.isDebugEnabled()) {
logger.debug("execute() - Calling p.waitfor ..");
}
retval = p.waitFor();
inStream.join();
errStream.join();
}
catch (InterruptedException e) {
throw new RuntimeException(
"InterruptedException while trying to exec: " + e);
}
}
catch (IOException ioe) {
logger.error("execute(String[])", ioe);
String message = "";
for (int i = 0; i < args.length; i++) {
message = message + args[i] + " ";
}
logger.error("IOException while trying to exec: " + message, ioe);
throw new RuntimeException(
"IOException while trying to exec: " + message, ioe);
}
return retval;
}
/**
* {@inheritDoc}
*/
public String getLastCommandOutput() {
return "";
}
/**
* {@inheritDoc}
*/
public String getLastCommandErrorMessage() {
return "";
}
}