public void It_Should_Generate_An_Email_Message() { var scriptRunResult = new ScriptRunResultModel { UserName = "******", ScriptKey = "test-script-1", ScriptStartedAt = new DateTime(2015, 12, 11, 12, 0, 0), ScriptEndedAt = new DateTime(2015, 12, 11, 12, 0, 3), ScriptOutput = new List <ScriptOutputModel> { new ScriptOutputStdModel { Timestamp = new DateTime(2015, 12, 11, 12, 0, 1), Value = "output 1" }, new ScriptOutputStdModel { Timestamp = new DateTime(2015, 12, 11, 12, 0, 2), Value = "output 2" } } }; var emailMessage = _scriptRunEmailBuilder.Build(scriptRunResult); Assert.AreEqual("*****@*****.**", emailMessage.From.Address); Assert.AreEqual("subject - user-1 - test-script-1", emailMessage.Subject); Assert.AreEqual(JsonConvert.SerializeObject(scriptRunResult, Formatting.Indented), emailMessage.Body); Assert.AreEqual(3, emailMessage.To.Count); Assert.AreEqual("*****@*****.**", emailMessage.To[0].Address); Assert.AreEqual("*****@*****.**", emailMessage.To[1].Address); Assert.AreEqual("*****@*****.**", emailMessage.To[2].Address); }
public ScriptRunResultModel RunScript(string userName, ScriptModel targetScript) { var elapsedDelayFromScriptLastRun = GetElapsedDelayFromScriptLastRun(targetScript); if (elapsedDelayFromScriptLastRun > targetScript.Delay) { UpdateScriptLastRun(targetScript); var scriptRunResult = new ScriptRunResultModel { UserName = userName, ScriptKey = targetScript.Key, ScriptStartedAt = DateTime.Now, ScriptOutput = new List <ScriptOutputModel>() }; var proc = new Process { StartInfo = new ProcessStartInfo { FileName = targetScript.Path, Arguments = targetScript.Arguments, UseShellExecute = false, CreateNoWindow = true, RedirectStandardOutput = true, RedirectStandardError = true }, }; using (var outputDataHandle = new AutoResetEvent(false)) { using (var errorDataHandle = new AutoResetEvent(false)) { proc.OutputDataReceived += (sender, args) => OnOutputDataReceived(args, outputDataHandle, scriptRunResult); proc.ErrorDataReceived += (sender, args) => OnErrorDataReceived(args, errorDataHandle, scriptRunResult); proc.Start(); proc.BeginOutputReadLine(); proc.BeginErrorReadLine(); if (proc.WaitForExit(targetScript.Timeout * 1000) && outputDataHandle.WaitOne() && errorDataHandle.WaitOne()) { scriptRunResult.ScriptTermination = ScriptTermination.ExecutionFinished; } else { scriptRunResult.ScriptTermination = ScriptTermination.TimeoutExpired; proc.Kill(); } scriptRunResult.ScriptExitCode = proc.ExitCode; scriptRunResult.ScriptEndedAt = DateTime.Now; } } return(scriptRunResult); } throw new DelayNotExpiredException { RemainingDelay = targetScript.Delay - elapsedDelayFromScriptLastRun }; }
public MailMessage Build(ScriptRunResultModel scriptRunResult) { var emailMessage = new MailMessage { From = new MailAddress(_config.EmailSender), Subject = _config.EmailSubject .Replace("{userName}", scriptRunResult.UserName) .Replace("{scriptKey}", scriptRunResult.ScriptKey) .Replace("{exitCode}", scriptRunResult.ScriptExitCode.ToString()), Body = JsonConvert.SerializeObject(scriptRunResult, Formatting.Indented), }; _config.EmailRecipients.ToList().ForEach(emailRecipient => emailMessage.To.Add(emailRecipient)); return(emailMessage); }
private static void OnOutputDataReceived(DataReceivedEventArgs args, AutoResetEvent dataHandle, ScriptRunResultModel scriptRunResult) { if (args.Data != null) { ((IList <ScriptOutputModel>)scriptRunResult.ScriptOutput).Add(new ScriptOutputStdModel { Timestamp = DateTime.Now, Value = args.Data }); } else { dataHandle.Set(); } }