github.com/anchore/syft@v1.38.2/syft/pkg/cataloger/redhat/parse_rpm_manifest.go (about) 1 package redhat 2 3 import ( 4 "bufio" 5 "context" 6 "errors" 7 "io" 8 "strings" 9 10 "github.com/anchore/syft/internal/log" 11 "github.com/anchore/syft/internal/unknown" 12 "github.com/anchore/syft/syft/artifact" 13 "github.com/anchore/syft/syft/file" 14 "github.com/anchore/syft/syft/pkg" 15 "github.com/anchore/syft/syft/pkg/cataloger/generic" 16 ) 17 18 // Parses an RPM manifest file, as used in Mariner distroless containers, and returns the Packages listed 19 func parseRpmManifest(ctx context.Context, _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) { 20 r := bufio.NewReader(reader) 21 allPkgs := make([]pkg.Package, 0) 22 23 for { 24 line, err := r.ReadString('\n') 25 if err != nil { 26 if errors.Is(err, io.EOF) { 27 break 28 } 29 return nil, nil, err 30 } 31 32 if line == "" { 33 continue 34 } 35 36 metadata, err := newMetadataFromManifestLine(strings.TrimSuffix(line, "\n")) 37 if err != nil { 38 log.Debugf("unable to parse RPM manifest entry: %+v", err) 39 continue 40 } 41 42 if metadata == nil { 43 log.Debug("unable to parse RPM manifest entry: no metadata found") 44 continue 45 } 46 47 p := newDBPackage(ctx, reader.Location, *metadata, nil, nil) 48 49 if !pkg.IsValid(&p) { 50 continue 51 } 52 53 p.SetID() 54 allPkgs = append(allPkgs, p) 55 } 56 57 return allPkgs, nil, unknown.IfEmptyf(allPkgs, "unable to determine packages") 58 }