zotregistry.io/zot@v1.4.4-0.20231124084042-02a8ed785457/pkg/cli/client/cves_sub_cmd.go (about) 1 //go:build search 2 // +build search 3 4 package client 5 6 import ( 7 "fmt" 8 "strings" 9 10 "github.com/spf13/cobra" 11 12 zerr "zotregistry.io/zot/errors" 13 zcommon "zotregistry.io/zot/pkg/common" 14 ) 15 16 const ( 17 maxRetries = 20 18 ) 19 20 func NewCveForImageCommand(searchService SearchService) *cobra.Command { 21 var ( 22 searchedCVEID string 23 cveListSortFlag = CVEListSortFlag(SortBySeverity) 24 ) 25 26 cveForImageCmd := &cobra.Command{ 27 Use: "list [repo:tag]|[repo@digest]", 28 Short: "List CVEs by REPO:TAG or REPO@DIGEST", 29 Long: `List CVEs by REPO:TAG or REPO@DIGEST`, 30 Args: OneImageWithRefArg, 31 RunE: func(cmd *cobra.Command, args []string) error { 32 searchConfig, err := GetSearchConfigFromFlags(cmd, searchService) 33 if err != nil { 34 return err 35 } 36 37 err = CheckExtEndPointQuery(searchConfig, CVEListForImageQuery()) 38 if err != nil { 39 return fmt.Errorf("%w: '%s'", err, CVEListForImageQuery().Name) 40 } 41 42 image := args[0] 43 44 return SearchCVEForImageGQL(searchConfig, image, searchedCVEID) 45 }, 46 } 47 48 cveForImageCmd.Flags().StringVar(&searchedCVEID, SearchedCVEID, "", "Search for a specific CVE by name/id") 49 cveForImageCmd.Flags().Var(&cveListSortFlag, SortByFlag, 50 fmt.Sprintf("Options for sorting the output: [%s]", CVEListSortOptionsStr())) 51 52 return cveForImageCmd 53 } 54 55 func NewImagesByCVEIDCommand(searchService SearchService) *cobra.Command { 56 var ( 57 repo string 58 imageListSortFlag = ImageListSortFlag(SortByAlphabeticAsc) 59 ) 60 61 imagesByCVEIDCmd := &cobra.Command{ 62 Use: "affected [cveId]", 63 Short: "List images affected by a CVE", 64 Long: `List images affected by a CVE`, 65 Args: func(cmd *cobra.Command, args []string) error { 66 if err := cobra.ExactArgs(1)(cmd, args); err != nil { 67 return err 68 } 69 70 if !strings.HasPrefix(args[0], "CVE") { 71 return fmt.Errorf("%w: expected a cveid 'CVE-...' got '%s'", zerr.ErrInvalidCLIParameter, args[0]) 72 } 73 74 return nil 75 }, 76 RunE: func(cmd *cobra.Command, args []string) error { 77 searchConfig, err := GetSearchConfigFromFlags(cmd, searchService) 78 if err != nil { 79 return err 80 } 81 82 err = CheckExtEndPointQuery(searchConfig, ImageListForCVEQuery()) 83 if err != nil { 84 return fmt.Errorf("%w: '%s'", err, ImageListForCVEQuery().Name) 85 } 86 87 searchedCVEID := args[0] 88 89 return SearchImagesByCVEIDGQL(searchConfig, repo, searchedCVEID) 90 }, 91 } 92 93 imagesByCVEIDCmd.Flags().StringVar(&repo, "repo", "", "Search for a specific CVE by name/id") 94 imagesByCVEIDCmd.Flags().Var(&imageListSortFlag, SortByFlag, 95 fmt.Sprintf("Options for sorting the output: [%s]", ImageListSortOptionsStr())) 96 97 return imagesByCVEIDCmd 98 } 99 100 func NewFixedTagsCommand(searchService SearchService) *cobra.Command { 101 imageListSortFlag := ImageListSortFlag(SortByAlphabeticAsc) 102 103 fixedTagsCmd := &cobra.Command{ 104 Use: "fixed [repo] [cveId]", 105 Short: "List tags where a CVE is fixed", 106 Long: `List tags where a CVE is fixed`, 107 Args: func(cmd *cobra.Command, args []string) error { 108 const argCount = 2 109 110 if err := cobra.ExactArgs(argCount)(cmd, args); err != nil { 111 return err 112 } 113 114 if !zcommon.CheckIsCorrectRepoNameFormat(args[0]) { 115 return fmt.Errorf("%w: expected a valid repo name for first argument '%s'", zerr.ErrInvalidCLIParameter, args[0]) 116 } 117 118 return nil 119 }, 120 RunE: func(cmd *cobra.Command, args []string) error { 121 searchConfig, err := GetSearchConfigFromFlags(cmd, searchService) 122 if err != nil { 123 return err 124 } 125 126 err = CheckExtEndPointQuery(searchConfig, ImageListWithCVEFixedQuery()) 127 if err != nil { 128 return fmt.Errorf("%w: '%s'", err, ImageListWithCVEFixedQuery().Name) 129 } 130 131 repo := args[0] 132 searchedCVEID := args[1] 133 134 return SearchFixedTagsGQL(searchConfig, repo, searchedCVEID) 135 }, 136 } 137 138 fixedTagsCmd.Flags().Var(&imageListSortFlag, SortByFlag, 139 fmt.Sprintf("Options for sorting the output: [%s]", ImageListSortOptionsStr())) 140 141 return fixedTagsCmd 142 }