~nskaggs/+junk/xenial-test

« back to all changes in this revision

Viewing changes to src/github.com/juju/utils/series/series_windows.go

  • Committer: Nicholas Skaggs
  • Date: 2016-10-24 20:56:05 UTC
  • Revision ID: nicholas.skaggs@canonical.com-20161024205605-z8lta0uvuhtxwzwl
Initi with beta15

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2015 Canonical Ltd.
 
2
// Copyright 2015 Cloudbase Solutions SRL
 
3
// Licensed under the AGPLv3, see LICENCE file for details.
 
4
 
 
5
package series
 
6
 
 
7
import (
 
8
        "os"
 
9
        "strings"
 
10
 
 
11
        "github.com/gabriel-samfira/sys/windows/registry"
 
12
        "github.com/juju/errors"
 
13
)
 
14
 
 
15
var (
 
16
        // currentVersionKey is defined as a variable instead of a constant
 
17
        // to allow overwriting during testing
 
18
        currentVersionKey = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"
 
19
 
 
20
        // isNanoKey determines the registry key that can be queried to determine whether
 
21
        // a machine is a nano machine
 
22
        isNanoKey = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Server\\ServerLevels"
 
23
)
 
24
 
 
25
func getVersionFromRegistry() (string, error) {
 
26
        k, err := registry.OpenKey(registry.LOCAL_MACHINE, currentVersionKey, registry.QUERY_VALUE)
 
27
        if err != nil {
 
28
                return "", errors.Trace(err)
 
29
        }
 
30
        defer k.Close()
 
31
        s, _, err := k.GetStringValue("ProductName")
 
32
        if err != nil {
 
33
                return "", errors.Trace(err)
 
34
        }
 
35
 
 
36
        return s, nil
 
37
}
 
38
 
 
39
func readSeries() (string, error) {
 
40
        ver, err := getVersionFromRegistry()
 
41
        if err != nil {
 
42
                return "unknown", errors.Trace(err)
 
43
        }
 
44
 
 
45
        var lookAt = windowsVersions
 
46
 
 
47
        isNano, err := isWindowsNano()
 
48
        if err != nil && os.IsNotExist(err) {
 
49
                return "unknown", errors.Trace(err)
 
50
        }
 
51
        if isNano {
 
52
                lookAt = windowsNanoVersions
 
53
        }
 
54
 
 
55
        for _, value := range windowsVersionMatchOrder {
 
56
                if strings.HasPrefix(ver, value) {
 
57
                        if val, ok := lookAt[value]; ok {
 
58
                                return val, nil
 
59
                        }
 
60
                }
 
61
        }
 
62
        return "unknown", errors.Errorf("unknown series %q", ver)
 
63
}
 
64
 
 
65
func isWindowsNano() (bool, error) {
 
66
        k, err := registry.OpenKey(registry.LOCAL_MACHINE, isNanoKey, registry.QUERY_VALUE)
 
67
        if err != nil {
 
68
                return false, errors.Trace(err)
 
69
        }
 
70
        defer k.Close()
 
71
 
 
72
        s, _, err := k.GetIntegerValue("NanoServer")
 
73
        if err != nil {
 
74
                return false, errors.Trace(err)
 
75
        }
 
76
        return s == 1, nil
 
77
}