github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/version/osversion_windows.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Copyright 2015 Cloudbase Solutions SRL 3 // Licensed under the AGPLv3, see LICENCE file for details. 4 5 package version 6 7 import ( 8 "strings" 9 10 "github.com/gabriel-samfira/sys/windows/registry" 11 "github.com/juju/errors" 12 ) 13 14 // currentVersionKey is defined as a variable instead of a constant 15 // to allow overwriting during testing 16 var currentVersionKey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" 17 18 func getVersionFromRegistry() (string, error) { 19 k, err := registry.OpenKey(registry.LOCAL_MACHINE, currentVersionKey, registry.QUERY_VALUE) 20 if err != nil { 21 return "", err 22 } 23 defer k.Close() 24 s, _, err := k.GetStringValue("ProductName") 25 if err != nil { 26 return "", err 27 } 28 29 return s, nil 30 } 31 32 func osVersion() (string, error) { 33 ver, err := getVersionFromRegistry() 34 if err != nil { 35 return "unknown", err 36 } 37 if val, ok := windowsVersions[ver]; ok { 38 return val, nil 39 } 40 for _, value := range windowsVersionMatchOrder { 41 if strings.HasPrefix(ver, value) { 42 if val, ok := windowsVersions[value]; ok { 43 return val, nil 44 } 45 } 46 } 47 return "unknown", errors.Errorf("unknown series %q", ver) 48 }