github.com/lineaje-labs/syft@v0.98.1-0.20231227153149-9e393f60ff1b/cmd/syft/cli/eventloop/tasks.go (about) 1 package eventloop 2 3 import ( 4 "github.com/anchore/syft/cmd/syft/cli/options" 5 "github.com/anchore/syft/syft" 6 "github.com/anchore/syft/syft/artifact" 7 "github.com/anchore/syft/syft/file/cataloger/filecontent" 8 "github.com/anchore/syft/syft/file/cataloger/filedigest" 9 "github.com/anchore/syft/syft/file/cataloger/filemetadata" 10 "github.com/anchore/syft/syft/sbom" 11 "github.com/anchore/syft/syft/source" 12 "github.com/lineaje-labs/syft/internal/file" 13 ) 14 15 type Task func(*sbom.Artifacts, source.Source) ([]artifact.Relationship, error) 16 17 func Tasks(opts *options.Catalog) ([]Task, error) { 18 var tasks []Task 19 20 generators := []func(opts *options.Catalog) (Task, error){ 21 generateCatalogPackagesTask, 22 generateCatalogFileMetadataTask, 23 generateCatalogFileDigestsTask, 24 generateCatalogContentsTask, 25 } 26 27 for _, generator := range generators { 28 task, err := generator(opts) 29 if err != nil { 30 return nil, err 31 } 32 33 if task != nil { 34 tasks = append(tasks, task) 35 } 36 } 37 38 return tasks, nil 39 } 40 41 func generateCatalogPackagesTask(opts *options.Catalog) (Task, error) { 42 if !opts.Package.Cataloger.Enabled { 43 return nil, nil 44 } 45 46 task := func(results *sbom.Artifacts, src source.Source) ([]artifact.Relationship, error) { 47 packageCatalog, relationships, theDistro, err := syft.CatalogPackages(src, opts.ToCatalogerConfig()) 48 49 results.Packages = packageCatalog 50 results.LinuxDistribution = theDistro 51 52 return relationships, err 53 } 54 55 return task, nil 56 } 57 58 func generateCatalogFileMetadataTask(opts *options.Catalog) (Task, error) { 59 if !opts.FileMetadata.Cataloger.Enabled { 60 return nil, nil 61 } 62 63 metadataCataloger := filemetadata.NewCataloger() 64 65 task := func(results *sbom.Artifacts, src source.Source) ([]artifact.Relationship, error) { 66 resolver, err := src.FileResolver(opts.FileMetadata.Cataloger.GetScope()) 67 if err != nil { 68 return nil, err 69 } 70 71 result, err := metadataCataloger.Catalog(resolver) 72 if err != nil { 73 return nil, err 74 } 75 results.FileMetadata = result 76 return nil, nil 77 } 78 79 return task, nil 80 } 81 82 func generateCatalogFileDigestsTask(opts *options.Catalog) (Task, error) { 83 if !opts.FileMetadata.Cataloger.Enabled { 84 return nil, nil 85 } 86 87 hashes, err := file.Hashers(opts.FileMetadata.Digests...) 88 if err != nil { 89 return nil, err 90 } 91 92 digestsCataloger := filedigest.NewCataloger(hashes) 93 94 task := func(results *sbom.Artifacts, src source.Source) ([]artifact.Relationship, error) { 95 resolver, err := src.FileResolver(opts.FileMetadata.Cataloger.GetScope()) 96 if err != nil { 97 return nil, err 98 } 99 100 result, err := digestsCataloger.Catalog(resolver) 101 if err != nil { 102 return nil, err 103 } 104 results.FileDigests = result 105 return nil, nil 106 } 107 108 return task, nil 109 } 110 111 func generateCatalogContentsTask(opts *options.Catalog) (Task, error) { 112 if !opts.FileContents.Cataloger.Enabled { 113 return nil, nil 114 } 115 116 contentsCataloger, err := filecontent.NewCataloger(opts.FileContents.Globs, opts.FileContents.SkipFilesAboveSize) //nolint:staticcheck 117 if err != nil { 118 return nil, err 119 } 120 121 task := func(results *sbom.Artifacts, src source.Source) ([]artifact.Relationship, error) { 122 resolver, err := src.FileResolver(opts.FileContents.Cataloger.GetScope()) 123 if err != nil { 124 return nil, err 125 } 126 127 result, err := contentsCataloger.Catalog(resolver) 128 if err != nil { 129 return nil, err 130 } 131 results.FileContents = result 132 return nil, nil 133 } 134 135 return task, nil 136 } 137 138 func RunTask(t Task, a *sbom.Artifacts, src source.Source, c chan<- artifact.Relationship) error { 139 defer close(c) 140 141 relationships, err := t(a, src) 142 if err != nil { 143 return err 144 } 145 146 for _, relationship := range relationships { 147 c <- relationship 148 } 149 150 return nil 151 }