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