better binary cataloger description

Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
This commit is contained in:
Alex Goodman 2025-10-21 13:02:04 -04:00
parent 02f61abc62
commit 95ba1b04a4
6 changed files with 674 additions and 95 deletions

View File

@ -115,10 +115,19 @@ func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []capabiliti
Fields []configFieldInfo `json:"fields,omitempty"` Fields []configFieldInfo `json:"fields,omitempty"`
} }
type detectorPackageInfo struct {
Class string `json:"class"`
Name string `json:"name"`
PURL string `json:"purl"`
CPEs []string `json:"cpes"`
Type string `json:"type"`
}
type patternInfo struct { type patternInfo struct {
Method string `json:"method"` Method string `json:"method"`
Criteria []string `json:"criteria"` Criteria []string `json:"criteria"`
Conditions []capabilities.DetectorCondition `json:"conditions,omitempty"` Conditions []capabilities.DetectorCondition `json:"conditions,omitempty"`
Packages []detectorPackageInfo `json:"packages,omitempty"`
Comment string `json:"comment,omitempty"` Comment string `json:"comment,omitempty"`
Capabilities capabilities.CapabilitySet `json:"capabilities,omitempty"` Capabilities capabilities.CapabilitySet `json:"capabilities,omitempty"`
} }
@ -146,10 +155,23 @@ func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []capabiliti
} }
for _, parser := range cat.Parsers { for _, parser := range cat.Parsers {
// convert detector packages
var pkgs []detectorPackageInfo
for _, pkg := range parser.Detector.Packages {
pkgs = append(pkgs, detectorPackageInfo{
Class: pkg.Class,
Name: pkg.Name,
PURL: pkg.PURL,
CPEs: pkg.CPEs,
Type: pkg.Type,
})
}
pi := patternInfo{ pi := patternInfo{
Method: string(parser.Detector.Method), Method: string(parser.Detector.Method),
Criteria: parser.Detector.Criteria, Criteria: parser.Detector.Criteria,
Conditions: parser.Detector.Conditions, Conditions: parser.Detector.Conditions,
Packages: pkgs,
Comment: parser.Detector.Comment, Comment: parser.Detector.Comment,
Capabilities: parser.Capabilities, Capabilities: parser.Capabilities,
} }
@ -161,10 +183,23 @@ func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []capabiliti
info.Capabilities = cat.Capabilities info.Capabilities = cat.Capabilities
for _, det := range cat.Detectors { for _, det := range cat.Detectors {
// convert detector packages
var pkgs []detectorPackageInfo
for _, pkg := range det.Packages {
pkgs = append(pkgs, detectorPackageInfo{
Class: pkg.Class,
Name: pkg.Name,
PURL: pkg.PURL,
CPEs: pkg.CPEs,
Type: pkg.Type,
})
}
pi := patternInfo{ pi := patternInfo{
Method: string(det.Method), Method: string(det.Method),
Criteria: det.Criteria, Criteria: det.Criteria,
Conditions: det.Conditions, Conditions: det.Conditions,
Packages: pkgs,
Comment: det.Comment, Comment: det.Comment,
} }
info.Patterns = append(info.Patterns, pi) info.Patterns = append(info.Patterns, pi)

View File

@ -8,7 +8,6 @@ import (
"os" "os"
"os/exec" "os/exec"
"path/filepath" "path/filepath"
"sort"
"strings" "strings"
"github.com/anchore/syft/internal/capabilities" "github.com/anchore/syft/internal/capabilities"
@ -650,24 +649,10 @@ func RepoRoot() (string, error) {
return absRepoRoot, nil return absRepoRoot, nil
} }
// extractBinaryClassifierGlobs extracts all FileGlob patterns from binary classifiers // extractBinaryClassifiers extracts all binary classifiers with their full information
func extractBinaryClassifierGlobs() []string { func extractBinaryClassifiers() []binary.Classifier {
classifiers := binary.DefaultClassifiers() classifiers := binary.DefaultClassifiers()
// extract all unique FileGlob values // return all classifiers (already sorted by the default function)
globs := make(map[string]bool) return classifiers
for _, classifier := range classifiers {
if classifier.FileGlob != "" {
globs[classifier.FileGlob] = true
}
}
// convert to sorted slice
result := make([]string, 0, len(globs))
for glob := range globs {
result = append(result, glob)
}
sort.Strings(result)
return result
} }

View File

@ -7,10 +7,20 @@ import (
"github.com/scylladb/go-set/strset" "github.com/scylladb/go-set/strset"
"github.com/anchore/syft/internal/capabilities" "github.com/anchore/syft/internal/capabilities"
"github.com/anchore/syft/syft/pkg/cataloger/binary"
) )
const genericCatalogerType = "generic" const genericCatalogerType = "generic"
// stripPURLVersion removes the @version suffix from a PURL string
// e.g., "pkg:generic/python@version" -> "pkg:generic/python"
func stripPURLVersion(purl string) string {
if idx := strings.LastIndex(purl, "@"); idx != -1 {
return purl[:idx]
}
return purl
}
// catalogerTypeOverrides specifies catalogers that should have their type manually controlled // catalogerTypeOverrides specifies catalogers that should have their type manually controlled
// rather than determined from the discovered cataloger structure. // rather than determined from the discovered cataloger structure.
// This is useful when a cataloger is discovered as "generic" but should be treated as "custom" // This is useful when a cataloger is discovered as "generic" but should be treated as "custom"
@ -71,10 +81,10 @@ func RegenerateCapabilities(yamlPath string, repoRoot string) (*Statistics, erro
} }
fmt.Println(" done") fmt.Println(" done")
// 1b. Extract binary classifier globs // 1b. Extract binary classifiers
fmt.Print(" → Extracting binary classifier globs...") fmt.Print(" → Extracting binary classifiers...")
binaryClassifierGlobs := extractBinaryClassifierGlobs() binaryClassifiers := extractBinaryClassifiers()
fmt.Printf(" found %d globs\n", len(binaryClassifierGlobs)) fmt.Printf(" found %d classifiers\n", len(binaryClassifiers))
// Count parser functions // Count parser functions
for _, disc := range discovered { for _, disc := range discovered {
@ -205,7 +215,7 @@ func RegenerateCapabilities(yamlPath string, repoRoot string) (*Statistics, erro
discovered, discovered,
customCatalogerMetadata, customCatalogerMetadata,
customCatalogerPackageTypes, customCatalogerPackageTypes,
binaryClassifierGlobs, binaryClassifiers,
allCatalogers, allCatalogers,
existing, existing,
discoveredConfigs, discoveredConfigs,
@ -286,19 +296,19 @@ func (r *CatalogerRegistry) AllCatalogers() []capabilities.CatalogerInfo {
return r.all return r.all
} }
// EnrichmentData encapsulates metadata enrichment information (metadata types, package types, binary classifier globs) // EnrichmentData encapsulates metadata enrichment information (metadata types, package types, binary classifiers)
type EnrichmentData struct { type EnrichmentData struct {
metadata map[string][]string metadata map[string][]string
packageTypes map[string][]string packageTypes map[string][]string
binaryClassifierGlobs []string binaryClassifiers []binary.Classifier
} }
// NewEnrichmentData creates a new enrichment data container // NewEnrichmentData creates a new enrichment data container
func NewEnrichmentData(metadata, packageTypes map[string][]string, binaryClassifierGlobs []string) *EnrichmentData { func NewEnrichmentData(metadata, packageTypes map[string][]string, binaryClassifiers []binary.Classifier) *EnrichmentData {
return &EnrichmentData{ return &EnrichmentData{
metadata: metadata, metadata: metadata,
packageTypes: packageTypes, packageTypes: packageTypes,
binaryClassifierGlobs: binaryClassifierGlobs, binaryClassifiers: binaryClassifiers,
} }
} }
@ -326,16 +336,36 @@ func (e *EnrichmentData) EnrichEntry(catalogerName string, entry *capabilities.C
} }
} }
// EnrichWithBinaryClassifier enriches an entry with binary classifier globs if it's the binary-classifier-cataloger // EnrichWithBinaryClassifier enriches an entry with binary classifier detectors if it's the binary-classifier-cataloger
func (e *EnrichmentData) EnrichWithBinaryClassifier(catalogerName string, entry *capabilities.CatalogerEntry) { func (e *EnrichmentData) EnrichWithBinaryClassifier(catalogerName string, entry *capabilities.CatalogerEntry) {
// special handling for binary-classifier-cataloger: auto-generate detectors from classifier globs // special handling for binary-classifier-cataloger: auto-generate one detector per classifier
if catalogerName == "binary-classifier-cataloger" && len(e.binaryClassifierGlobs) > 0 { if catalogerName == "binary-classifier-cataloger" && len(e.binaryClassifiers) > 0 {
entry.Detectors = []capabilities.Detector{ var detectors []capabilities.Detector
{ for _, classifier := range e.binaryClassifiers {
// convert CPEs to strings
cpeStrings := make([]string, len(classifier.CPEs))
for i, c := range classifier.CPEs {
cpeStrings[i] = c.Attributes.BindToFmtString()
}
// strip @version from PURL
purlStr := stripPURLVersion(classifier.PURL.String())
detectors = append(detectors, capabilities.Detector{
Method: "glob", Method: "glob",
Criteria: e.binaryClassifierGlobs, Criteria: []string{classifier.FileGlob},
}, Packages: []capabilities.DetectorPackageInfo{
{
Class: classifier.Class,
Name: classifier.Package,
PURL: purlStr,
CPEs: cpeStrings,
Type: "BinaryPkg",
},
},
})
} }
entry.Detectors = detectors
} }
} }
@ -512,7 +542,7 @@ func mergeDiscoveredWithExisting(
discovered map[string]DiscoveredCataloger, discovered map[string]DiscoveredCataloger,
customMetadata map[string][]string, customMetadata map[string][]string,
customPackageTypes map[string][]string, customPackageTypes map[string][]string,
binaryClassifierGlobs []string, binaryClassifiers []binary.Classifier,
allCatalogers []capabilities.CatalogerInfo, allCatalogers []capabilities.CatalogerInfo,
existing *capabilities.Document, existing *capabilities.Document,
configs map[string]capabilities.CatalogerConfigEntry, configs map[string]capabilities.CatalogerConfigEntry,
@ -520,7 +550,7 @@ func mergeDiscoveredWithExisting(
catalogerConfigMappings map[string]string, catalogerConfigMappings map[string]string,
) (*capabilities.Document, []orphanInfo, *mergeStatistics) { ) (*capabilities.Document, []orphanInfo, *mergeStatistics) {
registry := NewCatalogerRegistry(discovered, allCatalogers) registry := NewCatalogerRegistry(discovered, allCatalogers)
enrichment := NewEnrichmentData(customMetadata, customPackageTypes, binaryClassifierGlobs) enrichment := NewEnrichmentData(customMetadata, customPackageTypes, binaryClassifiers)
merger := NewCatalogerMerger(registry, enrichment, existing, catalogerConfigMappings) merger := NewCatalogerMerger(registry, enrichment, existing, catalogerConfigMappings)
// set the AUTO-GENERATED config sections // set the AUTO-GENERATED config sections

View File

@ -7,6 +7,7 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"github.com/anchore/syft/internal/capabilities" "github.com/anchore/syft/internal/capabilities"
"github.com/anchore/syft/syft/pkg/cataloger/binary"
) )
func TestMergeConfigSections(t *testing.T) { func TestMergeConfigSections(t *testing.T) {
@ -113,7 +114,7 @@ func TestMergeConfigSections(t *testing.T) {
map[string]DiscoveredCataloger{}, map[string]DiscoveredCataloger{},
map[string][]string{}, map[string][]string{},
map[string][]string{}, map[string][]string{},
[]string{}, []binary.Classifier{},
[]capabilities.CatalogerInfo{}, []capabilities.CatalogerInfo{},
tt.existingDoc, tt.existingDoc,
tt.newConfigs, tt.newConfigs,
@ -250,7 +251,7 @@ func TestMergePreservesManualCapabilities(t *testing.T) {
discovered, discovered,
map[string][]string{}, map[string][]string{},
map[string][]string{}, map[string][]string{},
[]string{}, []binary.Classifier{},
[]capabilities.CatalogerInfo{ []capabilities.CatalogerInfo{
{Name: "test-cataloger", Selectors: []string{"test"}}, {Name: "test-cataloger", Selectors: []string{"test"}},
}, },
@ -337,7 +338,7 @@ func TestCatalogerConfigFieldUpdatedForNewCatalogers(t *testing.T) {
discovered, discovered,
map[string][]string{}, map[string][]string{},
map[string][]string{}, map[string][]string{},
[]string{}, []binary.Classifier{},
[]capabilities.CatalogerInfo{ []capabilities.CatalogerInfo{
{Name: tt.catalogerName, Selectors: []string{"test"}}, {Name: tt.catalogerName, Selectors: []string{"test"}},
}, },
@ -357,7 +358,7 @@ func TestCatalogerConfigFieldUpdatedForNewCatalogers(t *testing.T) {
map[string]DiscoveredCataloger{}, map[string]DiscoveredCataloger{},
map[string][]string{}, map[string][]string{},
map[string][]string{}, map[string][]string{},
[]string{}, []binary.Classifier{},
[]capabilities.CatalogerInfo{ []capabilities.CatalogerInfo{
{Name: tt.catalogerName, Selectors: []string{"test"}}, {Name: tt.catalogerName, Selectors: []string{"test"}},
}, },

View File

@ -49,9 +49,19 @@ type Detector struct {
Method ArtifactDetectionMethod `yaml:"method" json:"method"` // AUTO-GENERATED Method ArtifactDetectionMethod `yaml:"method" json:"method"` // AUTO-GENERATED
Criteria []string `yaml:"criteria" json:"criteria"` // AUTO-GENERATED Criteria []string `yaml:"criteria" json:"criteria"` // AUTO-GENERATED
Conditions []DetectorCondition `yaml:"conditions,omitempty" json:"conditions,omitempty"` // MANUAL - when this detector should be active Conditions []DetectorCondition `yaml:"conditions,omitempty" json:"conditions,omitempty"` // MANUAL - when this detector should be active
Packages []DetectorPackageInfo `yaml:"packages,omitempty" json:"packages,omitempty"` // AUTO-GENERATED for binary-classifier-cataloger
Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` // MANUAL - explanation of this detector Comment string `yaml:"comment,omitempty" json:"comment,omitempty"` // MANUAL - explanation of this detector
} }
// DetectorPackageInfo describes package information that a detector can produce
type DetectorPackageInfo struct {
Class string `yaml:"class" json:"class"` // classifier class (e.g., "python-binary-lib")
Name string `yaml:"name" json:"name"` // package name (e.g., "python")
PURL string `yaml:"purl" json:"purl"` // package URL without version (e.g., "pkg:generic/python")
CPEs []string `yaml:"cpes" json:"cpes"` // CPE strings
Type string `yaml:"type" json:"type"` // package type (e.g., "BinaryPkg")
}
// DetectorCondition specifies when a detector should be active based on configuration // DetectorCondition specifies when a detector should be active based on configuration
type DetectorCondition struct { type DetectorCondition struct {
// When specifies config field names and their required values (all must match - AND logic) // When specifies config field names and their required values (all must match - AND logic)

View File

@ -328,6 +328,7 @@ catalogers:
- linux - linux
- os - os
- package - package
- pacman
parsers: # AUTO-GENERATED structure parsers: # AUTO-GENERATED structure
- function: parseAlpmDB # AUTO-GENERATED - function: parseAlpmDB # AUTO-GENERATED
detector: # AUTO-GENERATED detector: # AUTO-GENERATED
@ -426,61 +427,578 @@ catalogers:
detectors: # AUTO-GENERATED detectors: # AUTO-GENERATED
- method: glob - method: glob
criteria: criteria:
- '**/VERSION*'
- '**/arangosh'
- '**/bash'
- '**/beam.smp'
- '**/busybox'
- '**/cabal'
- '**/chrome'
- '**/composer*'
- '**/consul'
- '**/curl'
- '**/dart'
- '**/erlexec'
- '**/ffmpeg'
- '**/fluent-bit'
- '**/gcc'
- '**/getopt'
- '**/ghc*'
- '**/go'
- '**/gzip'
- '**/haproxy'
- '**/helm'
- '**/httpd'
- '**/java'
- '**/jdb'
- '**/jq'
- '**/libav*'
- '**/liberts_internal.a'
- '**/libjulia-internal.so'
- '**/libpypy*.so*'
- '**/libpython*.so*'
- '**/libstd-????????????????.dylib'
- '**/libstd-????????????????.so'
- '**/libswresample*'
- '**/lighttpd'
- '**/memcached'
- '**/mysql'
- '**/nginx'
- '**/node'
- '**/openssl'
- '**/perl'
- '**/postgres'
- '**/proftpd'
- '**/python*' - '**/python*'
packages:
- class: python-binary
name: python
purl: pkg:generic/python
cpes:
- cpe:2.3:a:python_software_foundation:python:*:*:*:*:*:*:*:*
- cpe:2.3:a:python:python:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/libpython*.so*'
packages:
- class: python-binary-lib
name: python
purl: pkg:generic/python
cpes:
- cpe:2.3:a:python_software_foundation:python:*:*:*:*:*:*:*:*
- cpe:2.3:a:python:python:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/libpypy*.so*'
packages:
- class: pypy-binary-lib
name: pypy
purl: pkg:generic/pypy
cpes: []
type: BinaryPkg
- method: glob
criteria:
- '**/go'
packages:
- class: go-binary
name: go
purl: pkg:generic/go
cpes:
- cpe:2.3:a:golang:go:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/libjulia-internal.so'
packages:
- class: julia-binary
name: julia
purl: pkg:generic/julia
cpes:
- cpe:2.3:a:julialang:julia:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/helm'
packages:
- class: helm
name: helm
purl: pkg:golang/helm.sh/helm
cpes:
- cpe:2.3:a:helm:helm:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/redis-server' - '**/redis-server'
- '**/ruby' packages:
- '**/sqlcipher' - class: redis-binary
- '**/stack' name: redis
- '**/swipl' purl: pkg:generic/redis
cpes:
- cpe:2.3:a:redislabs:redis:*:*:*:*:*:*:*:*
- cpe:2.3:a:redis:redis:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/node'
packages:
- class: nodejs-binary
name: node
purl: pkg:generic/node
cpes:
- cpe:2.3:a:nodejs:node.js:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/VERSION*'
packages:
- class: go-binary-hint
name: go
purl: pkg:generic/go
cpes:
- cpe:2.3:a:golang:go:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/busybox'
packages:
- class: busybox-binary
name: busybox
purl: pkg:generic/busybox
cpes:
- cpe:2.3:a:busybox:busybox:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/getopt'
packages:
- class: util-linux-binary
name: util-linux
purl: pkg:generic/util-linux
cpes:
- cpe:2.3:a:kernel:util-linux:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/haproxy'
packages:
- class: haproxy-binary
name: haproxy
purl: pkg:generic/haproxy
cpes:
- cpe:2.3:a:haproxy:haproxy:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/perl'
packages:
- class: perl-binary
name: perl
purl: pkg:generic/perl
cpes:
- cpe:2.3:a:perl:perl:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/composer*'
packages:
- class: php-composer-binary
name: composer
purl: pkg:generic/composer
cpes:
- cpe:2.3:a:getcomposer:composer:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/httpd'
packages:
- class: httpd-binary
name: httpd
purl: pkg:generic/httpd
cpes:
- cpe:2.3:a:apache:http_server:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/memcached'
packages:
- class: memcached-binary
name: memcached
purl: pkg:generic/memcached
cpes:
- cpe:2.3:a:memcached:memcached:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/traefik' - '**/traefik'
- '**/vault' packages:
- '**/wp' - class: traefik-binary
name: traefik
purl: pkg:generic/traefik
cpes:
- cpe:2.3:a:traefik:traefik:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/arangosh'
packages:
- class: arangodb-binary
name: arangodb
purl: pkg:generic/arangodb
cpes:
- cpe:2.3:a:arangodb:arangodb:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/postgres'
packages:
- class: postgresql-binary
name: postgresql
purl: pkg:generic/postgresql
cpes:
- cpe:2.3:a:postgresql:postgresql:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/mysql'
packages:
- class: mysql-binary
name: mysql
purl: pkg:generic/mysql
cpes:
- cpe:2.3:a:oracle:mysql:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/mysql'
packages:
- class: mysql-binary
name: percona-server
purl: pkg:generic/percona-server
cpes:
- cpe:2.3:a:oracle:mysql:*:*:*:*:*:*:*:*
- cpe:2.3:a:percona:percona_server:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/mysql'
packages:
- class: mysql-binary
name: percona-xtradb-cluster
purl: pkg:generic/percona-xtradb-cluster
cpes:
- cpe:2.3:a:oracle:mysql:*:*:*:*:*:*:*:*
- cpe:2.3:a:percona:percona_server:*:*:*:*:*:*:*:*
- cpe:2.3:a:percona:xtradb_cluster:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/xtrabackup' - '**/xtrabackup'
- '**/xz' packages:
- '**/zstd' - class: xtrabackup-binary
name: percona-xtrabackup
purl: pkg:generic/percona-xtrabackup
cpes:
- cpe:2.3:a:percona:xtrabackup:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/{mariadb,mysql}' - '**/{mariadb,mysql}'
packages:
- class: mariadb-binary
name: mariadb
purl: pkg:generic/mariadb
cpes:
- cpe:2.3:a:mariadb:mariadb:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/libstd-????????????????.so'
packages:
- class: rust-standard-library-linux
name: rust
purl: pkg:generic/rust
cpes:
- cpe:2.3:a:rust-lang:rust:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/libstd-????????????????.dylib'
packages:
- class: rust-standard-library-macos
name: rust
purl: pkg:generic/rust
cpes:
- cpe:2.3:a:rust-lang:rust:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/ruby'
packages:
- class: ruby-binary
name: ruby
purl: pkg:generic/ruby
cpes:
- cpe:2.3:a:ruby-lang:ruby:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/erlexec'
packages:
- class: erlang-binary
name: erlang
purl: pkg:generic/erlang
cpes:
- cpe:2.3:a:erlang:erlang/otp:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/beam.smp'
packages:
- class: erlang-alpine-binary
name: erlang
purl: pkg:generic/erlang
cpes:
- cpe:2.3:a:erlang:erlang/otp:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/liberts_internal.a'
packages:
- class: erlang-library
name: erlang
purl: pkg:generic/erlang
cpes:
- cpe:2.3:a:erlang:erlang/otp:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/swipl'
packages:
- class: swipl-binary
name: swipl
purl: pkg:generic/swipl
cpes:
- cpe:2.3:a:erlang:erlang/otp:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/dart'
packages:
- class: dart-binary
name: dart
purl: pkg:generic/dart
cpes:
- cpe:2.3:a:dart:dart_software_development_kit:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/ghc*'
packages:
- class: haskell-ghc-binary
name: haskell/ghc
purl: pkg:generic/haskell/ghc
cpes:
- cpe:2.3:a:haskell:ghc:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/cabal'
packages:
- class: haskell-cabal-binary
name: haskell/cabal
purl: pkg:generic/haskell/cabal
cpes:
- cpe:2.3:a:haskell:cabal:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/stack'
packages:
- class: haskell-stack-binary
name: haskell/stack
purl: pkg:generic/haskell/stack
cpes:
- cpe:2.3:a:haskell:stack:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/consul'
packages:
- class: consul-binary
name: consul
purl: pkg:golang/github.com/hashicorp/consul
cpes:
- cpe:2.3:a:hashicorp:consul:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/vault'
packages:
- class: hashicorp-vault-binary
name: github.com/hashicorp/vault
purl: pkg:golang/github.com/hashicorp/vault
cpes:
- cpe:2.3:a:hashicorp:vault:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/nginx'
packages:
- class: nginx-binary
name: nginx
purl: pkg:generic/nginx
cpes:
- cpe:2.3:a:f5:nginx:*:*:*:*:*:*:*:*
- cpe:2.3:a:nginx:nginx:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/bash'
packages:
- class: bash-binary
name: bash
purl: pkg:generic/bash
cpes:
- cpe:2.3:a:gnu:bash:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/openssl'
packages:
- class: openssl-binary
name: openssl
purl: pkg:generic/openssl
cpes:
- cpe:2.3:a:openssl:openssl:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/gcc'
packages:
- class: gcc-binary
name: gcc
purl: pkg:generic/gcc
cpes:
- cpe:2.3:a:gnu:gcc:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/fluent-bit'
packages:
- class: fluent-bit-binary
name: fluent-bit
purl: pkg:github/fluent/fluent-bit
cpes:
- cpe:2.3:a:treasuredata:fluent_bit:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/wp'
packages:
- class: wordpress-cli-binary
name: wp-cli
purl: pkg:generic/wp-cli
cpes:
- cpe:2.3:a:wp-cli:wp-cli:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/curl'
packages:
- class: curl-binary
name: curl
purl: pkg:generic/curl
cpes:
- cpe:2.3:a:haxx:curl:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/lighttpd'
packages:
- class: lighttpd-binary
name: lighttpd
purl: pkg:generic/lighttpd
cpes:
- cpe:2.3:a:lighttpd:lighttpd:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/proftpd'
packages:
- class: proftpd-binary
name: proftpd
purl: pkg:generic/proftpd
cpes:
- cpe:2.3:a:proftpd:proftpd:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/zstd'
packages:
- class: zstd-binary
name: zstd
purl: pkg:generic/zstd
cpes:
- cpe:2.3:a:facebook:zstandard:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/xz'
packages:
- class: xz-binary
name: xz
purl: pkg:generic/xz
cpes:
- cpe:2.3:a:tukaani:xz:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/gzip'
packages:
- class: gzip-binary
name: gzip
purl: pkg:generic/gzip
cpes:
- cpe:2.3:a:gnu:gzip:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/sqlcipher'
packages:
- class: sqlcipher-binary
name: sqlcipher
purl: pkg:generic/sqlcipher
cpes:
- cpe:2.3:a:zetetic:sqlcipher:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/jq'
packages:
- class: jq-binary
name: jq
purl: pkg:generic/jq
cpes:
- cpe:2.3:a:jqlang:jq:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/chrome'
packages:
- class: chrome-binary
name: chrome
purl: pkg:generic/chrome
cpes:
- cpe:2.3:a:google:chrome:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/ffmpeg'
packages:
- class: ffmpeg-binary
name: ffmpeg
purl: pkg:generic/ffmpeg
cpes:
- cpe:2.3:a:ffmpeg:ffmpeg:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/libav*'
packages:
- class: ffmpeg-library
name: ffmpeg
purl: pkg:generic/ffmpeg
cpes:
- cpe:2.3:a:ffmpeg:ffmpeg:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/libswresample*'
packages:
- class: ffmpeg-library
name: ffmpeg
purl: pkg:generic/ffmpeg
cpes:
- cpe:2.3:a:ffmpeg:ffmpeg:*:*:*:*:*:*:*:*
type: BinaryPkg
- method: glob
criteria:
- '**/java'
packages:
- class: java-binary
name: ""
purl: pkg:/
cpes: []
type: BinaryPkg
- method: glob
criteria:
- '**/jdb'
packages:
- class: java-jdb-binary
name: ""
purl: pkg:/
cpes: []
type: BinaryPkg
metadata_types: # AUTO-GENERATED metadata_types: # AUTO-GENERATED
- pkg.BinarySignature - pkg.BinarySignature
package_types: # AUTO-GENERATED package_types: # AUTO-GENERATED