示例#1
0
 private static int ProgramExecutionResultHandler(ExternalProgramExecutor externalProgramExecutor, Options options, Guid executionId, string commandLineExecutionAsString)
 {
     try
     {
         int result;
         if (externalProgramExecutor.ProcessWasAbortedDueToTimeout)
         {
             result = ExitCodeTimeout;
         }
         else
         {
             result = externalProgramExecutor.ExitCode;
         }
         WriteToFile(options.StdOutFile, externalProgramExecutor.AllStdOutLines);
         WriteToFile(options.StdErrFile, externalProgramExecutor.AllStdErrLines);
         WriteNumberToFile(options.Verbosity, executionId, _Title, commandLineExecutionAsString, result, "exit-code", options.ExitCodeFile);
         return(result);
     }
     finally
     {
         externalProgramExecutor.Dispose();
     }
 }
示例#2
0
文件: Program.cs 项目: anionDev/Epew
        internal static int Main(string[] args)
        {
            int exitCode = -1;

            new Parser(settings => settings.CaseInsensitiveEnumValues = true).ParseArguments <Options>(args).WithParsed(options =>
            {
                string line      = "--------------------------------------------------------------------";
                string version   = Assembly.GetExecutingAssembly().GetName().Version.ToString();
                Guid executionId = Guid.NewGuid();
                GRYLibrary.Core.Log.GRYLog log = GRYLibrary.Core.Log.GRYLog.Create();
                log.Configuration.ResetToDefaultValues();
                ExternalProgramExecutor externalProgramExecutor = null;
                try
                {
                    string argument;
                    if (options.ArgumentIsBase64Encoded)
                    {
                        argument = new UTF8Encoding(false).GetString(Convert.FromBase64String(options.Argument));
                    }
                    else
                    {
                        argument = options.Argument;
                    }
                    string commandLineExecutionAsString = $"'{options.Workingdirectory}>{options.Program} {argument}'";
                    string title;
                    string shortTitle;
                    if (string.IsNullOrWhiteSpace(options.Title))
                    {
                        title      = nameof(ExternalProgramExecutor) + ": " + commandLineExecutionAsString;
                        shortTitle = string.Empty;
                    }
                    else
                    {
                        title      = options.Title;
                        shortTitle = title;
                    }
                    TrySetTitle(title);
                    log.Configuration.Name = shortTitle;
                    if (options.LogFile != null)
                    {
                        log.Configuration.GetLogTarget <LogFile>().Enabled = true;
                        log.Configuration.GetLogTarget <LogFile>().File    = options.LogFile;
                    }
                    if (options.AddLogOverhead)
                    {
                        log.Configuration.Format = GRYLibrary.Core.Log.GRYLogLogFormat.GRYLogFormat;
                    }
                    else
                    {
                        log.Configuration.Format = GRYLibrary.Core.Log.GRYLogLogFormat.OnlyMessage;
                    }
                    log.Configuration.SetEnabledOfAllLogTargets(options.Verbosity != Verbosity.Quiet);
                    if (options.Verbosity == Verbosity.Verbose)
                    {
                        foreach (GRYLibrary.Core.Log.GRYLogTarget target in log.Configuration.LogTargets)
                        {
                            log.Configuration.GetLogTarget <GRYLibrary.Core.Log.ConcreteLogTargets.Console>().LogLevels.Add(Microsoft.Extensions.Logging.LogLevel.Debug);
                            log.Configuration.GetLogTarget <GRYLibrary.Core.Log.ConcreteLogTargets.Console>().LogLevels.Add(Microsoft.Extensions.Logging.LogLevel.Debug);
                        }
                    }
                    string commandLineArguments = Utilities.GetCommandLineArguments();
                    log.Log(line, Microsoft.Extensions.Logging.LogLevel.Debug);
                    DateTime startTime       = DateTime.Now;
                    string startTimeAsString = startTime.ToString(log.Configuration.DateFormat);
                    log.Log($"{nameof(ExternalProgramExecutor)} v{version} started at " + startTimeAsString, Microsoft.Extensions.Logging.LogLevel.Debug);
                    log.Log($"Execution-Id: {executionId}", Microsoft.Extensions.Logging.LogLevel.Debug);
                    log.Log($"Argument: '{commandLineArguments}'", Microsoft.Extensions.Logging.LogLevel.Debug);
                    log.Log($"Start executing {commandLineExecutionAsString}", Microsoft.Extensions.Logging.LogLevel.Debug);
                    externalProgramExecutor = ExternalProgramExecutor.CreateByGRYLog(options.Program, argument, log, options.Workingdirectory, shortTitle, options.PrintErrorsAsInformation, options.TimeoutInMilliseconds);
                    externalProgramExecutor.RunAsAdministrator            = options.RunAsAdministrator;
                    externalProgramExecutor.ThrowErrorIfExitCodeIsNotZero = false;
                    exitCode = externalProgramExecutor.StartConsoleApplicationInCurrentConsoleWindow();
                    WriteToFile(options.StdOutFile, externalProgramExecutor.AllStdOutLines);
                    WriteToFile(options.StdErrFile, externalProgramExecutor.AllStdErrLines);

                    List <string> exitCodeFileContent = new List <string>();
                    if (options.Verbosity == Verbosity.Verbose)
                    {
                        exitCodeFileContent.Add($"{startTimeAsString}: Started {commandLineExecutionAsString} with exitcode");
                    }
                    exitCodeFileContent.Add(externalProgramExecutor.ExitCode.ToString());
                    WriteToFile(options.ExitCodeFile, exitCodeFileContent.ToArray());
                }
                catch (Exception exception)
                {
                    log.Log("Error in " + nameof(ExternalProgramExecutor), exception);
                }
                if (externalProgramExecutor != null)
                {
                    log.Log(nameof(ExternalProgramExecutor) + " finished", Microsoft.Extensions.Logging.LogLevel.Debug);
                    log.Log($"Execution-Id: {executionId}", Microsoft.Extensions.Logging.LogLevel.Debug);
                    if (externalProgramExecutor.ExecutionState == ExecutionState.Terminated)
                    {
                        log.Log($"Exit-code: {exitCode}", Microsoft.Extensions.Logging.LogLevel.Debug);
                        log.Log($"Duration: {Utilities.DurationToUserFriendlyString(externalProgramExecutor.ExecutionDuration)}", Microsoft.Extensions.Logging.LogLevel.Debug);
                    }
                    log.Log(line, Microsoft.Extensions.Logging.LogLevel.Debug);
                }
            });
            return(exitCode);
        }
 private static string GetMessage(ExternalProgramExecutor externalProgramExecutor)
 {
     return($"'{externalProgramExecutor.Title}' had exitcode {externalProgramExecutor.ExitCode}.{Environment.NewLine}{Environment.NewLine}{externalProgramExecutor.GetSummaryOfExecutedProgram()}");
 }
 public UnexpectedExitCodeException(ExternalProgramExecutor externalProgramExecutor) : base(GetMessage(externalProgramExecutor))
 {
     this.ExecutedProgram = externalProgramExecutor;
 }
示例#5
0
        private static int ProcessArguments(Options options, int initialExitCodeValue)
        {
            Guid executionId = Guid.NewGuid();
            int  result      = initialExitCodeValue;

            try
            {
                RemoveQuotes(options);
                string argumentForExecution;
                if (options.ArgumentIsBase64Encoded)
                {
                    argumentForExecution = new UTF8Encoding(false).GetString(Convert.FromBase64String(options.Argument));
                }
                else
                {
                    if (string.IsNullOrWhiteSpace(options.Argument))
                    {
                        argumentForExecution = string.Empty;
                    }
                    else
                    {
                        argumentForExecution = options.Argument;
                    }
                }
                string workingDirectory;
                if (string.IsNullOrWhiteSpace(options.Workingdirectory))
                {
                    workingDirectory = Directory.GetCurrentDirectory();
                }
                else
                {
                    if (Directory.Exists(options.Workingdirectory))
                    {
                        workingDirectory = options.Workingdirectory;
                    }
                    else
                    {
                        throw new ArgumentException($"The specified workingdirectory '{options.Workingdirectory}' does not exist.");
                    }
                }
                if (string.IsNullOrWhiteSpace(options.Program))
                {
                    throw new ArgumentException($"No program to execute specified.");
                }

                string commandLineExecutionAsString = $"'{workingDirectory}>{options.Program} {argumentForExecution}'";
                if (string.IsNullOrWhiteSpace(options.Title))
                {
                    _Title = $"{ProgramName}: {commandLineExecutionAsString}";
                }
                else
                {
                    _Title = options.Title;
                }
                if (!string.IsNullOrWhiteSpace(options.LogFile))
                {
                    _Log.Configuration.GetLogTarget <LogFile>().Enabled = true;
                    _Log.Configuration.GetLogTarget <LogFile>().File    = options.LogFile;
                }
                foreach (GRYLogTarget target in _Log.Configuration.LogTargets)
                {
                    target.Format = options.AddLogOverhead ? GRYLogLogFormat.GRYLogFormat : GRYLogLogFormat.OnlyMessage;
                }
                string commandLineArguments = Utilities.GetCommandLineArguments();
                _ExternalProgramExecutor = new ExternalProgramExecutor(options.Program, argumentForExecution, workingDirectory)
                {
                    LogObject                     = _Log,
                    LogNamespace                  = options.LogNamespace,
                    PrintErrorsAsInformation      = options.PrintErrorsAsInformation,
                    TimeoutInMilliseconds         = options.TimeoutInMilliseconds,
                    ThrowErrorIfExitCodeIsNotZero = false,
                    Verbosity                     = options.Verbosity
                };


                if (options.NotSynchronous)
                {
                    _ExternalProgramExecutor.StartAsynchronously();
                    new Task(() =>
                    {
                        _ExternalProgramExecutor.WaitUntilTerminated();
                        ProgramExecutionResultHandler(_ExternalProgramExecutor, options, executionId, commandLineExecutionAsString);
                    }).Start();
                    result = _ExternalProgramExecutor.ProcessId;
                }
                else
                {
                    _ExternalProgramExecutor.StartSynchronously();
                    result = ProgramExecutionResultHandler(_ExternalProgramExecutor, options, executionId, commandLineExecutionAsString);
                }
                WriteNumberToFile(options.Verbosity, executionId, _Title, commandLineExecutionAsString, _ExternalProgramExecutor.ProcessId, "process-id", options.ProcessIdFile);
            }
            catch (Exception exception)
            {
                _Log.Log($"Error in {ProgramName}.", exception);
            }
            return(result);
        }
示例#6
0
        private int HandleSuccessfullyParsedArguments(EpewOptions options)
        {
            Guid executionId = Guid.NewGuid();
            int  result      = ExitCodeNoProgramExecuted;

            try
            {
                RemoveQuotes(options);
                string argumentForExecution;
                if (options.ArgumentIsBase64Encoded)
                {
                    argumentForExecution = new UTF8Encoding(false).GetString(Convert.FromBase64String(options.Argument));
                }
                else
                {
                    if (string.IsNullOrWhiteSpace(options.Argument))
                    {
                        argumentForExecution = string.Empty;
                    }
                    else
                    {
                        argumentForExecution = options.Argument;
                    }
                }
                string workingDirectory;
                if (string.IsNullOrWhiteSpace(options.Workingdirectory))
                {
                    workingDirectory = Directory.GetCurrentDirectory();
                }
                else
                {
                    if (Directory.Exists(options.Workingdirectory))
                    {
                        workingDirectory = options.Workingdirectory;
                    }
                    else
                    {
                        throw new ArgumentException($"The specified workingdirectory '{options.Workingdirectory}' does not exist.");
                    }
                }
                if (string.IsNullOrWhiteSpace(options.Program))
                {
                    throw new ArgumentException($"No program to execute specified.");
                }

                string commandLineExecutionAsString = $"'{workingDirectory}>{options.Program} {argumentForExecution}'";
                if (string.IsNullOrWhiteSpace(options.Title))
                {
                    _Title = $"{ProgramName}: {commandLineExecutionAsString}";
                }
                else
                {
                    _Title = options.Title;
                }
                if (!string.IsNullOrWhiteSpace(options.LogFile))
                {
                    _Log.Configuration.GetLogTarget <LogFile>().Enabled = true;
                    _Log.Configuration.GetLogTarget <LogFile>().File    = options.LogFile;
                }
                foreach (GRYLogTarget target in _Log.Configuration.LogTargets)
                {
                    target.Format = options.AddLogOverhead ? GRYLogLogFormat.GRYLogFormat : GRYLogLogFormat.OnlyMessage;
                }
                string commandLineArguments = Utilities.GetCommandLineArguments();

                _ExternalProgramExecutor = new ExternalProgramExecutor(new ExternalProgramExecutorConfiguration()
                {
                    Program          = options.Program,
                    Argument         = argumentForExecution,
                    WorkingDirectory = workingDirectory,
                    Verbosity        = options.Verbosity,
                    User             = options.User,
                    Password         = options.Password,
                });

                _ExternalProgramExecutor.Run();

                WriteNumberToFile(options.Verbosity, executionId, _Title, commandLineExecutionAsString, _ExternalProgramExecutor.ProcessId, "process-id", options.ProcessIdFile);
                if (options.NotSynchronous)
                {
                    return(2147393804);
                }
                else
                {
                    new Task(() =>
                    {
                        _ExternalProgramExecutor.WaitUntilTerminated();
                        ProgramExecutionResultHandler(_ExternalProgramExecutor, options, executionId, commandLineExecutionAsString);
                    }).Start();
                    result = _ExternalProgramExecutor.ExitCode;
                }
            }
            catch (Exception exception)
            {
                _Log.Log($"Error in {ProgramName}.", exception);
            }
            return(result);
        }