diff --git a/pkg/parsers/operatingsystem/operatingsystem_linux.go b/pkg/parsers/operatingsystem/operatingsystem_linux.go index ca8ea8f05..0fe0b0636 100644 --- a/pkg/parsers/operatingsystem/operatingsystem_linux.go +++ b/pkg/parsers/operatingsystem/operatingsystem_linux.go @@ -14,19 +14,28 @@ 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) { - b, err := ioutil.ReadFile(etcOsRelease) - if err != nil { - return "", err + var err error + for _, file := range []string{etcOsRelease, altOsRelease} { + var b []byte + b, err = ioutil.ReadFile(file) + if err != nil { + // try next file + continue + } + if i := bytes.Index(b, []byte("PRETTY_NAME")); i >= 0 { + b = b[i+13:] + return string(b[:bytes.IndexByte(b, '"')]), nil + } + return "", errors.New("PRETTY_NAME not found") } - if i := bytes.Index(b, []byte("PRETTY_NAME")); i >= 0 { - b = b[i+13:] - return string(b[:bytes.IndexByte(b, '"')]), nil - } - return "", errors.New("PRETTY_NAME not found") + return "", err } // IsContainerized returns true if we are running inside a container. diff --git a/pkg/parsers/operatingsystem/operatingsystem_test.go b/pkg/parsers/operatingsystem/operatingsystem_test.go index b7d54cbb1..884935389 100644 --- a/pkg/parsers/operatingsystem/operatingsystem_test.go +++ b/pkg/parsers/operatingsystem/operatingsystem_test.go @@ -1,6 +1,7 @@ package operatingsystem import ( + "bytes" "io/ioutil" "os" "path/filepath" @@ -9,7 +10,8 @@ import ( func TestGetOperatingSystem(t *testing.T) { var ( - backup = etcOsRelease + backupEtc = etcOsRelease + backupAlt = altOsRelease ubuntuTrusty = []byte(`NAME="Ubuntu" VERSION="14.04, Trusty Tahr" ID=ubuntu @@ -34,25 +36,42 @@ ID_LIKE=debian VERSION_ID="14.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" +BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"`) + + noEtcOsRelease = []byte(`NAME="Ubuntu" +VERSION="15.04 (Vivid Vervet)" +ID=ubuntu +ID_LIKE=debian +PRETTY_NAME="Ubuntu 15.04" +VERSION_ID="15.04" +HOME_URL="http://www.ubuntu.com/" +SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"`) ) dir := os.TempDir() etcOsRelease = filepath.Join(dir, "etcOsRelease") + altOsRelease = filepath.Join(dir, "altOsRelease") defer func() { os.Remove(etcOsRelease) - etcOsRelease = backup + os.Remove(altOsRelease) + etcOsRelease = backupEtc + altOsRelease = backupAlt }() for expect, osRelease := range map[string][]byte{ "Ubuntu 14.04 LTS": ubuntuTrusty, "Gentoo/Linux": gentoo, "": noPrettyName, + "Ubuntu 15.04": noEtcOsRelease, } { if err := ioutil.WriteFile(etcOsRelease, osRelease, 0600); err != nil { t.Fatalf("failed to write to %s: %v", etcOsRelease, err) } + if bytes.Compare(osRelease, noEtcOsRelease) == 0 { + os.Rename(etcOsRelease, altOsRelease) + } s, err := GetOperatingSystem() if s != expect { if expect == "" {