mirror of
https://github.com/anchore/syft.git
synced 2026-11-02 07:26:34 +01:00
Add experimental cataloger capabilities command (#4317)
* add info command from generated capabilities Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * correct gentoo and arch ecosystems Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * rename os pkg types Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * better binary cataloger description Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * expose metadata and pacakge types in json Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * expose json schema types Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add completeness tests for metadata types Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * latest generation Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix linting Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * improve testing a docs Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix tests and linting Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * restore goreleaser config Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * tweak diagram Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix pdm Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * chore: java binary data Signed-off-by: Keith Zantow <kzantow@gmail.com> * new capability descriptions for gguf and python Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * correct poetry lock integrity hash claim Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix compile error Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix: remove purl version from overrides Signed-off-by: Keith Zantow <kzantow@gmail.com> * fix lua deps ref Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * keep gguf as ai ecosystem Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * split packages.yaml to multiple files by go package Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * ensure tests do not use go test cache Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * sort json output for info command Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * docs: fix ocaml, php, and portage capabilities yaml Signed-off-by: Will Murphy <willmurphyscode@users.noreply.github.com> * chore: update erlang capabilities Signed-off-by: Keith Zantow <kzantow@gmail.com> * chore: update java capabilities Signed-off-by: Keith Zantow <kzantow@gmail.com> * chore: update javascript capabilities Signed-off-by: Keith Zantow <kzantow@gmail.com> * chore: update linux kernel capabilities Signed-off-by: Keith Zantow <kzantow@gmail.com> * remove missing tests Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix package.yaml references Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * revert license list change Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * check for drift in capability descriptions Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * regenerate capabilities Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * test cleanup Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * use fixture cache in static analysis Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * claim fixtures pre-req for cap generation Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * update documentation with correct regeneration procedure Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * chore: ruby-gemspec-cataloger finds no dependencies Signed-off-by: Will Murphy <willmurphyscode@users.noreply.github.com> * chore: fix python docs and config comment Signed-off-by: Will Murphy <willmurphyscode@users.noreply.github.com> * chore: commit re-generated java yaml Signed-off-by: Will Murphy <willmurphyscode@users.noreply.github.com> * add cataloger selection to caps command Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * re-generate cap yamls Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix tests for cataloger selection Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix cli test Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add missing tests Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix linting Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * rename cmd to `cataloger info` Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * [wip] change capability description locations Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * [wip] continued Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * [wip] adjust for import cycles Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * correct docs Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * fix linting Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> --------- Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> Signed-off-by: Keith Zantow <kzantow@gmail.com> Signed-off-by: Will Murphy <willmurphyscode@users.noreply.github.com> Co-authored-by: Keith Zantow <kzantow@gmail.com> Co-authored-by: Will Murphy <willmurphyscode@users.noreply.github.com>
This commit is contained in:
co-authored by
Keith Zantow
Will Murphy
parent
ae1a247f3d
commit
b3c70da3ea
@@ -0,0 +1,132 @@
|
||||
// Package capabilities provides discovery and tracking of cataloger capabilities.
|
||||
package capabilities
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"fmt"
|
||||
"io/fs"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
|
||||
"github.com/scylladb/go-set/strset"
|
||||
"gopkg.in/yaml.v3"
|
||||
|
||||
"github.com/anchore/syft/internal/task"
|
||||
)
|
||||
|
||||
//go:generate go run ./generate
|
||||
|
||||
//go:embed appconfig.yaml
|
||||
var appconfigYAML []byte
|
||||
|
||||
var catalogerFiles *embed.FS
|
||||
|
||||
func RegisterCatalogerFiles(f embed.FS) {
|
||||
catalogerFiles = &f
|
||||
}
|
||||
|
||||
// LoadDocument loads and returns the complete document including configs and app-configs
|
||||
func LoadDocument() (*Document, error) {
|
||||
if catalogerFiles == nil {
|
||||
return nil, fmt.Errorf("cataloger files not registered")
|
||||
}
|
||||
|
||||
// parse application config
|
||||
var appDoc struct {
|
||||
Application []ApplicationConfigField `yaml:"application"`
|
||||
}
|
||||
if err := yaml.Unmarshal(appconfigYAML, &appDoc); err != nil {
|
||||
return nil, fmt.Errorf("failed to parse appconfig.yaml: %w", err)
|
||||
}
|
||||
|
||||
// walk the embedded filesystem to find all cataloger capabilities.yaml files
|
||||
var catalogersDoc Document
|
||||
catalogersDoc.ApplicationConfig = appDoc.Application
|
||||
catalogersDoc.Configs = make(map[string]CatalogerConfigEntry)
|
||||
|
||||
err := fs.WalkDir(catalogerFiles, ".", func(path string, d fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// skip non-yaml files and directories
|
||||
if d.IsDir() || filepath.Ext(path) != ".yaml" || path == "." {
|
||||
return nil
|
||||
}
|
||||
|
||||
// read the file
|
||||
data, err := catalogerFiles.ReadFile(path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read %s: %w", path, err)
|
||||
}
|
||||
|
||||
// parse the file
|
||||
var capDoc struct {
|
||||
Configs map[string]CatalogerConfigEntry `yaml:"configs"`
|
||||
Catalogers []CatalogerEntry `yaml:"catalogers"`
|
||||
}
|
||||
if err := yaml.Unmarshal(data, &capDoc); err != nil {
|
||||
return fmt.Errorf("failed to parse %s: %w", path, err)
|
||||
}
|
||||
|
||||
// merge configs
|
||||
for k, v := range capDoc.Configs {
|
||||
catalogersDoc.Configs[k] = v
|
||||
}
|
||||
|
||||
// merge catalogers
|
||||
catalogersDoc.Catalogers = append(catalogersDoc.Catalogers, capDoc.Catalogers...)
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to walk cataloger capabilities: %w", err)
|
||||
}
|
||||
|
||||
// sort catalogers by name for consistency
|
||||
sort.Slice(catalogersDoc.Catalogers, func(i, j int) bool {
|
||||
return catalogersDoc.Catalogers[i].Name < catalogersDoc.Catalogers[j].Name
|
||||
})
|
||||
|
||||
return &catalogersDoc, nil
|
||||
}
|
||||
|
||||
// Packages loads and returns all cataloger capabilities from the embedded YAML file
|
||||
func Packages() ([]CatalogerEntry, error) {
|
||||
doc, err := LoadDocument()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return doc.Catalogers, nil
|
||||
}
|
||||
|
||||
// CatalogerInfo represents a cataloger's name and selection tags
|
||||
type CatalogerInfo struct {
|
||||
Name string
|
||||
Selectors []string // tags for cataloger name selection
|
||||
}
|
||||
|
||||
// ExtractCatalogerInfo extracts cataloger names and their selection tags from tasks
|
||||
func ExtractCatalogerInfo(tasks []task.Task) []CatalogerInfo {
|
||||
var infos []CatalogerInfo
|
||||
|
||||
for _, tsk := range tasks {
|
||||
var selectors []string
|
||||
name := tsk.Name()
|
||||
|
||||
if s, ok := tsk.(task.Selector); ok {
|
||||
set := strset.New(s.Selectors()...)
|
||||
set.Remove(name)
|
||||
selectors = set.List()
|
||||
sort.Strings(selectors)
|
||||
}
|
||||
|
||||
infos = append(infos, CatalogerInfo{
|
||||
Name: name,
|
||||
Selectors: selectors,
|
||||
})
|
||||
}
|
||||
|
||||
return infos
|
||||
}
|
||||
Reference in New Issue
Block a user