github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/pkg/parsers/operatingsystem/operatingsystem_linux.go (about) 1 // Package operatingsystem provides helper function to get the operating system 2 // name for different platforms. 3 package operatingsystem // import "github.com/docker/docker/pkg/parsers/operatingsystem" 4 5 import ( 6 "bufio" 7 "bytes" 8 "fmt" 9 "os" 10 "strings" 11 ) 12 13 var ( 14 // file to use to detect if the daemon is running in a container 15 proc1Cgroup = "/proc/1/cgroup" 16 17 // file to check to determine Operating System 18 etcOsRelease = "/etc/os-release" 19 20 // used by stateless systems like Clear Linux 21 altOsRelease = "/usr/lib/os-release" 22 ) 23 24 // GetOperatingSystem gets the name of the current operating system. 25 func GetOperatingSystem() (string, error) { 26 if prettyName, err := getValueFromOsRelease("PRETTY_NAME"); err != nil { 27 return "", err 28 } else if prettyName != "" { 29 return prettyName, nil 30 } 31 32 // If not set, defaults to PRETTY_NAME="Linux" 33 // c.f. http://www.freedesktop.org/software/systemd/man/os-release.html 34 return "Linux", nil 35 } 36 37 // GetOperatingSystemVersion gets the version of the current operating system, as a string. 38 func GetOperatingSystemVersion() (string, error) { 39 return getValueFromOsRelease("VERSION_ID") 40 } 41 42 // parses the os-release file and returns the value associated with `key` 43 func getValueFromOsRelease(key string) (string, error) { 44 osReleaseFile, err := os.Open(etcOsRelease) 45 if err != nil { 46 if !os.IsNotExist(err) { 47 return "", fmt.Errorf("Error opening %s: %v", etcOsRelease, err) 48 } 49 osReleaseFile, err = os.Open(altOsRelease) 50 if err != nil { 51 return "", fmt.Errorf("Error opening %s: %v", altOsRelease, err) 52 } 53 } 54 defer osReleaseFile.Close() 55 56 var value string 57 keyWithTrailingEqual := key + "=" 58 scanner := bufio.NewScanner(osReleaseFile) 59 for scanner.Scan() { 60 line := scanner.Text() 61 if strings.HasPrefix(line, keyWithTrailingEqual) { 62 data := strings.SplitN(line, "=", 2) 63 value = strings.Trim(data[1], `"' `) // remove leading/trailing quotes and whitespace 64 } 65 } 66 67 return value, nil 68 } 69 70 // IsContainerized returns true if we are running inside a container. 71 func IsContainerized() (bool, error) { 72 b, err := os.ReadFile(proc1Cgroup) 73 if err != nil { 74 return false, err 75 } 76 for _, line := range bytes.Split(b, []byte{'\n'}) { 77 if len(line) > 0 && !bytes.HasSuffix(line, []byte(":/")) && !bytes.HasSuffix(line, []byte(":/init.scope")) { 78 return true, nil 79 } 80 } 81 return false, nil 82 }