github.com/lineaje-labs/syft@v0.98.1-0.20231227153149-9e393f60ff1b/syft/pkg/cataloger/redhat/parse_rpm_manifest.go (about) 1 package redhat 2 3 import ( 4 "bufio" 5 "errors" 6 "io" 7 "strings" 8 9 "github.com/anchore/syft/syft/artifact" 10 "github.com/anchore/syft/syft/file" 11 "github.com/anchore/syft/syft/pkg" 12 "github.com/anchore/syft/syft/pkg/cataloger/generic" 13 "github.com/lineaje-labs/syft/internal/log" 14 ) 15 16 // Parses an RPM manifest file, as used in Mariner distroless containers, and returns the Packages listed 17 func parseRpmManifest( 18 _ file.Resolver, _ *generic.Environment, reader file.LocationReadCloser, 19 ) ([]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.Warnf("unable to parse RPM manifest entry: %+v", err) 39 continue 40 } 41 42 if metadata == nil { 43 log.Warn("unable to parse RPM manifest entry: no metadata found") 44 continue 45 } 46 47 p := newDBPackage(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, nil 58 }