mirror of
https://github.com/anchore/syft.git
synced 2026-11-05 00:46:38 +01:00
* 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>
131 lines
4.2 KiB
Go
131 lines
4.2 KiB
Go
/*
|
|
Package kernel provides a concrete Cataloger implementation for linux kernel and module files.
|
|
*/
|
|
package kernel
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/anchore/syft/internal/log"
|
|
"github.com/anchore/syft/internal/unknown"
|
|
"github.com/anchore/syft/syft/artifact"
|
|
"github.com/anchore/syft/syft/file"
|
|
"github.com/anchore/syft/syft/pkg"
|
|
"github.com/anchore/syft/syft/pkg/cataloger/generic"
|
|
)
|
|
|
|
var _ pkg.Cataloger = (*linuxKernelCataloger)(nil)
|
|
|
|
type LinuxKernelCatalogerConfig struct {
|
|
// CatalogModules enables cataloging linux kernel modules (`*.ko` files) in addition to the kernel itself.
|
|
// app-config: linux-kernel.catalog-modules
|
|
CatalogModules bool `yaml:"catalog-modules" json:"catalog-modules" mapstructure:"catalog-modules"`
|
|
}
|
|
|
|
type linuxKernelCataloger struct {
|
|
cfg LinuxKernelCatalogerConfig
|
|
}
|
|
|
|
func DefaultLinuxKernelCatalogerConfig() LinuxKernelCatalogerConfig {
|
|
return LinuxKernelCatalogerConfig{
|
|
CatalogModules: true,
|
|
}
|
|
}
|
|
|
|
var kernelArchiveGlobs = []string{
|
|
"**/kernel",
|
|
"**/kernel-*",
|
|
"**/vmlinux",
|
|
"**/vmlinux-*",
|
|
"**/vmlinuz",
|
|
"**/vmlinuz-*",
|
|
}
|
|
|
|
var kernelModuleGlobs = []string{
|
|
"**/lib/modules/**/*.ko",
|
|
}
|
|
|
|
// NewLinuxKernelCataloger returns a new kernel files cataloger object.
|
|
func NewLinuxKernelCataloger(cfg LinuxKernelCatalogerConfig) pkg.Cataloger {
|
|
return &linuxKernelCataloger{
|
|
cfg: cfg,
|
|
}
|
|
}
|
|
|
|
func (l linuxKernelCataloger) Name() string {
|
|
return "linux-kernel-cataloger"
|
|
}
|
|
|
|
func (l linuxKernelCataloger) Catalog(ctx context.Context, resolver file.Resolver) ([]pkg.Package, []artifact.Relationship, error) {
|
|
var allPackages []pkg.Package
|
|
var allRelationships []artifact.Relationship
|
|
var errs error
|
|
|
|
kernelPackages, kernelRelationships, err := generic.NewCataloger(l.Name()).WithParserByGlobs(parseLinuxKernelFile, kernelArchiveGlobs...).Catalog(ctx, resolver)
|
|
if err != nil {
|
|
errs = unknown.Join(errs, err)
|
|
}
|
|
|
|
allRelationships = append(allRelationships, kernelRelationships...)
|
|
allPackages = append(allPackages, kernelPackages...)
|
|
|
|
if l.cfg.CatalogModules {
|
|
modulePackages, moduleRelationships, err := generic.NewCataloger(l.Name()).WithParserByGlobs(parseLinuxKernelModuleFile, kernelModuleGlobs...).Catalog(ctx, resolver)
|
|
if err != nil {
|
|
errs = unknown.Join(errs, err)
|
|
}
|
|
|
|
allPackages = append(allPackages, modulePackages...)
|
|
|
|
moduleToKernelRelationships := createKernelToModuleRelationships(kernelPackages, modulePackages)
|
|
allRelationships = append(allRelationships, moduleRelationships...)
|
|
allRelationships = append(allRelationships, moduleToKernelRelationships...)
|
|
}
|
|
|
|
return allPackages, allRelationships, errs
|
|
}
|
|
|
|
func createKernelToModuleRelationships(kernelPackages, modulePackages []pkg.Package) []artifact.Relationship {
|
|
// organize kernel and module packages by kernel version
|
|
kernelPackagesByVersion := make(map[string][]*pkg.Package)
|
|
for idx, p := range kernelPackages {
|
|
kernelPackagesByVersion[p.Version] = append(kernelPackagesByVersion[p.Version], &kernelPackages[idx])
|
|
}
|
|
|
|
modulesByKernelVersion := make(map[string][]*pkg.Package)
|
|
for idx, p := range modulePackages {
|
|
m, ok := p.Metadata.(pkg.LinuxKernelModule)
|
|
if !ok {
|
|
log.Debugf("linux-kernel-module package found without metadata: %s@%s", p.Name, p.Version)
|
|
continue
|
|
}
|
|
modulesByKernelVersion[m.KernelVersion] = append(modulesByKernelVersion[m.KernelVersion], &modulePackages[idx])
|
|
}
|
|
|
|
// create relationships between kernel and modules: [module] --(depends on)--> [kernel]
|
|
// since we try to use singular directions for relationships, we'll use "dependency of" here instead:
|
|
// [kernel] --(dependency of)--> [module]
|
|
var moduleToKernelRelationships []artifact.Relationship
|
|
for kernelVersion, modules := range modulesByKernelVersion {
|
|
kps, ok := kernelPackagesByVersion[kernelVersion]
|
|
if !ok {
|
|
// it's ok if there is a module that has no installed kernel...
|
|
continue
|
|
}
|
|
|
|
// we don't know which kernel is the "right" one, so we'll create a relationship for each one
|
|
for _, kp := range kps {
|
|
for _, mp := range modules {
|
|
moduleToKernelRelationships = append(moduleToKernelRelationships, artifact.Relationship{
|
|
// note: relationships should have Package objects, not pointers
|
|
From: *kp,
|
|
To: *mp,
|
|
Type: artifact.DependencyOfRelationship,
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
return moduleToKernelRelationships
|
|
}
|