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  }