public async Task <GruntCommand> Input(CovenantUser user, Grunt grunt, string UserInput) { GruntCommand GruntCommand = await _context.CreateGruntCommand(new GruntCommand { Command = GetCommandFromInput(UserInput), CommandTime = DateTime.UtcNow, User = user, GruntId = grunt.Id, Grunt = grunt, CommandOutputId = 0, CommandOutput = new CommandOutput() }, _grunthub, _eventhub); try { List <ParsedParameter> parameters = ParseParameters(UserInput).ToList(); GruntTask commandTask = null; try { commandTask = await _context.GetGruntTaskByName(parameters.FirstOrDefault().Value); if (commandTask.Options.Count == 1 && new List <string> { "Command", "ShellCommand", "PowerShellCommand", "Code" }.Contains(commandTask.Options[0].Name)) { parameters = new List <ParsedParameter> { new ParsedParameter { Value = commandTask.Name, Label = "", IsLabeled = false, Position = 0 }, new ParsedParameter { Value = UserInput.Substring(UserInput.IndexOf(" ", StringComparison.Ordinal) + 1).Trim('"'), Label = "", IsLabeled = false, Position = 0 } }; } } catch (ControllerNotFoundException) { } string output = ""; if (parameters.FirstOrDefault().Value.ToLower() == "show") { output = await Show(grunt); } else if (parameters.FirstOrDefault().Value.ToLower() == "help") { output = await Help(parameters); } else if (parameters.FirstOrDefault().Value.ToLower() == "exit") { output = await Exit(grunt, GruntCommand, parameters); } else if (parameters.FirstOrDefault().Value.ToLower() == "history") { output = await History(grunt, parameters); } else if (parameters.FirstOrDefault().Value.ToLower() == "jobs") { output = await Jobs(grunt, GruntCommand, parameters); } else if (parameters.FirstOrDefault().Value.ToLower() == "note") { grunt.Note = string.Join(" ", parameters.Skip(1).Select(P => P.Value).ToArray()); await _context.EditGrunt(grunt, user, _grunthub, _eventhub); output = "Note: " + grunt.Note; } else if (commandTask != null) { parameters = parameters.Skip(1).ToList(); if (parameters.Count() < commandTask.Options.Count(O => !O.Optional)) { _context.Entry(GruntCommand).State = EntityState.Detached; GruntCommand.CommandOutput.Output = EliteConsole.PrintFormattedErrorLine(GetUsage(commandTask)); return(await _context.EditGruntCommand(GruntCommand, _grunthub, _eventhub)); } // All options begin unassigned List <bool> OptionAssignments = commandTask.Options.Select(O => false).ToList(); commandTask.Options.ForEach(O => O.Value = ""); for (int i = 0; i < parameters.Count; i++) { if (parameters[i].IsLabeled) { var option = commandTask.Options.FirstOrDefault(O => O.Name.Equals(parameters[i].Label, StringComparison.OrdinalIgnoreCase)); option.Value = parameters[i].Value; OptionAssignments[commandTask.Options.IndexOf(option)] = true; } else { GruntTaskOption nextOption = null; // Find next unassigned option for (int j = 0; j < commandTask.Options.Count; j++) { if (!OptionAssignments[j]) { nextOption = commandTask.Options[j]; OptionAssignments[j] = true; break; } } if (nextOption == null) { // This is an extra parameter _context.Entry(GruntCommand).State = EntityState.Detached; GruntCommand.CommandOutput.Output = EliteConsole.PrintFormattedErrorLine(GetUsage(commandTask)); return(await _context.EditGruntCommand(GruntCommand, _grunthub, _eventhub)); } nextOption.Value = parameters[i].Value; } } // Check for unassigned required options for (int i = 0; i < commandTask.Options.Count; i++) { if (!OptionAssignments[i] && !commandTask.Options[i].Optional) { // This is an extra parameter StringBuilder toPrint = new StringBuilder(); toPrint.Append(EliteConsole.PrintFormattedErrorLine(commandTask.Options[i].Name + " is required.")); toPrint.Append(EliteConsole.PrintFormattedErrorLine(GetUsage(commandTask))); _context.Entry(GruntCommand).State = EntityState.Detached; GruntCommand.CommandOutput.Output = toPrint.ToString(); return(await _context.EditGruntCommand(GruntCommand, _grunthub, _eventhub)); } } // Parameters have parsed successfully commandTask = await _context.EditGruntTask(commandTask); await StartTask(grunt, commandTask, GruntCommand); } else { output = EliteConsole.PrintFormattedErrorLine("Unrecognized command"); } _context.Entry(GruntCommand).State = EntityState.Detached; GruntCommand.CommandOutput.Output = output; return(await _context.EditGruntCommand(GruntCommand, _grunthub, _eventhub)); } catch (Exception e) { _context.Entry(GruntCommand).State = EntityState.Detached; GruntCommand.CommandOutput.Output = EliteConsole.PrintFormattedErrorLine($"{e.Message}{Environment.NewLine}{e.StackTrace}"); return(await _context.EditGruntCommand(GruntCommand, _grunthub, _eventhub)); } }
public string Print() { StringBuilder toPrint = new StringBuilder(); // Ensure enough columns for given rows if (Rows.Count > 0) { while (Rows.Select(R => R.Count).Max() > Columns.Count) { Columns.Add(""); } // Shortens overly lengthy fields this.ShortenFields(); } // Calculate max Column Lengths List <int> ColumnsMaxLengths = Columns.Select(C => 0).ToList(); for (int i = 0; i < Rows.Count; i++) { for (int j = 0; j < Rows[i].Count; j++) { ColumnsMaxLengths[j] = Math.Max(ColumnsMaxLengths[j], Rows[i][j].Length); } } bool empty = !(ColumnsMaxLengths.Max() > 0); for (int i = 0; i < ColumnsMaxLengths.Count; i++) { // Remove empty columns, if it is not a completely empty menu if (ColumnsMaxLengths[i] == 0 && !empty) { Rows.ForEach(R => R.RemoveAt(i)); Columns.RemoveAt(i); ColumnsMaxLengths.RemoveAt(i); i--; } else { // Column name is the max, if longer than all the column's fields ColumnsMaxLengths[i] = Math.Max(ColumnsMaxLengths[i], Columns[i].Length); } } toPrint.Append(EliteConsole.PrintInfoLine()); toPrint.Append(EliteConsole.PrintInfoLine()); switch (this.MenuType) { case EliteConsoleMenuType.Menu: toPrint.Append(PrintMenuType(ColumnsMaxLengths)); break; case EliteConsoleMenuType.Parameter: toPrint.Append(PrintParameterType(ColumnsMaxLengths)); break; case EliteConsoleMenuType.List: toPrint.Append(PrintListType(ColumnsMaxLengths)); break; } if (this.PrintEndBuffer) { toPrint.Append(EliteConsole.PrintInfoLine()); toPrint.Append(EliteConsole.PrintInfoLine()); } return(toPrint.ToString()); }
public async Task <string> Set(Grunt grunt, GruntCommand command, List <ParsedParameter> parameters) { if (parameters.Count != 3) { return(EliteConsole.PrintFormattedErrorLine("Usage: Set (Delay | JitterPercent | ConnectAttempts) <value>")); } if (int.TryParse(parameters[2].Value, out int n)) { GruntTask setTask = await _context.GetGruntTaskByName("Set"); if (parameters[1].Value.Equals("delay", StringComparison.OrdinalIgnoreCase)) { grunt.Delay = n; await _context.CreateGruntTasking(new GruntTasking { Id = 0, GruntId = grunt.Id, Grunt = grunt, GruntTaskId = setTask.Id, GruntTask = setTask, Status = GruntTaskingStatus.Uninitialized, Type = GruntTaskingType.SetDelay, Parameters = new List <string> { grunt.Delay.ToString() }, GruntCommand = command, GruntCommandId = command.Id }); } else if (parameters[1].Value.Equals("jitterpercent", StringComparison.OrdinalIgnoreCase)) { grunt.JitterPercent = n; await _context.CreateGruntTasking(new GruntTasking { Id = 0, GruntId = grunt.Id, Grunt = grunt, GruntTaskId = setTask.Id, GruntTask = setTask, Status = GruntTaskingStatus.Uninitialized, Type = GruntTaskingType.SetJitter, Parameters = new List <string> { grunt.JitterPercent.ToString() }, GruntCommand = command, GruntCommandId = command.Id }); } else if (parameters[1].Value.Equals("connectattempts", StringComparison.OrdinalIgnoreCase)) { grunt.ConnectAttempts = n; await _context.CreateGruntTasking(new GruntTasking { Id = 0, GruntId = grunt.Id, Grunt = grunt, GruntTaskId = setTask.Id, GruntTask = setTask, Status = GruntTaskingStatus.Uninitialized, Type = GruntTaskingType.SetConnectAttempts, Parameters = new List <string> { grunt.ConnectAttempts.ToString() }, GruntCommand = command, GruntCommandId = command.Id }); } return(""); } return(EliteConsole.PrintFormattedErrorLine("Usage: Set (Delay | JitterPercent | ConnectAttempts) <value>")); }