mirror of
https://github.com/anchore/syft.git
synced 2026-02-12 10:36:45 +01:00
use the new DpkgMetadata struct in the parser
Signed-off-by: Alfredo Deza <adeza@anchore.com>
This commit is contained in:
parent
888cee3336
commit
ada11973b2
@ -6,66 +6,15 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/anchore/imgbom/imgbom/pkg"
|
||||||
"github.com/mitchellh/mapstructure"
|
"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")
|
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)
|
buffedReader := bufio.NewReader(reader)
|
||||||
var entries = make([]Entry, 0)
|
var entries = make([]pkg.DpkgMetadata, 0)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
entry, err := parseEntry(buffedReader)
|
entry, err := parseEntry(buffedReader)
|
||||||
@ -81,8 +30,7 @@ func ParseEntries(reader io.Reader) ([]Entry, error) {
|
|||||||
return entries, nil
|
return entries, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseEntry(reader *bufio.Reader) (entry pkg.DpkgMetadata, err error) {
|
||||||
func parseEntry(reader *bufio.Reader) (entry Entry, err error) {
|
|
||||||
dpkgFields := make(map[string]string)
|
dpkgFields := make(map[string]string)
|
||||||
var key string
|
var key string
|
||||||
|
|
||||||
@ -90,9 +38,9 @@ func parseEntry(reader *bufio.Reader) (entry Entry, err error) {
|
|||||||
line, err := reader.ReadString('\n')
|
line, err := reader.ReadString('\n')
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
return Entry{}, endOfPackages
|
return pkg.DpkgMetadata{}, endOfPackages
|
||||||
}
|
}
|
||||||
return Entry{}, err
|
return pkg.DpkgMetadata{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
line = strings.TrimRight(line, "\n")
|
line = strings.TrimRight(line, "\n")
|
||||||
@ -100,7 +48,7 @@ func parseEntry(reader *bufio.Reader) (entry Entry, err error) {
|
|||||||
// empty line indicates end of entry
|
// empty line indicates end of entry
|
||||||
if len(line) == 0 {
|
if len(line) == 0 {
|
||||||
// if the entry has not started, keep parsing lines
|
// if the entry has not started, keep parsing lines
|
||||||
if len(dpkgFields) == 0{
|
if len(dpkgFields) == 0 {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
@ -110,12 +58,12 @@ func parseEntry(reader *bufio.Reader) (entry Entry, err error) {
|
|||||||
case strings.HasPrefix(line, " "):
|
case strings.HasPrefix(line, " "):
|
||||||
// a field-body continuation
|
// a field-body continuation
|
||||||
if len(key) == 0 {
|
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]
|
val, ok := dpkgFields[key]
|
||||||
if !ok {
|
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
|
// concatenate onto previous value
|
||||||
val = fmt.Sprintf("%s\n %s", val, strings.TrimSpace(line))
|
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:])
|
val := strings.TrimSpace(line[i+1:])
|
||||||
|
|
||||||
if _, ok := dpkgFields[key]; ok {
|
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
|
dpkgFields[key] = val
|
||||||
} else {
|
} 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)
|
err = mapstructure.Decode(dpkgFields, &entry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Entry{}, err
|
return pkg.DpkgMetadata{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return entry, nil
|
return entry, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user