diff --git a/syft/distro/identify.go b/syft/distro/identify.go index d322582e6..ea03e8f52 100644 --- a/syft/distro/identify.go +++ b/syft/distro/identify.go @@ -91,10 +91,15 @@ 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 } + // If it's an unknown distro, try mapping the ID_LIKE + if !ok && len(like) != 0 { + distroType, ok = IDMapping[like] + } + if ok { distro, err := NewDistro(distroType, version, like) if err != nil { 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