Allow "docker info" to recognise Clear Linux.

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

Signed-off-by: James Hunt <james.o.hunt@intel.com>
Signed-off-by: Dimitri John Ledkov <dimitri.j.ledkov@intel.com>
This commit is contained in:
James Hunt
2015-09-04 18:07:13 +01:00
committed by Dimitri John Ledkov
parent 8eba018b61
commit b58a22a7e1
2 changed files with 38 additions and 10 deletions
@@ -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.
@@ -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 == "" {