syft/imgbom/cataloger/rpmdb/parse_rpmdb.go
2020-07-06 12:55:11 -04:00

63 lines
1.2 KiB
Go

package rpmdb
import (
"fmt"
"io"
"io/ioutil"
"os"
"github.com/anchore/imgbom/imgbom/pkg"
"github.com/anchore/imgbom/internal"
"github.com/anchore/imgbom/internal/log"
rpmdb "github.com/knqyf263/go-rpmdb/pkg"
)
func parseRpmDB(reader io.Reader) ([]pkg.Package, error) {
f, err := ioutil.TempFile("", internal.ApplicationName+"-rpmdb")
if err != nil {
return nil, fmt.Errorf("failed to create temp rpmdb file: %w", err)
}
defer func() {
err = os.Remove(f.Name())
if err != nil {
log.Errorf("failed to remove temp rpmdb file: %+v", err)
}
}()
_, err = io.Copy(f, reader)
if err != nil {
return nil, fmt.Errorf("failed to copy rpmdb contents to temp file: %w", err)
}
db := rpmdb.DB{}
err = db.Open(f.Name())
if err != nil {
return nil, err
}
pkgList, err := db.ListPackages()
if err != nil {
return nil, err
}
allPkgs := make([]pkg.Package, 0)
for _, entry := range pkgList {
p := pkg.Package{
Name: entry.Name,
Version: entry.Version,
Type: pkg.RpmPkg,
Metadata: pkg.RpmMetadata{
Epoch: entry.Epoch,
Arch: entry.Arch,
Release: entry.Release,
},
}
allPkgs = append(allPkgs, p)
}
return allPkgs, nil
}