From 1e79986188e3ac9de8cc27e04be88dbb51832410 Mon Sep 17 00:00:00 2001 From: Alfredo Deza Date: Thu, 5 Nov 2020 16:04:38 -0500 Subject: [PATCH] json: update the document to include distro information Signed-off-by: Alfredo Deza --- syft/presenter/json/document.go | 22 +++++++++++++++++++--- syft/presenter/json/image.go | 4 +++- syft/presenter/json/presenter.go | 7 +++++-- syft/presenter/presenter.go | 2 +- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/syft/presenter/json/document.go b/syft/presenter/json/document.go index e43336df2..0762e934f 100644 --- a/syft/presenter/json/document.go +++ b/syft/presenter/json/document.go @@ -1,16 +1,24 @@ package json import ( + "github.com/anchore/syft/syft/distro" "github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/scope" ) type Document struct { - Artifacts []Artifact `json:"artifacts"` - Source Source `json:"source"` + Artifacts []Artifact `json:"artifacts"` + Source Source `json:"source"` + Distro Distribution `json:"distro"` } -func NewDocument(catalog *pkg.Catalog, s scope.Scope) (Document, error) { +// Distritbution provides information about a detected Linux Distribution +type Distribution struct { + Name string `json:"name"` + Version string `json:"version"` +} + +func NewDocument(catalog *pkg.Catalog, s scope.Scope, d distro.Distro) (Document, error) { doc := Document{ Artifacts: make([]Artifact, 0), } @@ -20,6 +28,14 @@ func NewDocument(catalog *pkg.Catalog, s scope.Scope) (Document, error) { return Document{}, nil } doc.Source = src + distroName := d.Name() + if distroName == "UnknownDistroType" { + distroName = "" + } + doc.Distro = Distribution{ + Name: distroName, + Version: d.FullVersion(), + } for _, p := range catalog.Sorted() { art, err := NewArtifact(p, s) diff --git a/syft/presenter/json/image.go b/syft/presenter/json/image.go index 22e6eb3cf..bffa999bf 100644 --- a/syft/presenter/json/image.go +++ b/syft/presenter/json/image.go @@ -1,6 +1,8 @@ package json -import "github.com/anchore/syft/syft/scope" +import ( + "github.com/anchore/syft/syft/scope" +) type Image struct { Layers []Layer `json:"layers"` diff --git a/syft/presenter/json/presenter.go b/syft/presenter/json/presenter.go index 206178ed6..7c5ee5407 100644 --- a/syft/presenter/json/presenter.go +++ b/syft/presenter/json/presenter.go @@ -4,6 +4,7 @@ import ( "encoding/json" "io" + "github.com/anchore/syft/syft/distro" "github.com/anchore/syft/syft/pkg" "github.com/anchore/syft/syft/scope" ) @@ -11,17 +12,19 @@ import ( type Presenter struct { catalog *pkg.Catalog scope scope.Scope + distro distro.Distro } -func NewPresenter(catalog *pkg.Catalog, s scope.Scope) *Presenter { +func NewPresenter(catalog *pkg.Catalog, s scope.Scope, d distro.Distro) *Presenter { return &Presenter{ catalog: catalog, scope: s, + distro: d, } } func (pres *Presenter) Present(output io.Writer) error { - doc, err := NewDocument(pres.catalog, pres.scope) + doc, err := NewDocument(pres.catalog, pres.scope, pres.distro) if err != nil { return err } diff --git a/syft/presenter/presenter.go b/syft/presenter/presenter.go index 49bd1e25b..65184a74e 100644 --- a/syft/presenter/presenter.go +++ b/syft/presenter/presenter.go @@ -28,7 +28,7 @@ type Presenter interface { func GetPresenter(option Option, s scope.Scope, catalog *pkg.Catalog, d *distro.Distro) Presenter { switch option { case JSONPresenter: - return json.NewPresenter(catalog, s) + return json.NewPresenter(catalog, s, *d) case TextPresenter: return text.NewPresenter(catalog, s) case TablePresenter: