diff --git a/Taskfile.yaml b/Taskfile.yaml index da755f073..a4a1201b4 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -497,6 +497,7 @@ tasks: desc: Add data generation tasks cmds: - task: generate-json-schema + - task: generate-capabilities - task: generate-license-list - task: generate-cpe-dictionary-index @@ -517,6 +518,12 @@ tasks: cmds: - "go generate" + generate-capabilities: + desc: Generate the capabilities data file + cmds: + - "go generate ./internal/capabilities/..." + - "gofmt -s -w ./internal/capabilities" + ## Build-related targets ################################# diff --git a/cmd/syft/internal/commands/cataloger_info.go b/cmd/syft/internal/commands/cataloger_info.go index 7d1cfebb0..d982d3071 100644 --- a/cmd/syft/internal/commands/cataloger_info.go +++ b/cmd/syft/internal/commands/cataloger_info.go @@ -138,6 +138,8 @@ func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []capabiliti Ecosystem string `json:"ecosystem,omitempty"` Name string `json:"name"` Type string `json:"type"` + Selectors []string `json:"selectors,omitempty"` + Deprecated bool `json:"deprecated,omitempty"` Patterns []patternInfo `json:"patterns,omitempty"` Capabilities capabilities.CapabilitySet `json:"capabilities,omitempty"` Config *configInfo `json:"config,omitempty"` @@ -154,6 +156,15 @@ func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []capabiliti Ecosystem: cat.Ecosystem, Name: cat.Name, Type: cat.Type, + Selectors: cat.Selectors, + } + + // check if cataloger is deprecated based on selectors + for _, selector := range cat.Selectors { + if selector == "deprecated" { + info.Deprecated = true + break + } } for _, parser := range cat.Parsers { diff --git a/internal/capabilities/generate/merge.go b/internal/capabilities/generate/merge.go index c84c0f268..444cb3844 100644 --- a/internal/capabilities/generate/merge.go +++ b/internal/capabilities/generate/merge.go @@ -546,7 +546,10 @@ func (m *CatalogerMerger) processGenericCataloger(existingEntry *capabilities.Ca // processCustomCataloger processes an existing custom cataloger entry func (m *CatalogerMerger) processCustomCataloger(existingEntry *capabilities.CatalogerEntry, info *capabilities.CatalogerInfo) { entry := *existingEntry - entry.Ecosystem = inferEcosystem(existingEntry.Name) + // only infer ecosystem if not manually set (ecosystem is MANUAL) + if existingEntry.Ecosystem == "" { + entry.Ecosystem = inferEcosystem(existingEntry.Name) + } entry.Selectors = info.Selectors // update config field from discovered mappings (AUTO-GENERATED) @@ -631,8 +634,10 @@ func updateEntry(existing *capabilities.CatalogerEntry, discovered DiscoveredCat updated.Config = "" } - // always re-infer ecosystem (it's MANUAL so users can override if needed) - updated.Ecosystem = inferEcosystem(discovered.Name) + // only infer ecosystem if not manually set (ecosystem is MANUAL) + if existing.Ecosystem == "" { + updated.Ecosystem = inferEcosystem(discovered.Name) + } var orphans []orphanInfo var newParsers []string diff --git a/internal/capabilities/packages.yaml b/internal/capabilities/packages.yaml index 7b2f2a460..93df13a6b 100644 --- a/internal/capabilities/packages.yaml +++ b/internal/capabilities/packages.yaml @@ -313,7 +313,7 @@ configs: # AUTO-GENERATED - config structs and their fields app_key: python.guess-unpinned-requirements catalogers: # alpm (arch / pacman) ################################################################################################# - - ecosystem: arch # MANUAL + - ecosystem: alpm # MANUAL name: alpm-db-cataloger # AUTO-GENERATED type: generic # AUTO-GENERATED source: # AUTO-GENERATED @@ -1400,7 +1400,10 @@ catalogers: - name: package_manager.files.digests default: false - name: package_manager.package_integrity_hash - default: false + default: true + evidence: + - ConanV1LockEntry.Ref + - ConanV2LockEntry.RecipeRevision - function: parseConanfile # AUTO-GENERATED detector: # AUTO-GENERATED method: glob # AUTO-GENERATED @@ -1608,7 +1611,7 @@ catalogers: - name: package_manager.package_integrity_hash default: false # Dpkg (debian) ################################################################################################### - - ecosystem: debian # MANUAL + - ecosystem: dpkg # MANUAL name: dpkg-db-cataloger # AUTO-GENERATED type: generic # AUTO-GENERATED source: # AUTO-GENERATED @@ -1660,7 +1663,7 @@ catalogers: - DpkgDBEntry.Files[].Digest - name: package_manager.package_integrity_hash default: false - - ecosystem: debian # MANUAL + - ecosystem: dpkg # MANUAL name: deb-archive-cataloger # AUTO-GENERATED type: generic # AUTO-GENERATED source: # AUTO-GENERATED @@ -3250,7 +3253,7 @@ catalogers: - name: package_manager.package_integrity_hash default: false # Portage (gentoo) ######################################################################################################## - - ecosystem: gentoo # MANUAL + - ecosystem: portage # MANUAL name: portage-cataloger # AUTO-GENERATED type: generic # AUTO-GENERATED source: # AUTO-GENERATED @@ -3492,11 +3495,13 @@ catalogers: - name: license default: false - name: dependency.depth - default: [] + default: + - direct - name: dependency.edges default: "" - name: dependency.kinds - default: [] + default: + - any - name: package_manager.files.listing default: false - name: package_manager.files.digests @@ -3575,13 +3580,11 @@ catalogers: - name: license default: true - name: dependency.depth - default: - - direct + default: [] - name: dependency.edges - default: complete + default: "" - name: dependency.kinds - default: - - runtime + default: [] - name: package_manager.files.listing default: true evidence: @@ -4078,6 +4081,8 @@ catalogers: default: false - name: package_manager.package_integrity_hash default: true + evidence: + - TerraformLockProviderEntry.Hashes # WordPress ###################################################################################################### - ecosystem: wordpress # MANUAL name: wordpress-plugins-cataloger # AUTO-GENERATED diff --git a/internal/spdxlicense/license_list.go b/internal/spdxlicense/license_list.go index 504affa00..40a097a14 100644 --- a/internal/spdxlicense/license_list.go +++ b/internal/spdxlicense/license_list.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// This file was generated by robots at 2025-10-21 13:02:27.818244 -0400 EDT m=+0.145508668 +// This file was generated by robots at 2025-10-26 16:38:06.07048 -0400 EDT m=+0.167648626 // using data from https://spdx.org/licenses/licenses.json package spdxlicense