19 package org.sleuthkit.autopsy.coreutils;
 
   21 import com.sun.javafx.PlatformUtil;
 
   22 import java.io.BufferedReader;
 
   23 import java.io.IOException;
 
   24 import java.io.InputStream;
 
   25 import java.io.InputStreamReader;
 
   26 import java.io.Writer;
 
   27 import java.util.Date;
 
   28 import java.util.List;
 
   29 import java.util.concurrent.TimeUnit;
 
   30 import java.util.logging.Level;
 
   69             return Thread.currentThread().isInterrupted();
 
   90             this.startTimeInSeconds = (
new Date().getTime()) / 1000;
 
  106                 this.maxRunTimeInSeconds = Long.MAX_VALUE;
 
  108             this.startTimeInSeconds = (
new Date().getTime()) / 1000;
 
  113             long currentTimeInSeconds = (
new Date().getTime()) / 1000;
 
  130     public static int execute(ProcessBuilder processBuilder) 
throws SecurityException, IOException {
 
  133             public boolean shouldTerminateProcess() {
 
  171     public static int execute(ProcessBuilder processBuilder, 
long timeOut, TimeUnit units, 
ProcessTerminator terminator) 
throws SecurityException, IOException {
 
  172         Process process = processBuilder.start();
 
  175                 process.waitFor(timeOut, units);
 
  176                 if (process.isAlive() && terminator.shouldTerminateProcess()) {
 
  180                     } 
catch (InterruptedException exx) {
 
  181                         Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO, String.format(
"Wait for process termination following killProcess was interrupted for command %s", processBuilder.command().get(0)));
 
  184             } 
while (process.isAlive());
 
  185         } 
catch (InterruptedException ex) {
 
  186             if (process.isAlive()) {
 
  191             } 
catch (InterruptedException exx) {
 
  192                 Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO, String.format(
"Wait for process termination following killProcess was interrupted for command %s", processBuilder.command().get(0)));
 
  194             Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO, 
"Thread interrupted while running {0}", processBuilder.command().get(0)); 
 
  195             Thread.currentThread().interrupt();
 
  197         return process.exitValue();
 
  222                 process.waitFor(timeOut, units);
 
  223                 if (process.isAlive() && terminator.shouldTerminateProcess()) {
 
  227                     } 
catch (InterruptedException exx) {
 
  228                         Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO, String.format(
"Wait for process termination following killProcess was interrupted for command %s", command));
 
  231             } 
while (process.isAlive());
 
  232         } 
catch (InterruptedException ex) {
 
  233             if (process.isAlive()) {
 
  238             } 
catch (InterruptedException exx) {
 
  239                 Logger.
getLogger(
ExecUtil.class.getName()).log(Level.INFO, String.format(
"Wait for process termination following killProcess was interrupted for command %s", command));
 
  242             Thread.currentThread().interrupt();
 
  244         return process.exitValue();
 
  253         if (process == null) {
 
  260                 List<Win32Process> children = parentProcess.
getChildren();
 
  262                 children.stream().forEach((child) -> {
 
  267                 process.destroyForcibly();
 
  269         } 
catch (Exception ex) {
 
  270             logger.log(Level.WARNING, 
"Error occurred when attempting to kill process: {0}", ex.getMessage()); 
 
  292     public synchronized String 
execute(
final String aCommand, 
final String... params) throws IOException, InterruptedException {
 
  294         String[] arrayCommand = 
new String[params.length + 1];
 
  295         arrayCommand[0] = aCommand;
 
  297         StringBuilder arrayCommandToLog = 
new StringBuilder();
 
  298         arrayCommandToLog.append(aCommand).append(
" ");
 
  300         for (
int i = 1; i < arrayCommand.length; i++) {
 
  301             arrayCommand[i] = params[i - 1];
 
  302             arrayCommandToLog.append(arrayCommand[i]).append(
" ");
 
  305         final Runtime rt = Runtime.getRuntime();
 
  306         logger.log(Level.INFO, 
"Executing {0}", arrayCommandToLog.toString()); 
 
  308         proc = rt.exec(arrayCommand);
 
  319         this.exitValue = proc.waitFor();
 
  339     public synchronized void execute(
final Writer stdoutWriter, 
final String aCommand, 
final String... params) throws IOException, InterruptedException {
 
  342         String[] arrayCommand = 
new String[params.length + 1];
 
  343         arrayCommand[0] = aCommand;
 
  345         StringBuilder arrayCommandToLog = 
new StringBuilder();
 
  346         arrayCommandToLog.append(aCommand).append(
" ");
 
  348         for (
int i = 1; i < arrayCommand.length; i++) {
 
  349             arrayCommand[i] = params[i - 1];
 
  350             arrayCommandToLog.append(arrayCommand[i]).append(
" ");
 
  353         final Runtime rt = Runtime.getRuntime();
 
  354         logger.log(Level.INFO, 
"Executing {0}", arrayCommandToLog.toString()); 
 
  356         proc = rt.exec(arrayCommand);
 
  367         this.exitValue = proc.waitFor();
 
  368         logger.log(Level.INFO, 
"{0} exit value: {1}", 
new Object[]{aCommand, exitValue}); 
 
  382     public synchronized void stop() {
 
  425         private final InputStream 
is;
 
  426         private final StringBuffer 
output = 
new StringBuffer();
 
  427         private volatile boolean doRun = 
false;
 
  442             final String SEP = System.getProperty(
"line.separator");
 
  443             InputStreamReader isr;
 
  444             BufferedReader br = null;
 
  446                 isr = 
new InputStreamReader(this.is);
 
  447                 br = 
new BufferedReader(isr);
 
  449                 while (doRun && (line = br.readLine()) != null) {
 
  450                     this.output.append(line).append(SEP);
 
  452             } 
catch (
final IOException ex) {
 
  453                 logger.log(Level.WARNING, 
"Error redirecting stream to string buffer", ex); 
 
  458                     } 
catch (IOException ex) {
 
  459                         logger.log(Level.SEVERE, 
"Error closing stream reader", ex); 
 
  480             return this.output.toString();
 
  495         private final InputStream 
is;
 
  496         private volatile boolean doRun = 
false;
 
  513             final String SEP = System.getProperty(
"line.separator");
 
  514             InputStreamReader isr;
 
  515             BufferedReader br = null;
 
  517                 isr = 
new InputStreamReader(this.is);
 
  518                 br = 
new BufferedReader(isr);
 
  520                 while (doRun && (line = br.readLine()) != null) {
 
  521                     writer.append(line).append(SEP);
 
  523             } 
catch (
final IOException ex) {
 
  524                 logger.log(Level.SEVERE, 
"Error reading output and writing to file writer", ex); 
 
  534                 } 
catch (IOException ex) {
 
  535                     logger.log(Level.SEVERE, 
"Error flushing file writer", ex); 
 
ExecUtil.StreamToStringRedirect errorStringRedirect
 
final long startTimeInSeconds
 
static int execute(ProcessBuilder processBuilder, ProcessTerminator terminator)
 
final long maxRunTimeInSeconds
 
static int waitForTermination(String command, Process process, long timeOut, TimeUnit units, ProcessTerminator terminator)
 
ExecUtil.StreamToWriterRedirect outputWriterRedirect
 
static final long DEFAULT_TIMEOUT
 
static int execute(ProcessBuilder processBuilder)
 
static int getProcessTimeOutHrs()
 
static final TimeUnit DEFAULT_TIMEOUT_UNITS
 
synchronized void execute(final Writer stdoutWriter, final String aCommand, final String...params)
 
static int waitForTermination(String command, Process process, ProcessTerminator terminator)
 
TimedProcessTerminator(long maxRunTimeInSeconds)
 
ExecUtil.StreamToStringRedirect outputStringRedirect
 
static void killProcess(Process process)
 
List< Win32Process > getChildren()
 
static boolean getIsTimeOutEnabled()
 
synchronized int getExitValue()
 
synchronized static Logger getLogger(String name)
 
static int execute(ProcessBuilder processBuilder, long timeOut, TimeUnit units, ProcessTerminator terminator)
 
boolean shouldTerminateProcess()
 
static final Logger logger
 
final StringBuffer output
 
synchronized String execute(final String aCommand, final String...params)
 
boolean shouldTerminateProcess()
 
boolean shouldTerminateProcess()