Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ func init() {
rootCmd.AddCommand(incidentsCmd)
rootCmd.AddCommand(rumCmd)
rootCmd.AddCommand(cicdCmd)
rootCmd.AddCommand(vulnerabilitiesCmd)
rootCmd.AddCommand(staticAnalysisCmd)
rootCmd.AddCommand(downtimeCmd)
rootCmd.AddCommand(tagsCmd)
Expand Down
137 changes: 4 additions & 133 deletions cmd/security.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,38 +76,6 @@ Security findings provide insights into security posture and vulnerabilities
across your infrastructure and applications.`,
}

var securityFindingsListCmd = &cobra.Command{
Use: "list",
Short: "List security findings",
Long: `List security findings with optional filtering and pagination.

EXAMPLES:
# List all findings
pup security findings list

# Filter by status
pup security findings list --status=critical

# Paginate results
pup security findings list --page-size=50 --page-number=1`,
RunE: runSecurityFindingsList,
}

var securityFindingsGetCmd = &cobra.Command{
Use: "get [finding-id]",
Short: "Get security finding details",
Long: `Get detailed information about a specific security finding.

EXAMPLES:
# Get finding details
pup security findings get finding-abc-123

# Get finding with table output
pup security findings get finding-abc-123 --output=table`,
Args: cobra.ExactArgs(1),
RunE: runSecurityFindingsGet,
}

var securityFindingsSearchCmd = &cobra.Command{
Use: "search",
Short: "Search security findings",
Expand All @@ -133,29 +101,13 @@ EXAMPLES:
}

var (
// Findings list flags
findingsPageSize int64
findingsStatus string
findingsEvaluation string
findingsRuleID string
findingsResourceType string

// Findings search flags
findingsQuery string
findingsLimit int32
findingsPageCursor string
findingsSort string
findingsQuery string
findingsLimit int32
findingsSort string
)

func init() {
// Findings list flags
securityFindingsListCmd.Flags().Int64Var(&findingsPageSize, "page-size", 100, "Number of findings per page (max: 1000)")
securityFindingsListCmd.Flags().StringVar(&findingsPageCursor, "page-cursor", "", "Page cursor for pagination")
securityFindingsListCmd.Flags().StringVar(&findingsStatus, "status", "", "Filter by status: critical, high, medium, low, info")
securityFindingsListCmd.Flags().StringVar(&findingsEvaluation, "evaluation", "", "Filter by evaluation: pass, fail")
securityFindingsListCmd.Flags().StringVar(&findingsRuleID, "rule-id", "", "Filter by rule ID")
securityFindingsListCmd.Flags().StringVar(&findingsResourceType, "resource-type", "", "Filter by resource type")

// Findings search flags
securityFindingsSearchCmd.Flags().StringVar(&findingsQuery, "query", "", "Search query using log search syntax (required)")
securityFindingsSearchCmd.Flags().Int32Var(&findingsLimit, "limit", 100, "Maximum results (1-1000)")
Expand All @@ -165,7 +117,7 @@ func init() {
// Command hierarchy
securityRulesCmd.AddCommand(securityRulesListCmd, securityRulesGetCmd)
securitySignalsCmd.AddCommand(securitySignalsListCmd)
securityFindingsCmd.AddCommand(securityFindingsListCmd, securityFindingsGetCmd, securityFindingsSearchCmd)
securityFindingsCmd.AddCommand(securityFindingsSearchCmd)
securityCmd.AddCommand(securityRulesCmd, securitySignalsCmd, securityFindingsCmd)
}

Expand Down Expand Up @@ -239,87 +191,6 @@ func runSecuritySignalsList(cmd *cobra.Command, args []string) error {
return nil
}

func runSecurityFindingsList(cmd *cobra.Command, args []string) error {
client, err := getClient()
if err != nil {
return err
}

api := datadogV2.NewSecurityMonitoringApi(client.V2())

// Build optional parameters with filtering
opts := datadogV2.ListFindingsOptionalParameters{}

if findingsPageSize > 0 {
if findingsPageSize > 1000 {
findingsPageSize = 1000
}
opts.WithPageLimit(findingsPageSize)
}

if findingsPageCursor != "" {
opts.WithPageCursor(findingsPageCursor)
}

if findingsStatus != "" {
status, err := datadogV2.NewFindingStatusFromValue(findingsStatus)
if err != nil {
return fmt.Errorf("invalid status value '%s': must be one of critical, high, medium, low, info", findingsStatus)
}
opts.WithFilterStatus(*status)
}

if findingsEvaluation != "" {
evaluation, err := datadogV2.NewFindingEvaluationFromValue(findingsEvaluation)
if err != nil {
return fmt.Errorf("invalid evaluation value '%s': must be one of pass, fail", findingsEvaluation)
}
opts.WithFilterEvaluation(*evaluation)
}

if findingsRuleID != "" {
opts.WithFilterRuleId(findingsRuleID)
}

if findingsResourceType != "" {
opts.WithFilterResourceType(findingsResourceType)
}

resp, r, err := api.ListFindings(client.Context(), opts)
if err != nil {
return formatAPIError("list security findings", err, r)
}

output, err := formatter.FormatOutput(resp, formatter.OutputFormat(outputFormat))
if err != nil {
return err
}
printOutput("%s\n", output)
return nil
}

func runSecurityFindingsGet(cmd *cobra.Command, args []string) error {
client, err := getClient()
if err != nil {
return err
}

findingID := args[0]
api := datadogV2.NewSecurityMonitoringApi(client.V2())

resp, r, err := api.GetFinding(client.Context(), findingID)
if err != nil {
return formatAPIError("get security finding", err, r)
}

output, err := formatter.FormatOutput(resp, formatter.OutputFormat(outputFormat))
if err != nil {
return err
}
printOutput("%s\n", output)
return nil
}

func runSecurityFindingsSearch(cmd *cobra.Command, args []string) error {
client, err := getClient()
if err != nil {
Expand Down
12 changes: 6 additions & 6 deletions cmd/security_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,16 +119,16 @@ func TestSecurityFindingsCmd(t *testing.T) {
t.Error("Short description is empty")
}

// Check for list subcommand
// Check for search subcommand
commands := securityFindingsCmd.Commands()
foundList := false
foundSearch := false
for _, cmd := range commands {
if cmd.Use == "list" {
foundList = true
if cmd.Use == "search" {
foundSearch = true
}
}
if !foundList {
t.Error("Missing findings list subcommand")
if !foundSearch {
t.Error("Missing findings search subcommand")
}
}

Expand Down
Loading