From ada11973b2e7d97f33222f002fc413695e2f5def Mon Sep 17 00:00:00 2001 From: Alfredo Deza Date: Tue, 19 May 2020 09:09:37 -0400 Subject: [PATCH] use the new DpkgMetadata struct in the parser Signed-off-by: Alfredo Deza --- imgbom/analyzer/dpkg/parser.go | 79 ++++++---------------------------- 1 file changed, 13 insertions(+), 66 deletions(-) diff --git a/imgbom/analyzer/dpkg/parser.go b/imgbom/analyzer/dpkg/parser.go index 26717cd18..c1442b453 100644 --- a/imgbom/analyzer/dpkg/parser.go +++ b/imgbom/analyzer/dpkg/parser.go @@ -6,66 +6,15 @@ import ( "io" "strings" + "github.com/anchore/imgbom/imgbom/pkg" "github.com/mitchellh/mapstructure" ) -// TODO: consider keeping the remaining values as an embedded map -type Entry struct { - Package string `mapstructure:"Package"` - Architecture string `mapstructure:"Architecture"` - DependsPkgs string `mapstructure:"Depends"` - InstalledSize string `mapstructure:"Installed-Size"` - Maintainer string `mapstructure:"Maintainer"` - Priority string `mapstructure:"Priority"` - ProvidesPkgs string `mapstructure:"Provides"` - RecommendsPkgs string `mapstructure:"Recommends"` - ReplacesPkgs string `mapstructure:"Replaces"` - Status string `mapstructure:"Status"` - SuggestsPkgs string `mapstructure:"Suggests"` - Version string `mapstructure:"Version"` - ConfigFiles string `mapstructure:"Conffiles"` -} - -// dpkg-query recognized fields -// Architecture -// Bugs -// Conffiles (internal) -// Config-Version (internal) -// Conflicts -// Breaks -// Depends -// Description -// Enhances -// Essential -// Filename (internal, front-end related) -// Homepage -// Installed-Size -// MD5sum (internal, front-end related) -// MSDOS-Filename (internal, front-end related) -// Maintainer -// Origin -// Package -// Pre-Depends -// Priority -// Provides -// Recommends -// Replaces -// Revision (obsolete) -// Section -// Size (internal, front-end related) -// Source -// Status (internal) -// Suggests -// Tag (usually not in .deb but in repository Packages files) -// Triggers-Awaited (internal) -// Triggers-Pending (internal) -// Version - var endOfPackages = fmt.Errorf("no more packages to read") -func ParseEntries(reader io.Reader) ([]Entry, error) { +func ParseEntries(reader io.Reader) ([]pkg.DpkgMetadata, error) { buffedReader := bufio.NewReader(reader) - var entries = make([]Entry, 0) + var entries = make([]pkg.DpkgMetadata, 0) for { entry, err := parseEntry(buffedReader) @@ -81,8 +30,7 @@ func ParseEntries(reader io.Reader) ([]Entry, error) { return entries, nil } - -func parseEntry(reader *bufio.Reader) (entry Entry, err error) { +func parseEntry(reader *bufio.Reader) (entry pkg.DpkgMetadata, err error) { dpkgFields := make(map[string]string) var key string @@ -90,9 +38,9 @@ func parseEntry(reader *bufio.Reader) (entry Entry, err error) { line, err := reader.ReadString('\n') if err != nil { if err == io.EOF { - return Entry{}, endOfPackages + return pkg.DpkgMetadata{}, endOfPackages } - return Entry{}, err + return pkg.DpkgMetadata{}, err } line = strings.TrimRight(line, "\n") @@ -100,7 +48,7 @@ func parseEntry(reader *bufio.Reader) (entry Entry, err error) { // empty line indicates end of entry if len(line) == 0 { // if the entry has not started, keep parsing lines - if len(dpkgFields) == 0{ + if len(dpkgFields) == 0 { continue } break @@ -110,12 +58,12 @@ func parseEntry(reader *bufio.Reader) (entry Entry, err error) { case strings.HasPrefix(line, " "): // a field-body continuation if len(key) == 0 { - return Entry{}, fmt.Errorf("no match for continuation: line: '%s'", line) + return pkg.DpkgMetadata{}, fmt.Errorf("no match for continuation: line: '%s'", line) } val, ok := dpkgFields[key] if !ok { - return Entry{}, fmt.Errorf("no previous key exists, expecting: %s", key) + return pkg.DpkgMetadata{}, fmt.Errorf("no previous key exists, expecting: %s", key) } // concatenate onto previous value val = fmt.Sprintf("%s\n %s", val, strings.TrimSpace(line)) @@ -127,21 +75,20 @@ func parseEntry(reader *bufio.Reader) (entry Entry, err error) { val := strings.TrimSpace(line[i+1:]) if _, ok := dpkgFields[key]; ok { - return Entry{}, fmt.Errorf("duplicate key discovered: %s", key) + return pkg.DpkgMetadata{}, fmt.Errorf("duplicate key discovered: %s", key) } dpkgFields[key] = val } else { - return Entry{}, fmt.Errorf("cannot parse field from line: '%s'", line) + return pkg.DpkgMetadata{}, fmt.Errorf("cannot parse field from line: '%s'", line) } } } - + err = mapstructure.Decode(dpkgFields, &entry) if err != nil { - return Entry{}, err + return pkg.DpkgMetadata{}, err } return entry, nil } -