From 6aba2f48d4611a1414fb13ce58af6bd9d4566317 Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Fri, 6 Nov 2020 10:44:27 -0500 Subject: [PATCH] split out rpmdb file processing to helper + lint fixes Signed-off-by: Alex Goodman --- go.mod | 4 +- go.sum | 4 ++ syft/cataloger/rpmdb/cataloger.go | 6 +-- syft/cataloger/rpmdb/parse_rpmdb.go | 44 +++++++++++-------- syft/cataloger/rpmdb/parse_rpmdb_test.go | 4 +- syft/scope/resolvers/all_layers_resolver.go | 1 - syft/scope/resolvers/image_squash_resolver.go | 1 - 7 files changed, 36 insertions(+), 28 deletions(-) diff --git a/go.mod b/go.mod index 1c3385836..42ea39ed9 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,10 @@ go 1.14 require ( github.com/adrg/xdg v0.2.1 - github.com/anchore/go-rpmdb v0.0.0-20200811175839-cbc751c28e8e + github.com/anchore/go-rpmdb v0.0.0-20201106153645-0043963c2e12 github.com/anchore/go-testutils v0.0.0-20200925183923-d5f45b0d3c04 github.com/anchore/go-version v1.2.2-0.20200701162849-18adb9c92b9b - github.com/anchore/stereoscope v0.0.0-20200925184903-c82da54e98fe + github.com/anchore/stereoscope v0.0.0-20201106140100-12e75c48f409 github.com/bmatcuk/doublestar v1.3.3 github.com/docker/docker v17.12.0-ce-rc1.0.20200309214505-aa6a9891b09c+incompatible github.com/dustin/go-humanize v1.0.0 diff --git a/go.sum b/go.sum index 71719b51e..55021990b 100644 --- a/go.sum +++ b/go.sum @@ -126,12 +126,16 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/anchore/go-rpmdb v0.0.0-20200811175839-cbc751c28e8e h1:kty6r0R2JeaNPeWKSYDC+HW3hkqwFh4PP5TQ8pUPYFw= github.com/anchore/go-rpmdb v0.0.0-20200811175839-cbc751c28e8e/go.mod h1:iYuIG0Nai8dR0ri3LhZQKUyO1loxUWAGvoWhXDmjy1A= +github.com/anchore/go-rpmdb v0.0.0-20201106153645-0043963c2e12 h1:xbeIbn5F52JVx3RUIajxCj8b0y+9lywspql4sFhcxWQ= +github.com/anchore/go-rpmdb v0.0.0-20201106153645-0043963c2e12/go.mod h1:juoyWXIj7sJ1IDl4E/KIfyLtovbs5XQVSIdaQifFQT8= github.com/anchore/go-testutils v0.0.0-20200925183923-d5f45b0d3c04 h1:VzprUTpc0vW0nnNKJfJieyH/TZ9UYAnTZs5/gHTdAe8= github.com/anchore/go-testutils v0.0.0-20200925183923-d5f45b0d3c04/go.mod h1:6dK64g27Qi1qGQZ67gFmBFvEHScy0/C8qhQhNe5B5pQ= github.com/anchore/go-version v1.2.2-0.20200701162849-18adb9c92b9b h1:e1bmaoJfZVsCYMrIZBpFxwV26CbsuoEh5muXD5I1Ods= github.com/anchore/go-version v1.2.2-0.20200701162849-18adb9c92b9b/go.mod h1:Bkc+JYWjMCF8OyZ340IMSIi2Ebf3uwByOk6ho4wne1E= github.com/anchore/stereoscope v0.0.0-20200925184903-c82da54e98fe h1:m4NSyTo2fVUoUHAV/ZVqE/PFMr/y8oz9HRrhWLk9It0= github.com/anchore/stereoscope v0.0.0-20200925184903-c82da54e98fe/go.mod h1:2Jja/4l0zYggW52og+nn0rut4i+OYjCf9vTyrM8RT4E= +github.com/anchore/stereoscope v0.0.0-20201106140100-12e75c48f409 h1:xKSpDRjmYrEFrdMeDh4AuSUAFc99pdro6YFBKxy2um0= +github.com/anchore/stereoscope v0.0.0-20201106140100-12e75c48f409/go.mod h1:2Jja/4l0zYggW52og+nn0rut4i+OYjCf9vTyrM8RT4E= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/apex/log v1.1.4/go.mod h1:AlpoD9aScyQfJDVHmLMEcx4oU6LqzkWp4Mg9GdAcEvQ= github.com/apex/log v1.3.0 h1:1fyfbPvUwD10nMoh3hY6MXzvZShJQn9/ck7ATgAt5pA= diff --git a/syft/cataloger/rpmdb/cataloger.go b/syft/cataloger/rpmdb/cataloger.go index 25d57d610..e134b2bfb 100644 --- a/syft/cataloger/rpmdb/cataloger.go +++ b/syft/cataloger/rpmdb/cataloger.go @@ -27,17 +27,15 @@ func (c *Cataloger) Name() string { return "rpmdb-cataloger" } -// Catalog is given an object to resolve file references and content, this function returns any discovered Packages after analyzing python egg and wheel installations. +// Catalog is given an object to resolve file references and content, this function returns any discovered Packages after analyzing rpm db installation. func (c *Cataloger) Catalog(resolver scope.Resolver) ([]pkg.Package, error) { - fileMatches, err := resolver.FilesByGlob(packagesGlob) if err != nil { - return nil, fmt.Errorf("failed to find rpmdb's by glob") + return nil, fmt.Errorf("failed to find rpmdb's by glob: %w", err) } var pkgs []pkg.Package for _, ref := range fileMatches { - dbContents, err := resolver.FileContentsByRef(ref) if err != nil { return nil, err diff --git a/syft/cataloger/rpmdb/parse_rpmdb.go b/syft/cataloger/rpmdb/parse_rpmdb.go index 59bd1f222..9fc474583 100644 --- a/syft/cataloger/rpmdb/parse_rpmdb.go +++ b/syft/cataloger/rpmdb/parse_rpmdb.go @@ -48,24 +48,9 @@ func parseRpmDB(resolver scope.FileResolver, reader io.Reader) ([]pkg.Package, e allPkgs := make([]pkg.Package, 0) for _, entry := range pkgList { - var records = make([]pkg.RpmdbFileRecord, 0) - - for _, record := range entry.Files { - refs, err := resolver.FilesByPath(file.Path(record.Path)) - if err != nil { - return nil, fmt.Errorf("failed to resolve path=%+v: %w", record.Path, err) - } - //only persist RPMDB file records which exist in the image/directory, otherwise ignore them - if len(refs) == 0 { - continue - } - - records = append(records, pkg.RpmdbFileRecord{ - Path: record.Path, - Mode: pkg.RpmdbFileMode(record.Mode), - Size: int(record.Size), - SHA256: record.SHA256, - }) + records, err := extractRpmdbFileRecords(resolver, entry) + if err != nil { + return nil, err } p := pkg.Package{ @@ -93,3 +78,26 @@ func parseRpmDB(resolver scope.FileResolver, reader io.Reader) ([]pkg.Package, e return allPkgs, nil } + +func extractRpmdbFileRecords(resolver scope.FileResolver, entry *rpmdb.PackageInfo) ([]pkg.RpmdbFileRecord, error) { + var records = make([]pkg.RpmdbFileRecord, 0) + + for _, record := range entry.Files { + refs, err := resolver.FilesByPath(file.Path(record.Path)) + if err != nil { + return nil, fmt.Errorf("failed to resolve path=%+v: %w", record.Path, err) + } + //only persist RPMDB file records which exist in the image/directory, otherwise ignore them + if len(refs) == 0 { + continue + } + + records = append(records, pkg.RpmdbFileRecord{ + Path: record.Path, + Mode: pkg.RpmdbFileMode(record.Mode), + Size: int(record.Size), + SHA256: record.SHA256, + }) + } + return records, nil +} diff --git a/syft/cataloger/rpmdb/parse_rpmdb_test.go b/syft/cataloger/rpmdb/parse_rpmdb_test.go index 13348f783..6d1988932 100644 --- a/syft/cataloger/rpmdb/parse_rpmdb_test.go +++ b/syft/cataloger/rpmdb/parse_rpmdb_test.go @@ -33,10 +33,10 @@ func (r *rpmdbTestFileResolverMock) FilesByPath(paths ...file.Path) ([]file.Refe return refs, nil } -func (r *rpmdbTestFileResolverMock) FilesByGlob(_ ...string) ([]file.Reference, error) { +func (r *rpmdbTestFileResolverMock) FilesByGlob(...string) ([]file.Reference, error) { return nil, fmt.Errorf("not implemented") } -func (r *rpmdbTestFileResolverMock) RelativeFileByPath(_ file.Reference, path string) (*file.Reference, error) { +func (r *rpmdbTestFileResolverMock) RelativeFileByPath(file.Reference, string) (*file.Reference, error) { return nil, fmt.Errorf("not implemented") } diff --git a/syft/scope/resolvers/all_layers_resolver.go b/syft/scope/resolvers/all_layers_resolver.go index ab732cf17..a1c57ccda 100644 --- a/syft/scope/resolvers/all_layers_resolver.go +++ b/syft/scope/resolvers/all_layers_resolver.go @@ -111,7 +111,6 @@ func (r *AllLayersResolver) FilesByGlob(patterns ...string) ([]file.Reference, e } for _, ref := range refs { - // don't consider directories (special case: there is no path information for /) if ref.Path == "/" { continue diff --git a/syft/scope/resolvers/image_squash_resolver.go b/syft/scope/resolvers/image_squash_resolver.go index 47ae8507f..be1b7fe80 100644 --- a/syft/scope/resolvers/image_squash_resolver.go +++ b/syft/scope/resolvers/image_squash_resolver.go @@ -73,7 +73,6 @@ func (r *ImageSquashResolver) FilesByGlob(patterns ...string) ([]file.Reference, } for _, ref := range refs { - // don't consider directories (special case: there is no path information for /) if ref.Path == "/" { continue