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);
            }
Пример #2
0
        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);
        }
Пример #4
0
 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();
     }
 }