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  }