github.com/safing/portbase@v0.19.5/utils/osdetail/version_windows.go (about) 1 package osdetail 2 3 import ( 4 "fmt" 5 "strings" 6 "sync" 7 8 "github.com/hashicorp/go-version" 9 "github.com/shirou/gopsutil/host" 10 ) 11 12 var ( 13 // versionRe = regexp.MustCompile(`[0-9\.]+`) 14 15 windowsNTVersion string 16 windowsNTVersionForCmp *version.Version 17 18 fetching sync.Mutex 19 fetched bool 20 ) 21 22 // WindowsNTVersion returns the current Windows version. 23 func WindowsNTVersion() (string, error) { 24 var err error 25 fetching.Lock() 26 defer fetching.Unlock() 27 28 if !fetched { 29 _, _, windowsNTVersion, err = host.PlatformInformation() 30 31 windowsNTVersion = strings.SplitN(windowsNTVersion, " ", 2)[0] 32 33 if err != nil { 34 return "", fmt.Errorf("failed to obtain Windows-Version: %s", err) 35 } 36 37 windowsNTVersionForCmp, err = version.NewVersion(windowsNTVersion) 38 39 if err != nil { 40 return "", fmt.Errorf("failed to parse Windows-Version %s: %s", windowsNTVersion, err) 41 } 42 43 fetched = true 44 } 45 46 return windowsNTVersion, err 47 } 48 49 // IsAtLeastWindowsNTVersion returns whether the current WindowsNT version is at least the given version or newer. 50 func IsAtLeastWindowsNTVersion(v string) (bool, error) { 51 _, err := WindowsNTVersion() 52 if err != nil { 53 return false, err 54 } 55 56 versionForCmp, err := version.NewVersion(v) 57 if err != nil { 58 return false, err 59 } 60 61 return windowsNTVersionForCmp.GreaterThanOrEqual(versionForCmp), nil 62 } 63 64 // IsAtLeastWindowsNTVersionWithDefault is like IsAtLeastWindowsNTVersion(), but keeps the Error and returns the default Value in Errorcase 65 func IsAtLeastWindowsNTVersionWithDefault(v string, defaultValue bool) bool { 66 val, err := IsAtLeastWindowsNTVersion(v) 67 if err != nil { 68 return defaultValue 69 } 70 return val 71 } 72 73 // IsAtLeastWindowsVersion returns whether the current Windows version is at least the given version or newer. 74 func IsAtLeastWindowsVersion(v string) (bool, error) { 75 var NTVersion string 76 switch v { 77 case "7": 78 NTVersion = "6.1" 79 case "8": 80 NTVersion = "6.2" 81 case "8.1": 82 NTVersion = "6.3" 83 case "10": 84 NTVersion = "10" 85 default: 86 return false, fmt.Errorf("failed to compare Windows-Version: Windows %s is unknown", v) 87 } 88 89 return IsAtLeastWindowsNTVersion(NTVersion) 90 } 91 92 // IsAtLeastWindowsVersionWithDefault is like IsAtLeastWindowsVersion(), but keeps the Error and returns the default Value in Errorcase 93 func IsAtLeastWindowsVersionWithDefault(v string, defaultValue bool) bool { 94 val, err := IsAtLeastWindowsVersion(v) 95 if err != nil { 96 return defaultValue 97 } 98 return val 99 }