add rpmdb support; enhance integration tests

This commit is contained in:
Alex Goodman
2020-07-06 12:55:11 -04:00
parent 7cd16d05b8
commit 1896831c39
20 changed files with 300 additions and 17 deletions
+2
View File
@@ -4,6 +4,7 @@ import (
"github.com/anchore/imgbom/imgbom/cataloger/bundler"
"github.com/anchore/imgbom/imgbom/cataloger/dpkg"
"github.com/anchore/imgbom/imgbom/cataloger/python"
"github.com/anchore/imgbom/imgbom/cataloger/rpmdb"
"github.com/anchore/imgbom/imgbom/event"
"github.com/anchore/imgbom/imgbom/pkg"
"github.com/anchore/imgbom/imgbom/scope"
@@ -44,6 +45,7 @@ func newController() controller {
ctrlr.add(dpkg.NewCataloger())
ctrlr.add(bundler.NewCataloger())
ctrlr.add(python.NewCataloger())
ctrlr.add(rpmdb.NewCataloger())
return ctrlr
}
+34
View File
@@ -0,0 +1,34 @@
package rpmdb
import (
"github.com/anchore/imgbom/imgbom/cataloger/common"
"github.com/anchore/imgbom/imgbom/pkg"
"github.com/anchore/imgbom/imgbom/scope"
"github.com/anchore/stereoscope/pkg/file"
)
type Cataloger struct {
cataloger common.GenericCataloger
}
func NewCataloger() *Cataloger {
pathParsers := map[string]common.ParserFn{
"/var/lib/rpm/Packages": parseRpmDB,
}
return &Cataloger{
cataloger: common.NewGenericCataloger(pathParsers, nil),
}
}
func (a *Cataloger) Name() string {
return "rpmdb-cataloger"
}
func (a *Cataloger) SelectFiles(resolver scope.FileResolver) []file.Reference {
return a.cataloger.SelectFiles(resolver)
}
func (a *Cataloger) Catalog(contents map[file.Reference]string) ([]pkg.Package, error) {
return a.cataloger.Catalog(contents, a.Name())
}
+62
View File
@@ -0,0 +1,62 @@
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
}
@@ -0,0 +1,50 @@
package rpmdb
import (
"github.com/anchore/imgbom/imgbom/pkg"
"github.com/go-test/deep"
"os"
"testing"
)
func TestParseRpmDB(t *testing.T) {
expected := map[string]pkg.Package{
"dive": {
Name: "dive",
Version: "0.9.2",
Type: pkg.RpmPkg,
Metadata: pkg.RpmMetadata{
Epoch: 0,
Arch: "x86_64",
Release: "1",
},
},
}
fixture, err := os.Open("test-fixtures/Packages")
if err != nil {
t.Fatalf("failed to open fixture: %+v", err)
}
actual, err := parseRpmDB(fixture)
if err != nil {
t.Fatalf("failed to parse rpmdb: %+v", err)
}
if len(actual) != 1 {
for _, a := range actual {
t.Log(" ", a)
}
t.Fatalf("unexpected package count: %d!=%d", len(actual), 1)
}
for _, a := range actual {
e := expected[a.Name]
diffs := deep.Equal(a, e)
if len(diffs) > 0 {
for _, d := range diffs {
t.Errorf("diff: %+v", d)
}
}
}
}
Binary file not shown.
+23
View File
@@ -0,0 +1,23 @@
#!/usr/bin/env bash
set -eux
docker create --name generate-rpmdb-fixture centos:latest sh -c 'tail -f /dev/null'
function cleanup {
docker kill generate-rpmdb-fixture
docker rm generate-rpmdb-fixture
}
trap cleanup EXIT
docker start generate-rpmdb-fixture
docker exec -i --tty=false generate-rpmdb-fixture bash <<-EOF
mkdir -p /scratch
cd /scratch
rpm --initdb --dbpath /scratch
curl -sSLO https://github.com/wagoodman/dive/releases/download/v0.9.2/dive_0.9.2_linux_amd64.rpm
rpm --dbpath /scratch -ivh dive_0.9.2_linux_amd64.rpm
rm dive_0.9.2_linux_amd64.rpm
rpm --dbpath /scratch -qa
EOF
docker cp generate-rpmdb-fixture:/scratch/Packages .
+6 -6
View File
@@ -2,8 +2,8 @@ package pkg
const (
UnknownLanguage Language = iota
Java
JavaScript
//Java
//JavaScript
Python
Ruby
)
@@ -12,15 +12,15 @@ type Language uint
var languageStr = []string{
"UnknownLanguage",
"java",
"javascript",
//"java",
//"javascript",
"python",
"ruby",
}
var AllLanguages = []Language{
Java,
JavaScript,
//Java,
//JavaScript,
Python,
Ruby,
}
+6
View File
@@ -8,3 +8,9 @@ type DpkgMetadata struct {
Source string `mapstructure:"Source"`
Version string `mapstructure:"Version"`
}
type RpmMetadata struct {
Epoch int `mapstructure:"Epoch"`
Arch string `mapstructure:"Arch"`
Release string `mapstructure:"Release"`
}
+6 -6
View File
@@ -2,11 +2,11 @@ package pkg
const (
UnknownPkg Type = iota
ApkPkg
//ApkPkg
BundlerPkg
DebPkg
EggPkg
PacmanPkg
//PacmanPkg
RpmPkg
WheelPkg
)
@@ -15,21 +15,21 @@ type Type uint
var typeStr = []string{
"UnknownPackage",
"apk",
//"apk",
"bundle",
"deb",
"egg",
"pacman",
//"pacman",
"rpm",
"wheel",
}
var AllPkgs = []Type{
ApkPkg,
//ApkPkg,
BundlerPkg,
DebPkg,
EggPkg,
PacmanPkg,
//PacmanPkg,
RpmPkg,
WheelPkg,
}