コード例 #1
0
ファイル: GrimoireRunner.cs プロジェクト: Kelvysb/Grimoire
        private async Task <ScriptResult> ExecutePowerShell(GrimoireScriptBlock scriptBlock, IList <Input> inputs)
        {
            ScriptResult result = null;
            string       script = await business.ReadScript(scriptBlock);

            if (inputs != null && inputs.Any())
            {
                foreach (var input in inputs)
                {
                    script = script.Replace(input.Key, input.Value);
                }
            }

            using (PowerShell ps = PowerShell.Create())
            {
                PSDataCollection <PSObject> outputCollection = new PSDataCollection <PSObject>();
                ps.AddScript("Set-ExecutionPolicy -Scope Process Unrestricted");
                ps.AddScript(script);
                IAsyncResult execResult = await Task.Run(() =>
                                                         ps.BeginInvoke <PSObject, PSObject>(null, outputCollection));

                WaitExecution(scriptBlock.TimeOut, execResult);
                result = GetResult(scriptBlock, ps);
            }

            return(result);
        }
コード例 #2
0
 public string getScriptFullPath(GrimoireScriptBlock scriptBlock)
 {
     return(Path.GetFullPath(
                Path.Combine(configurationService.ScriptsDirectory,
                             scriptBlock.Name,
                             scriptBlock.Script)));
 }
コード例 #3
0
ファイル: GrimoireRunner.cs プロジェクト: Kelvysb/Grimoire
        private ResultType GetResultStatus(GrimoireScriptBlock scriptBlock, PowerShell ps, string rawResult)
        {
            ResultType result = ResultType.None;

            if (String.IsNullOrEmpty(scriptBlock.SuccessPatern) && ps.Streams.Error.Any() && scriptBlock.AlertLevel != AlertLevel.Silent)
            {
                result = scriptBlock.AlertLevel == AlertLevel.Error ? ResultType.Error : ResultType.Warning;
            }
            else if (String.IsNullOrEmpty(scriptBlock.SuccessPatern) && ps.Streams.Warning.Any() && scriptBlock.AlertLevel != AlertLevel.Silent)
            {
                result = ResultType.Warning;
            }
            else
            {
                if (Regex.IsMatch(rawResult, scriptBlock.SuccessPatern))
                {
                    result = ResultType.Success;
                }
                else if (scriptBlock.AlertLevel != AlertLevel.Silent)
                {
                    result = scriptBlock.AlertLevel == AlertLevel.Error ? ResultType.Error : ResultType.Warning;
                }
            }
            return(result);
        }
コード例 #4
0
ファイル: BusinessTests.cs プロジェクト: Kelvysb/Grimoire
        public void VaultExecutionTest()
        {
            GrimoireScriptBlock script = TestHelper.GetSingleTestScript();

            script.ExtractResult = new PatternRange()
            {
                Start = "", End = ""
            };
            business.SaveScriptBlock(script).Wait();
            GrimoireScriptBlock result = TestHelper.GetCreatedScript(config, "Test_Script.json");

            result.Should().NotBeNull();
            savedVault.Itens = new List <VaultItem>();
            savedVault.Itens.Add(new VaultItem(true, "Key 1", "value 1"));
            savedVault.Itens.Add(new VaultItem(true, "Key 2", "value 2"));
            savedVault.Itens.Add(new VaultItem(true, "Key 3", "value 3"));
            business.LoadVault();
            business.LoadScriptRunners().Wait();
            ScriptResult scriptResult = business.ScriptRunners.First().Run().Result;

            scriptResult.Should().NotBeNull();
            scriptResult.ResultType.Should().Be(ResultType.Success);
            scriptResult.FilteredResult.Should()
            .Contain("Single line multiple keys: value 1 - value 2")
            .And
            .Contain("Single key: value 3");
            savedVault.Itens = new List <VaultItem>();
        }
コード例 #5
0
ファイル: ScriptEditView.cs プロジェクト: Kelvysb/Grimoire
 public ScriptEditView(int X) : base("New Script")
 {
     ScriptBlock = new GrimoireScriptBlock()
     {
         Name          = "",
         Description   = "",
         ExecutionMode = ExecutionMode.Manual,
         Interval      = 0,
         AlertLevel    = AlertLevel.Error,
         ScriptType    = ScriptType.PowerShell,
         SuccessPatern = "",
         TimeOut       = 10,
         Script        = "",
         Group         = "",
         ExtractResult = new PatternRange()
         {
             Start = "", End = ""
         }
     };
     this.ColorScheme = Styles.DetailsScheme;
     this.X           = X;
     Y      = 0;
     Height = Dim.Fill();
     Width  = Dim.Fill();
     Draw();
 }
コード例 #6
0
ファイル: ScriptEditBase.cs プロジェクト: Kelvysb/Grimoire
        private async Task InitializeScriptBlock()
        {
            try
            {
                if (!string.IsNullOrEmpty(ScriptName))
                {
                    ScriptBlock = await Business.GetScriptBlock(ScriptName);

                    IsEdit = true;
                }
                else
                {
                    ScriptBlock = new GrimoireScriptBlock()
                    {
                        Name          = "",
                        Description   = "",
                        AlertLevel    = AlertLevel.Error,
                        ExtractResult = new PatternRange()
                        {
                            Start = "", End = ""
                        },
                        Group              = "",
                        Interval           = 30,
                        Order              = 0,
                        OriginalScriptFile = null,
                        AdditionalFiles    = new List <AdditionalFile>(),
                        Script             = "",
                        ScriptBlocks       = null,
                        ScriptType         = ScriptType.PowerShell,
                        SuccessPatern      = "",
                        TimeOut            = 10,
                        ExecutionMode      = ExecutionMode.Manual
                    };
                    IsEdit = false;
                }
                if (ScriptBlock != null)
                {
                    ScriptTypeHolder = ScriptBlock.ScriptType.ToString();
                    AlertLevelHolder = ScriptBlock.AlertLevel.ToString();
                    switch (ScriptBlock.ExecutionMode)
                    {
                    case ExecutionMode.RunOnStart:
                        ExecutionModeHolder = "Run on start";
                        break;

                    case ExecutionMode.Interval:
                        ExecutionModeHolder = "Interval";
                        break;

                    default:
                        ExecutionModeHolder = "Manual";
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                await Task.Run(() => Error?.Invoke("Error loading the script.", ex));
            }
        }
コード例 #7
0
ファイル: GrimoireRunner.cs プロジェクト: Kelvysb/Grimoire
        private ScriptResult GetResult(GrimoireScriptBlock scriptBlock, PowerShell ps)
        {
            ScriptResult result = MountResults(ps);

            result.ResultType     = GetResultStatus(scriptBlock, ps, result.RawResult);
            result.FilteredResult = ExtractFilteredResult(scriptBlock, result.RawResult);
            return(result);
        }
コード例 #8
0
ファイル: BusinessTests.cs プロジェクト: Kelvysb/Grimoire
        public void SaveScriptBlockTest()
        {
            GrimoireScriptBlock script = TestHelper.GetSingleTestScript();

            business.SaveScriptBlock(script).Wait();
            GrimoireScriptBlock result = TestHelper.GetCreatedScript(config, "Test_Script.json");

            result.Should().NotBeNull();
        }
コード例 #9
0
ファイル: MainWindow.cs プロジェクト: Kelvysb/Grimoire
        private void EndEdit(GrimoireScriptBlock scriptBlock)
        {
            LoadScripts();
            IGrimoireRunner editedScript = business.ScriptRunners
                                           .FirstOrDefault(item => item.ScriptBlock.Name.Equals(scriptBlock.Name,
                                                                                                StringComparison.InvariantCultureIgnoreCase));

            SelectScript(editedScript);
        }
コード例 #10
0
ファイル: GrimoireRunner.cs プロジェクト: Kelvysb/Grimoire
 public GrimoireRunner(GrimoireScriptBlock scriptBlock, IGrimoireBusiness business)
 {
     Selected      = false;
     Paused        = false;
     this.business = business;
     ScriptBlock   = scriptBlock;
     Task.Run(() => TimerRun());
     CheckRunOnStart();
 }
コード例 #11
0
ファイル: GrimoireRunner.cs プロジェクト: Kelvysb/Grimoire
        private string ExtractFilteredResult(GrimoireScriptBlock scriptBlock, string rawResult)
        {
            string result = rawResult;

            if (scriptBlock.ExtractResult != null && !String.IsNullOrEmpty(scriptBlock.ExtractResult.Start) && !String.IsNullOrEmpty(scriptBlock.ExtractResult.End))
            {
                result = FindResultMatch(scriptBlock, rawResult);
            }
            return(result);
        }
コード例 #12
0
        public void SaveScriptTest()
        {
            GrimoireScriptBlock script = TestHelper.GetSingleTestScript();

            service.SaveScriptBlocks(script);
            GrimoireScriptBlock result = TestHelper.GetCreatedScript(config, "Test_Script.json");

            result.Should().NotBeNull();
            TestHelper.CheckCreatedScript(config, result.Name, result.Script).Should().BeTrue();
        }
コード例 #13
0
ファイル: ScriptEditView.cs プロジェクト: Kelvysb/Grimoire
 public ScriptEditView(IGrimoireRunner scriptBlockRunner, int X) : base($"Edit - {scriptBlockRunner.ScriptBlock.Description}")
 {
     ScriptBlock      = scriptBlockRunner.ScriptBlock;
     this.ColorScheme = Styles.DetailsScheme;
     this.X           = X;
     Y      = 0;
     Height = Dim.Fill();
     Width  = Dim.Fill();
     Draw();
 }
コード例 #14
0
ファイル: GrimoireRunner.cs プロジェクト: Kelvysb/Grimoire
 private async Task <ScriptResult> ExecuteScript(GrimoireScriptBlock scriptBlock, IList <Input> inputs)
 {
     try
     {
         return(await RunScriptBlock(scriptBlock, inputs));
     }
     catch (Exception ex)
     {
         return(await CreateErrorResult(scriptBlock, ex));
     }
 }
コード例 #15
0
        public void SaveScriptBlocks(GrimoireScriptBlock scriptBlock)
        {
            scriptBlock.Name = CleanResourceName(scriptBlock.Name);
            string resourcePath       = Path.Combine(configurationService.ScriptsDirectory, $"{scriptBlock.Name}.json");
            string resourceFolderPath = Path.Combine(configurationService.ScriptsDirectory, scriptBlock.Name);
            string scriptPath         = Path.Combine(resourceFolderPath, scriptBlock.Script);

            EnsurePath(resourceFolderPath);
            SaveResource(scriptBlock, resourcePath);
            SaveScriptFile(scriptBlock, scriptPath);
            SaveAdditionalFiles(scriptBlock, resourceFolderPath);
        }
コード例 #16
0
ファイル: GrimoireRunner.cs プロジェクト: Kelvysb/Grimoire
        private string FindResultMatch(GrimoireScriptBlock scriptBlock, string rawResult)
        {
            string result;
            Match  match      = Regex.Match(rawResult, scriptBlock.ExtractResult.Start);
            int    startIndex = match.Index + match.Length;

            match = Regex.Match(rawResult, scriptBlock.ExtractResult.End);
            int endIndex = match.Index;

            result = rawResult.Substring(startIndex, endIndex - startIndex);
            return(result);
        }
コード例 #17
0
 private void SaveScriptFile(GrimoireScriptBlock scriptBlock, string scriptPath)
 {
     if (scriptBlock.OriginalScriptFile != null)
     {
         using (FileStream file = File.Create(scriptPath))
         {
             scriptBlock.OriginalScriptFile.Seek(0, SeekOrigin.Begin);
             scriptBlock.OriginalScriptFile.CopyTo(file);
             file.Close();
         }
     }
 }
コード例 #18
0
        public void RemoveScriptTest()
        {
            GrimoireScriptBlock script = TestHelper.GetSingleTestScript();

            service.SaveScriptBlocks(script);
            GrimoireScriptBlock inserted = TestHelper.GetCreatedScript(config, "Test_Script.json");

            inserted.Should().NotBeNull();
            service.RemoveScriptBlock(inserted.Name);
            GrimoireScriptBlock result = TestHelper.GetCreatedScript(config, "Test_Script.json");

            result.Should().BeNull();
        }
コード例 #19
0
ファイル: GrimoireRunner.cs プロジェクト: Kelvysb/Grimoire
        private async Task <ScriptResult> CreateErrorResult(GrimoireScriptBlock scriptBlock, Exception ex)
        {
            ScriptResult result = new ScriptResult()
            {
                ResultType = ResultType.Error,
                Errors     = ex.Message
            };

            scriptBlock.LastResult = result;
            await business.SaveScriptBlock(scriptBlock);

            return(scriptBlock.LastResult);
        }
コード例 #20
0
ファイル: TestHelper.cs プロジェクト: Kelvysb/Grimoire
        public static GrimoireScriptBlock GetCreatedScript(IConfigurationService config, string scriptFileName)
        {
            GrimoireScriptBlock result = null;

            if (File.Exists(Path.Combine(config.ScriptsDirectory, scriptFileName)))
            {
                using (StreamReader reader = new StreamReader(Path.Combine(config.ScriptsDirectory, scriptFileName)))
                {
                    string file = reader.ReadToEnd();
                    reader.Close();
                    result = JsonSerializer.Deserialize <GrimoireScriptBlock>(file);
                }
            }
            return(result);
        }
コード例 #21
0
ファイル: BusinessTests.cs プロジェクト: Kelvysb/Grimoire
        public void ScriptExecutionDefaultWarningTest()
        {
            GrimoireScriptBlock script = TestHelper.GetDefaultWarningTestScript();

            business.SaveScriptBlock(script).Wait();
            GrimoireScriptBlock result = TestHelper.GetCreatedScript(config, "Test_Script_Warning.json");

            result.Should().NotBeNull();
            business.LoadScriptRunners().Wait();
            business.LoadVault().Wait();
            ScriptResult scriptResult = business.ScriptRunners.First().Run().Result;

            scriptResult.Should().NotBeNull();
            scriptResult.ResultType.Should().Be(ResultType.Warning);
        }
コード例 #22
0
 private void SaveAdditionalFiles(GrimoireScriptBlock scriptBlock, string resourceFolderPath)
 {
     if (scriptBlock.AdditionalFiles != null && scriptBlock.AdditionalFiles.Any())
     {
         foreach (var additionalFile in scriptBlock.AdditionalFiles)
         {
             string additionalFilePath = Path.Combine(resourceFolderPath, additionalFile.Name);
             using (FileStream file = File.Create(additionalFilePath))
             {
                 additionalFile.File.Seek(0, SeekOrigin.Begin);
                 additionalFile.File.CopyTo(file);
                 file.Close();
             }
         }
     }
 }
コード例 #23
0
ファイル: BusinessTests.cs プロジェクト: Kelvysb/Grimoire
        public void ScriptExecutionSoftErrorTest()
        {
            GrimoireScriptBlock script = TestHelper.GetSingleTestScript();

            script.AlertLevel    = AlertLevel.Error;
            script.SuccessPatern = "Soft Error";
            business.SaveScriptBlock(script).Wait();
            GrimoireScriptBlock result = TestHelper.GetCreatedScript(config, "Test_Script.json");

            result.Should().NotBeNull();
            business.LoadScriptRunners().Wait();
            business.LoadVault().Wait();
            ScriptResult scriptResult = business.ScriptRunners.First().Run().Result;

            scriptResult.Should().NotBeNull();
            scriptResult.ResultType.Should().Be(ResultType.Error);
        }
コード例 #24
0
ファイル: BusinessTests.cs プロジェクト: Kelvysb/Grimoire
        public void VerifyKeysTest()
        {
            GrimoireScriptBlock script = TestHelper.GetSingleTestScript();

            business.SaveScriptBlock(script).Wait();
            GrimoireScriptBlock result = TestHelper.GetCreatedScript(config, "Test_Script.json");

            result.Should().NotBeNull();
            business.LoadVault();
            business.VerifyKeys(script).Wait();
            savedVault.Itens.Should().HaveCount(3);
            savedVault.Itens.Should()
            .Contain(item => item.Key.Equals("Key 1"))
            .And
            .Contain(item => item.Key.Equals("Key 2"))
            .And
            .Contain(item => item.Key.Equals("Key 3"));
            savedVault.Itens = new List <VaultItem>();
        }
コード例 #25
0
ファイル: GrimoireRunner.cs プロジェクト: Kelvysb/Grimoire
        private async Task <ScriptResult> RunScriptBlock(GrimoireScriptBlock scriptBlock, IList <Input> inputs)
        {
            ScriptResult result = null;

            switch (scriptBlock.ScriptType)
            {
            case ScriptType.PowerShell:
                result = await ExecutePowerShell(scriptBlock, inputs);

                break;

            case ScriptType.Python:
                break;

            default:
                break;
            }
            scriptBlock.LastResult = result;
            await business.SaveScriptBlock(scriptBlock);

            return(result);
        }
コード例 #26
0
ファイル: BusinessTests.cs プロジェクト: Kelvysb/Grimoire
        public void ScriptExecutionSuccessTest()
        {
            GrimoireScriptBlock script = TestHelper.GetSingleTestScript();

            business.SaveScriptBlock(script).Wait();
            GrimoireScriptBlock result = TestHelper.GetCreatedScript(config, "Test_Script.json");

            result.Should().NotBeNull();
            business.LoadScriptRunners().Wait();
            business.LoadVault().Wait();
            ScriptResult scriptResult = business.ScriptRunners.First().Run().Result;

            scriptResult.Should().NotBeNull();
            scriptResult.ResultType.Should().Be(ResultType.Success);
            scriptResult.FilteredResult.Should()
            .Contain("Result 1")
            .And
            .Contain("Result 2")
            .And
            .Contain("Result 3")
            .And
            .Contain("Result 4");
        }
コード例 #27
0
ファイル: MainWindow.cs プロジェクト: Kelvysb/Grimoire
        private async void Save(GrimoireScriptBlock scriptBlock)
        {
            await business.SaveScriptBlock(scriptBlock);

            await Task.Run(() => EndEdit(scriptBlock));
        }