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 }