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