using System;
using System.IO;
using System.Text;
using System.Diagnostics;
using System.Collections.Generic;
namespace AniNIX.Shared {
public static class ExecuteCommand {
// Allow anyone using this class to modify the timeout at will.
public static int TimeOut = 5000;
///
/// This method allows a CSharp app to execute a command on the OS.
///
/// The command string to run as the string argument to "bash -c 'command'"
/// The effective replacement for the command's stdinThe stdout of the command
///
public static String Run(String command, String input) {
//Sanitize inputs.
command = command.Replace("\\'","'").Replace("'","\\'");
//Create process.
Process proc = new Process();
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.FileName = "/bin/bash";
proc.StartInfo.Arguments = String.Format("-c \'{0}\'",command);
proc.StartInfo.UseShellExecute=false;
ReportMessage.Log(Verbosity.VeryVerbose,String.Format("{0} {1}",proc.StartInfo.FileName,proc.StartInfo.Arguments));
//Redirect input
proc.StartInfo.RedirectStandardOutput=true;
proc.StartInfo.RedirectStandardInput=true;
//Start process
proc.Start();
//Add input and read output.
proc.StandardInput.Write(input);
proc.StandardInput.Close();
proc.WaitForExit(TimeOut);
if (!proc.HasExited) {
proc.Kill();
}
if (proc.ExitCode != 0) {
throw new Exception(String.Format("Failed to exit command with return code {0}",proc.ExitCode));
}
String stdoutString = proc.StandardOutput.ReadToEnd();
//Close up and return
proc.Close();
return stdoutString;
}
//Add polymorphism to allow no stdin
public static String Run(String command) {
return Run(command,null);
}
}
}