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  }