github.com/lineaje-labs/syft@v0.98.1-0.20231227153149-9e393f60ff1b/syft/pkg/cataloger/java/rpm_parser.go (about)

     1  package java
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/anchore/syft/syft/artifact"
     7  	"github.com/anchore/syft/syft/file"
     8  	"github.com/anchore/syft/syft/pkg"
     9  	"github.com/anchore/syft/syft/pkg/cataloger/generic"
    10  	"github.com/anchore/syft/syft/pkg/cataloger/redhat"
    11  	internalFile "github.com/lineaje-labs/syft/internal/file"
    12  )
    13  
    14  var genericRpmGlobs = []string{
    15  	"**/*.rpm",
    16  }
    17  
    18  // TODO: when the generic archive cataloger is implemented, this should be removed (https://github.com/anchore/syft/issues/246)
    19  type genericRPMWrappedJavaArchiveParser struct {
    20  	cfg ArchiveCatalogerConfig
    21  }
    22  
    23  func newGenericRPMWrappedJavaArchiveParser(cfg ArchiveCatalogerConfig) genericRPMWrappedJavaArchiveParser {
    24  	return genericRPMWrappedJavaArchiveParser{
    25  		cfg: cfg,
    26  	}
    27  }
    28  
    29  // parseRPMJavaArchive is a parser function for java archive contents contained within rpm files.
    30  func (grp *genericRPMWrappedJavaArchiveParser) parseRPMJavaArchive(
    31  	resolver file.Resolver, _ *generic.Environment, reader file.LocationReadCloser,
    32  ) ([]pkg.Package, []artifact.Relationship, error) {
    33  	contentPath, archivePath, cleanupFn, err := saveArchiveToTmp(reader.Path(), reader)
    34  	// note: even on error, we should always run cleanup functions
    35  	defer cleanupFn()
    36  	if err != nil {
    37  		return nil, nil, err
    38  	}
    39  
    40  	_cataloger := redhat.NewArchiveCataloger()
    41  	var rpmPackages []pkg.Package
    42  	rpmPackages, _, err = _cataloger.Catalog(resolver)
    43  	if err != nil {
    44  		return nil, nil, fmt.Errorf("unable to read files from java archive: %w", err)
    45  	}
    46  
    47  	var packages []pkg.Package
    48  	var relationships []artifact.Relationship
    49  	for _, rpmPackage := range rpmPackages {
    50  		_packages, _relationships, err := discoverPkgsFromRPM(reader.Location, archivePath, contentPath, rpmPackage, grp.cfg)
    51  		if err == nil {
    52  			packages = append(packages, _packages...)
    53  			relationships = append(relationships, _relationships...)
    54  		}
    55  	}
    56  	return packages, relationships, nil
    57  }
    58  
    59  func discoverPkgsFromRPM(
    60  	location file.Location, archivePath, contentPath string, parentPkg pkg.Package, cfg ArchiveCatalogerConfig,
    61  ) ([]pkg.Package, []artifact.Relationship, error) {
    62  	openers, err := internalFile.ExtractGlobsFromRPMToUniqueTempFile(archivePath, contentPath, archiveFormatGlobs...)
    63  	if err != nil {
    64  		return nil, nil, fmt.Errorf("unable to extract files from tar: %w", err)
    65  	}
    66  
    67  	var relationships []artifact.Relationship
    68  	_packages, _, err := discoverPkgsFromOpeners(location, openers, &parentPkg, cfg)
    69  	if err == nil {
    70  		for index := range _packages {
    71  			id := _packages[index].ID()
    72  			if id == "" {
    73  				_packages[index].SetID()
    74  			}
    75  			_relationship := artifact.Relationship{
    76  				From: parentPkg,
    77  				To:   _packages[index],
    78  				Type: artifact.ContainsRelationship,
    79  			}
    80  			relationships = append(relationships, _relationship)
    81  		}
    82  	}
    83  	return _packages, relationships, err
    84  }