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  }