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  }