2023-08-30 20:12:24 +03:00
//go:build search
// +build search
2023-09-16 01:17:01 +03:00
package client
2023-08-30 20:12:24 +03:00
import (
"fmt"
"strings"
"github.com/spf13/cobra"
zerr "zotregistry.io/zot/errors"
zcommon "zotregistry.io/zot/pkg/common"
)
const (
maxRetries = 20
)
func NewCveForImageCommand ( searchService SearchService ) * cobra . Command {
2023-09-14 20:51:17 +03:00
var (
searchedCVEID string
2023-09-22 16:33:18 +03:00
cveListSortFlag = CVEListSortFlag ( SortBySeverity )
2023-09-14 20:51:17 +03:00
)
2023-08-30 20:12:24 +03:00
cveForImageCmd := & cobra . Command {
2023-09-08 15:12:47 +03:00
Use : "list [repo:tag]|[repo@digest]" ,
2023-08-30 20:12:24 +03:00
Short : "List CVEs by REPO:TAG or REPO@DIGEST" ,
Long : ` List CVEs by REPO:TAG or REPO@DIGEST ` ,
Args : OneImageWithRefArg ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
searchConfig , err := GetSearchConfigFromFlags ( cmd , searchService )
if err != nil {
return err
}
err = CheckExtEndPointQuery ( searchConfig , CVEListForImageQuery ( ) )
if err != nil {
return fmt . Errorf ( "%w: '%s'" , err , CVEListForImageQuery ( ) . Name )
}
image := args [ 0 ]
return SearchCVEForImageGQL ( searchConfig , image , searchedCVEID )
} ,
}
2023-09-22 16:33:18 +03:00
cveForImageCmd . Flags ( ) . StringVar ( & searchedCVEID , SearchedCVEID , "" , "Search for a specific CVE by name/id" )
cveForImageCmd . Flags ( ) . Var ( & cveListSortFlag , SortByFlag ,
fmt . Sprintf ( "Options for sorting the output: [%s]" , CVEListSortOptionsStr ( ) ) )
2023-08-30 20:12:24 +03:00
return cveForImageCmd
}
func NewImagesByCVEIDCommand ( searchService SearchService ) * cobra . Command {
2023-09-14 20:51:17 +03:00
var (
repo string
2023-09-22 16:33:18 +03:00
imageListSortFlag = ImageListSortFlag ( SortByAlphabeticAsc )
2023-09-14 20:51:17 +03:00
)
2023-08-30 20:12:24 +03:00
imagesByCVEIDCmd := & cobra . Command {
2023-09-08 15:12:47 +03:00
Use : "affected [cveId]" ,
2023-08-30 20:12:24 +03:00
Short : "List images affected by a CVE" ,
Long : ` List images affected by a CVE ` ,
Args : func ( cmd * cobra . Command , args [ ] string ) error {
if err := cobra . ExactArgs ( 1 ) ( cmd , args ) ; err != nil {
return err
}
if ! strings . HasPrefix ( args [ 0 ] , "CVE" ) {
return fmt . Errorf ( "%w: expected a cveid 'CVE-...' got '%s'" , zerr . ErrInvalidCLIParameter , args [ 0 ] )
}
return nil
} ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
searchConfig , err := GetSearchConfigFromFlags ( cmd , searchService )
if err != nil {
return err
}
err = CheckExtEndPointQuery ( searchConfig , ImageListForCVEQuery ( ) )
if err != nil {
return fmt . Errorf ( "%w: '%s'" , err , ImageListForCVEQuery ( ) . Name )
}
searchedCVEID := args [ 0 ]
return SearchImagesByCVEIDGQL ( searchConfig , repo , searchedCVEID )
} ,
}
imagesByCVEIDCmd . Flags ( ) . StringVar ( & repo , "repo" , "" , "Search for a specific CVE by name/id" )
2023-09-22 16:33:18 +03:00
imagesByCVEIDCmd . Flags ( ) . Var ( & imageListSortFlag , SortByFlag ,
fmt . Sprintf ( "Options for sorting the output: [%s]" , ImageListSortOptionsStr ( ) ) )
2023-08-30 20:12:24 +03:00
return imagesByCVEIDCmd
}
func NewFixedTagsCommand ( searchService SearchService ) * cobra . Command {
2023-09-22 16:33:18 +03:00
imageListSortFlag := ImageListSortFlag ( SortByAlphabeticAsc )
2023-09-14 20:51:17 +03:00
2023-08-30 20:12:24 +03:00
fixedTagsCmd := & cobra . Command {
Use : "fixed [repo] [cveId]" ,
2023-09-14 20:51:17 +03:00
Short : "List tags where a CVE is fixed" ,
Long : ` List tags where a CVE is fixed ` ,
2023-08-30 20:12:24 +03:00
Args : func ( cmd * cobra . Command , args [ ] string ) error {
const argCount = 2
if err := cobra . ExactArgs ( argCount ) ( cmd , args ) ; err != nil {
return err
}
if ! zcommon . CheckIsCorrectRepoNameFormat ( args [ 0 ] ) {
return fmt . Errorf ( "%w: expected a valid repo name for first argument '%s'" , zerr . ErrInvalidCLIParameter , args [ 0 ] )
}
return nil
} ,
RunE : func ( cmd * cobra . Command , args [ ] string ) error {
searchConfig , err := GetSearchConfigFromFlags ( cmd , searchService )
if err != nil {
return err
}
err = CheckExtEndPointQuery ( searchConfig , ImageListWithCVEFixedQuery ( ) )
if err != nil {
return fmt . Errorf ( "%w: '%s'" , err , ImageListWithCVEFixedQuery ( ) . Name )
}
repo := args [ 0 ]
searchedCVEID := args [ 1 ]
return SearchFixedTagsGQL ( searchConfig , repo , searchedCVEID )
} ,
}
2023-09-22 16:33:18 +03:00
fixedTagsCmd . Flags ( ) . Var ( & imageListSortFlag , SortByFlag ,
fmt . Sprintf ( "Options for sorting the output: [%s]" , ImageListSortOptionsStr ( ) ) )
2023-09-14 20:51:17 +03:00
2023-08-30 20:12:24 +03:00
return fixedTagsCmd
}