forked from zhangkai8048/disko
/
virt.go
105 lines (86 loc) · 1.91 KB
/
virt.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package linux
import "log"
type virtType int
const (
virtUnset virtType = iota
virtUnknown
virtNone
virtKvm
virtError
virtQemu
virtZvm
virtVmware
virtMicrosoft
virtOracle
virtXen
virtBochs
virtUml
virtParallels
virtBhyve
)
var systemVirtType = virtUnset //nolint:gochecknoglobals
var virtTypesToString = map[virtType]string{ // nolint:gochecknoglobals
virtUnset: "unset",
virtUnknown: "unknown",
virtNone: "none",
virtKvm: "kvm",
virtError: "error",
virtQemu: "qemu",
virtZvm: "zvm",
virtVmware: "vmware",
virtMicrosoft: "microsoft",
virtOracle: "oracle",
virtXen: "xen",
virtBochs: "bochs",
virtUml: "uml",
virtParallels: "parallels",
virtBhyve: "bhyve",
}
func (t *virtType) String() string {
return virtTypesToString[*t]
}
type detector interface {
detectVirt() ([]byte, []byte, int)
logf(string, ...interface{})
}
type systemdDetector struct {
}
func (d *systemdDetector) detectVirt() ([]byte, []byte, int) {
return runCommandWithOutputErrorRc("systemd-detect-virt", "--vm")
}
func (d *systemdDetector) logf(format string, a ...interface{}) {
log.Printf(format, a...)
}
func getVirtType() virtType {
return getVirtTypeIface(&systemdDetector{})
}
func getVirtTypeIface(sdv detector) virtType {
if systemVirtType != virtUnset {
return systemVirtType
}
out, stderr, rc := sdv.detectVirt()
if rc == 0 || rc == 1 {
var strOut string
if len(out) > 1 {
strOut = string(out[:len(out)-1])
}
for t, s := range virtTypesToString {
if strOut == s {
systemVirtType = t
break
}
}
if systemVirtType == virtUnset {
sdv.logf("Unknown virt type: %s/%s", strOut, string(stderr))
systemVirtType = virtUnknown
}
} else {
sdv.logf("Failed to read virt type [%d]: %s/%s",
rc, string(out), string(stderr))
systemVirtType = virtError
}
return systemVirtType
}
func isKvm() bool {
return getVirtType() == virtKvm
}