From 292a15e40a7201801fb9b0abd81175fd0a09a814 Mon Sep 17 00:00:00 2001 From: Alexander Morozov Date: Mon, 16 Nov 2015 16:19:14 -0800 Subject: [PATCH] Use /usr/lib/os-release if /etc/os-release is missing. As per os-release spec, /usr/lib/os-release file should be tried if /etc/os-release is missing. http://www.freedesktop.org/software/systemd/man/os-release.html Thanks James Hunt and Dimitri John Ledkov for contribution. Close #17174 Signed-off-by: Alexander Morozov --- .../operatingsystem/operatingsystem_linux.go | 11 ++++++- .../operatingsystem_unix_test.go | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/pkg/parsers/operatingsystem/operatingsystem_linux.go b/pkg/parsers/operatingsystem/operatingsystem_linux.go index f6f0a7289f..787ae48223 100644 --- a/pkg/parsers/operatingsystem/operatingsystem_linux.go +++ b/pkg/parsers/operatingsystem/operatingsystem_linux.go @@ -19,13 +19,22 @@ var ( // file to check to determine Operating System etcOsRelease = "/etc/os-release" + + // used by stateless systems like Clear Linux + altOsRelease = "/usr/lib/os-release" ) // GetOperatingSystem gets the name of the current operating system. func GetOperatingSystem() (string, error) { osReleaseFile, err := os.Open(etcOsRelease) if err != nil { - return "", err + if !os.IsNotExist(err) { + return "", fmt.Errorf("Error opening %s: %v", etcOsRelease, err) + } + osReleaseFile, err = os.Open(altOsRelease) + if err != nil { + return "", fmt.Errorf("Error opening %s: %v", altOsRelease, err) + } } defer osReleaseFile.Close() diff --git a/pkg/parsers/operatingsystem/operatingsystem_unix_test.go b/pkg/parsers/operatingsystem/operatingsystem_unix_test.go index 1bad093c95..7b2ffea5da 100644 --- a/pkg/parsers/operatingsystem/operatingsystem_unix_test.go +++ b/pkg/parsers/operatingsystem/operatingsystem_unix_test.go @@ -195,3 +195,32 @@ func TestIsContainerized(t *testing.T) { t.Fatal("Wrongly assuming non-containerized") } } + +func TestOsReleaseFallback(t *testing.T) { + var backup = etcOsRelease + var altBackup = altOsRelease + dir := os.TempDir() + etcOsRelease = filepath.Join(dir, "etcOsRelease") + altOsRelease = filepath.Join(dir, "altOsRelease") + + defer func() { + os.Remove(dir) + etcOsRelease = backup + altOsRelease = altBackup + }() + content := `NAME=Gentoo +ID=gentoo +PRETTY_NAME="Gentoo/Linux" +ANSI_COLOR="1;32" +HOME_URL="http://www.gentoo.org/" +SUPPORT_URL="http://www.gentoo.org/main/en/support.xml" +BUG_REPORT_URL="https://bugs.gentoo.org/" +` + if err := ioutil.WriteFile(altOsRelease, []byte(content), 0600); err != nil { + t.Fatalf("failed to write to %s: %v", etcOsRelease, err) + } + s, err := GetOperatingSystem() + if err != nil || s != "Gentoo/Linux" { + t.Fatalf("Expected %q, got %q (err: %v)", "Gentoo/Linux", s, err) + } +}