github.com/noqcks/syft@v0.0.0-20230920222752-a9e2c4e288e5/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/internal/file" 6 "github.com/anchore/syft/syft" 7 "github.com/anchore/syft/syft/artifact" 8 "github.com/anchore/syft/syft/file/cataloger/filecontent" 9 "github.com/anchore/syft/syft/file/cataloger/filedigest" 10 "github.com/anchore/syft/syft/file/cataloger/filemetadata" 11 "github.com/anchore/syft/syft/file/cataloger/secrets" 12 "github.com/anchore/syft/syft/sbom" 13 "github.com/anchore/syft/syft/source" 14 ) 15 16 type Task func(*sbom.Artifacts, source.Source) ([]artifact.Relationship, error) 17 18 func Tasks(opts *options.Catalog) ([]Task, error) { 19 var tasks []Task 20 21 generators := []func(opts *options.Catalog) (Task, error){ 22 generateCatalogPackagesTask, 23 generateCatalogFileMetadataTask, 24 generateCatalogFileDigestsTask, 25 generateCatalogSecretsTask, 26 generateCatalogContentsTask, 27 } 28 29 for _, generator := range generators { 30 task, err := generator(opts) 31 if err != nil { 32 return nil, err 33 } 34 35 if task != nil { 36 tasks = append(tasks, task) 37 } 38 } 39 40 return tasks, nil 41 } 42 43 func generateCatalogPackagesTask(opts *options.Catalog) (Task, error) { 44 if !opts.Package.Cataloger.Enabled { 45 return nil, nil 46 } 47 48 task := func(results *sbom.Artifacts, src source.Source) ([]artifact.Relationship, error) { 49 packageCatalog, relationships, theDistro, err := syft.CatalogPackages(src, opts.ToCatalogerConfig()) 50 51 results.Packages = packageCatalog 52 results.LinuxDistribution = theDistro 53 54 return relationships, err 55 } 56 57 return task, nil 58 } 59 60 func generateCatalogFileMetadataTask(opts *options.Catalog) (Task, error) { 61 if !opts.FileMetadata.Cataloger.Enabled { 62 return nil, nil 63 } 64 65 metadataCataloger := filemetadata.NewCataloger() 66 67 task := func(results *sbom.Artifacts, src source.Source) ([]artifact.Relationship, error) { 68 resolver, err := src.FileResolver(opts.FileMetadata.Cataloger.GetScope()) 69 if err != nil { 70 return nil, err 71 } 72 73 result, err := metadataCataloger.Catalog(resolver) 74 if err != nil { 75 return nil, err 76 } 77 results.FileMetadata = result 78 return nil, nil 79 } 80 81 return task, nil 82 } 83 84 func generateCatalogFileDigestsTask(opts *options.Catalog) (Task, error) { 85 if !opts.FileMetadata.Cataloger.Enabled { 86 return nil, nil 87 } 88 89 hashes, err := file.Hashers(opts.FileMetadata.Digests...) 90 if err != nil { 91 return nil, err 92 } 93 94 digestsCataloger := filedigest.NewCataloger(hashes) 95 96 task := func(results *sbom.Artifacts, src source.Source) ([]artifact.Relationship, error) { 97 resolver, err := src.FileResolver(opts.FileMetadata.Cataloger.GetScope()) 98 if err != nil { 99 return nil, err 100 } 101 102 result, err := digestsCataloger.Catalog(resolver) 103 if err != nil { 104 return nil, err 105 } 106 results.FileDigests = result 107 return nil, nil 108 } 109 110 return task, nil 111 } 112 113 func generateCatalogSecretsTask(opts *options.Catalog) (Task, error) { 114 if !opts.Secrets.Cataloger.Enabled { 115 return nil, nil 116 } 117 118 patterns, err := secrets.GenerateSearchPatterns(secrets.DefaultSecretsPatterns, opts.Secrets.AdditionalPatterns, opts.Secrets.ExcludePatternNames) 119 if err != nil { 120 return nil, err 121 } 122 123 secretsCataloger, err := secrets.NewCataloger(patterns, opts.Secrets.RevealValues, opts.Secrets.SkipFilesAboveSize) //nolint:staticcheck 124 if err != nil { 125 return nil, err 126 } 127 128 task := func(results *sbom.Artifacts, src source.Source) ([]artifact.Relationship, error) { 129 resolver, err := src.FileResolver(opts.Secrets.Cataloger.GetScope()) 130 if err != nil { 131 return nil, err 132 } 133 134 result, err := secretsCataloger.Catalog(resolver) 135 if err != nil { 136 return nil, err 137 } 138 results.Secrets = result 139 return nil, nil 140 } 141 142 return task, nil 143 } 144 145 func generateCatalogContentsTask(opts *options.Catalog) (Task, error) { 146 if !opts.FileContents.Cataloger.Enabled { 147 return nil, nil 148 } 149 150 contentsCataloger, err := filecontent.NewCataloger(opts.FileContents.Globs, opts.FileContents.SkipFilesAboveSize) //nolint:staticcheck 151 if err != nil { 152 return nil, err 153 } 154 155 task := func(results *sbom.Artifacts, src source.Source) ([]artifact.Relationship, error) { 156 resolver, err := src.FileResolver(opts.FileContents.Cataloger.GetScope()) 157 if err != nil { 158 return nil, err 159 } 160 161 result, err := contentsCataloger.Catalog(resolver) 162 if err != nil { 163 return nil, err 164 } 165 results.FileContents = result 166 return nil, nil 167 } 168 169 return task, nil 170 } 171 172 func RunTask(t Task, a *sbom.Artifacts, src source.Source, c chan<- artifact.Relationship) error { 173 defer close(c) 174 175 relationships, err := t(a, src) 176 if err != nil { 177 return err 178 } 179 180 for _, relationship := range relationships { 181 c <- relationship 182 } 183 184 return nil 185 }