12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package operatingsystem // import "github.com/docker/docker/pkg/parsers/operatingsystem"
- import (
- "errors"
- "github.com/Microsoft/hcsshim/osversion"
- "golang.org/x/sys/windows"
- "golang.org/x/sys/windows/registry"
- )
- // VER_NT_WORKSTATION, see https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfoexa
- const verNTWorkstation = 0x00000001 // VER_NT_WORKSTATION
- // GetOperatingSystem gets the name of the current operating system.
- func GetOperatingSystem() (string, error) {
- osversion := windows.RtlGetVersion() // Always succeeds.
- rel := windowsOSRelease{
- IsServer: osversion.ProductType != verNTWorkstation,
- Build: osversion.BuildNumber,
- }
- // Make a best-effort attempt to retrieve the display version and
- // Update Build Revision by querying undocumented registry values.
- key, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE)
- if err == nil {
- defer key.Close()
- if ver, err := getFirstStringValue(key,
- "DisplayVersion", /* Windows 20H2 and above */
- "ReleaseId", /* Windows 2009 and below */
- ); err == nil {
- rel.DisplayVersion = ver
- }
- if ubr, _, err := key.GetIntegerValue("UBR"); err == nil {
- rel.UBR = ubr
- }
- }
- return rel.String(), nil
- }
- func getFirstStringValue(key registry.Key, names ...string) (string, error) {
- for _, n := range names {
- val, _, err := key.GetStringValue(n)
- if err != nil {
- if !errors.Is(err, registry.ErrNotExist) {
- return "", err
- }
- continue
- }
- return val, nil
- }
- return "", registry.ErrNotExist
- }
- // GetOperatingSystemVersion gets the version of the current operating system, as a string.
- func GetOperatingSystemVersion() (string, error) {
- return osversion.Get().ToString(), nil
- }
- // IsContainerized returns true if we are running inside a container.
- // No-op on Windows, always returns false.
- func IsContainerized() (bool, error) {
- return false, nil
- }
- // IsWindowsClient returns true if the SKU is client. It returns false on
- // Windows server.
- func IsWindowsClient() bool {
- return windows.RtlGetVersion().ProductType == verNTWorkstation
- }
|