From c825ae24043dfbeb03bc30ca7adca3a461a1619c Mon Sep 17 00:00:00 2001 From: Jose Miguel Parrella Date: Fri, 25 Jun 2021 21:17:16 -0700 Subject: [PATCH 1/3] Completing the test for distro version Signed-off-by: Jose Miguel Parrella --- syft/distro/identify.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/syft/distro/identify.go b/syft/distro/identify.go index d322582e6..95d8d7ec1 100644 --- a/syft/distro/identify.go +++ b/syft/distro/identify.go @@ -91,7 +91,7 @@ func assemble(name, version, like string) *Distro { distroType, ok := IDMapping[name] // Both distro and version must be present - if len(name) == 0 { + if len(name) == 0 && len(version) == 0 { return nil } From c833472b6eb832313d9f637c9cc6a32430b7bad2 Mon Sep 17 00:00:00 2001 From: Jose Miguel Parrella Date: Fri, 25 Jun 2021 21:17:49 -0700 Subject: [PATCH 2/3] If distro name is unknown, try with the ID_LIKE Signed-off-by: Jose Miguel Parrella --- syft/distro/identify.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/syft/distro/identify.go b/syft/distro/identify.go index 95d8d7ec1..f935cca55 100644 --- a/syft/distro/identify.go +++ b/syft/distro/identify.go @@ -95,6 +95,12 @@ func assemble(name, version, like string) *Distro { return nil } + // If it's an unknown distro, try mapping the ID_LIKE + if !ok && len(like) != 0 { + name = like + distroType, ok = IDMapping[name] + } + if ok { distro, err := NewDistro(distroType, version, like) if err != nil { From 32a54b94bede728596e37175cb221c790e0b40c8 Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Thu, 12 Aug 2021 14:09:22 -0400 Subject: [PATCH 3/3] add unit tests for distro identification based on "like" field Signed-off-by: Alex Goodman --- syft/distro/identify.go | 3 +-- syft/distro/identify_test.go | 17 +++++++++++++++-- .../missing-id/usr/lib/os-release | 3 +++ .../missing-version/usr/lib/os-release | 2 ++ .../unknown-id/usr/lib/os-release | 4 ++++ 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 syft/distro/test-fixtures/partial-fields/missing-id/usr/lib/os-release create mode 100644 syft/distro/test-fixtures/partial-fields/missing-version/usr/lib/os-release create mode 100644 syft/distro/test-fixtures/partial-fields/unknown-id/usr/lib/os-release diff --git a/syft/distro/identify.go b/syft/distro/identify.go index f935cca55..ea03e8f52 100644 --- a/syft/distro/identify.go +++ b/syft/distro/identify.go @@ -97,8 +97,7 @@ func assemble(name, version, like string) *Distro { // If it's an unknown distro, try mapping the ID_LIKE if !ok && len(like) != 0 { - name = like - distroType, ok = IDMapping[name] + distroType, ok = IDMapping[like] } if ok { diff --git a/syft/distro/identify_test.go b/syft/distro/identify_test.go index f11d74693..4f01f1578 100644 --- a/syft/distro/identify_test.go +++ b/syft/distro/identify_test.go @@ -7,9 +7,8 @@ import ( "testing" "github.com/anchore/syft/internal" - "github.com/stretchr/testify/assert" - "github.com/anchore/syft/syft/source" + "github.com/stretchr/testify/assert" ) func TestIdentifyDistro(t *testing.T) { @@ -85,6 +84,20 @@ func TestIdentifyDistro(t *testing.T) { fixture: "test-fixtures/os/arch", Type: ArchLinux, }, + { + fixture: "test-fixtures/partial-fields/missing-id", + Type: Debian, + Version: "8.0.0", + }, + { + fixture: "test-fixtures/partial-fields/unknown-id", + Type: Debian, + Version: "8.0.0", + }, + { + fixture: "test-fixtures/partial-fields/missing-version", + Type: UnknownDistroType, + }, } observedDistros := internal.NewStringSet() diff --git a/syft/distro/test-fixtures/partial-fields/missing-id/usr/lib/os-release b/syft/distro/test-fixtures/partial-fields/missing-id/usr/lib/os-release new file mode 100644 index 000000000..d6370845a --- /dev/null +++ b/syft/distro/test-fixtures/partial-fields/missing-id/usr/lib/os-release @@ -0,0 +1,3 @@ +NAME="Debian GNU/Linux" +VERSION_ID="8" +ID_LIKE=debian diff --git a/syft/distro/test-fixtures/partial-fields/missing-version/usr/lib/os-release b/syft/distro/test-fixtures/partial-fields/missing-version/usr/lib/os-release new file mode 100644 index 000000000..899dd390a --- /dev/null +++ b/syft/distro/test-fixtures/partial-fields/missing-version/usr/lib/os-release @@ -0,0 +1,2 @@ +NAME="Debian GNU/Linux" +ID_LIKE=debian diff --git a/syft/distro/test-fixtures/partial-fields/unknown-id/usr/lib/os-release b/syft/distro/test-fixtures/partial-fields/unknown-id/usr/lib/os-release new file mode 100644 index 000000000..e7c3efe09 --- /dev/null +++ b/syft/distro/test-fixtures/partial-fields/unknown-id/usr/lib/os-release @@ -0,0 +1,4 @@ +NAME="Debian GNU/Linux" +VERSION_ID="8" +ID=my-awesome-distro +ID_LIKE=debian