github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/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/syft/artifact" 12 "github.com/anchore/syft/syft/file" 13 "github.com/anchore/syft/syft/pkg" 14 "github.com/anchore/syft/syft/pkg/cataloger/generic" 15 ) 16 17 // Parses an RPM manifest file, as used in Mariner distroless containers, and returns the Packages listed 18 func parseRpmManifest(_ context.Context, _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser) ([]pkg.Package, []artifact.Relationship, error) { 19 r := bufio.NewReader(reader) 20 allPkgs := make([]pkg.Package, 0) 21 22 for { 23 line, err := r.ReadString('\n') 24 if err != nil { 25 if errors.Is(err, io.EOF) { 26 break 27 } 28 return nil, nil, err 29 } 30 31 if line == "" { 32 continue 33 } 34 35 metadata, err := newMetadataFromManifestLine(strings.TrimSuffix(line, "\n")) 36 if err != nil { 37 log.Warnf("unable to parse RPM manifest entry: %+v", err) 38 continue 39 } 40 41 if metadata == nil { 42 log.Warn("unable to parse RPM manifest entry: no metadata found") 43 continue 44 } 45 46 p := newDBPackage(reader.Location, *metadata, nil, nil) 47 48 if !pkg.IsValid(&p) { 49 continue 50 } 51 52 p.SetID() 53 allPkgs = append(allPkgs, p) 54 } 55 56 return allPkgs, nil, nil 57 }