2018-02-05 16:05:59 -05:00
|
|
|
package operatingsystem // import "github.com/docker/docker/pkg/parsers/operatingsystem"
|
2015-05-08 14:59:38 -07:00
|
|
|
|
|
|
|
import (
|
2018-02-28 14:54:21 -08:00
|
|
|
"fmt"
|
2017-05-23 10:22:32 -04:00
|
|
|
|
2019-05-30 09:51:41 -07:00
|
|
|
"github.com/docker/docker/pkg/system"
|
2018-02-28 14:54:21 -08:00
|
|
|
"golang.org/x/sys/windows/registry"
|
2015-05-08 14:59:38 -07:00
|
|
|
)
|
|
|
|
|
2015-07-25 10:35:07 +02:00
|
|
|
// GetOperatingSystem gets the name of the current operating system.
|
2015-05-08 14:59:38 -07:00
|
|
|
func GetOperatingSystem() (string, error) {
|
2019-05-30 09:51:41 -07:00
|
|
|
os, err := withCurrentVersionRegistryKey(func(key registry.Key) (os string, err error) {
|
|
|
|
if os, _, err = key.GetStringValue("ProductName"); err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
releaseId, _, err := key.GetStringValue("ReleaseId")
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
os = fmt.Sprintf("%s Version %s", os, releaseId)
|
|
|
|
|
|
|
|
buildNumber, _, err := key.GetStringValue("CurrentBuildNumber")
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ubr, _, err := key.GetIntegerValue("UBR")
|
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
os = fmt.Sprintf("%s (OS Build %s.%d)", os, buildNumber, ubr)
|
|
|
|
|
|
|
|
return
|
|
|
|
})
|
|
|
|
|
|
|
|
if os == "" {
|
|
|
|
// Default return value
|
|
|
|
os = "Unknown Operating System"
|
2018-02-28 14:54:21 -08:00
|
|
|
}
|
|
|
|
|
2019-05-30 09:51:41 -07:00
|
|
|
return os, err
|
|
|
|
}
|
2018-02-28 14:54:21 -08:00
|
|
|
|
2019-05-30 09:51:41 -07:00
|
|
|
func withCurrentVersionRegistryKey(f func(registry.Key) (string, error)) (string, error) {
|
|
|
|
key, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
|
2018-02-28 14:54:21 -08:00
|
|
|
if err != nil {
|
2019-05-30 09:51:41 -07:00
|
|
|
return "", err
|
2015-05-08 14:59:38 -07:00
|
|
|
}
|
2019-05-30 09:51:41 -07:00
|
|
|
defer key.Close()
|
|
|
|
return f(key)
|
|
|
|
}
|
2015-05-08 14:59:38 -07:00
|
|
|
|
2019-05-30 09:51:41 -07:00
|
|
|
// GetOperatingSystemVersion gets the version of the current operating system, as a string.
|
|
|
|
func GetOperatingSystemVersion() (string, error) {
|
|
|
|
version := system.GetOSVersion()
|
|
|
|
return fmt.Sprintf("%d.%d.%d", version.MajorVersion, version.MinorVersion, version.Build), nil
|
2015-05-08 14:59:38 -07:00
|
|
|
}
|
|
|
|
|
2015-07-25 10:35:07 +02:00
|
|
|
// IsContainerized returns true if we are running inside a container.
|
|
|
|
// No-op on Windows, always returns false.
|
2015-05-08 14:59:38 -07:00
|
|
|
func IsContainerized() (bool, error) {
|
|
|
|
return false, nil
|
|
|
|
}
|