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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
// Copyright 2020 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
package host
import (
"bufio"
"bytes"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
)
func init() {
machineInfoFuncs = []machineInfoFunc{
{"CPU Info", readCPUInfo},
{"KVM", readKVMInfo},
}
}
func readCPUInfo(buffer *bytes.Buffer) error {
file, err := os.Open("/proc/cpuinfo")
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanCPUInfo(buffer, scanner)
return nil
}
func scanCPUInfo(buffer *bytes.Buffer, scanner *bufio.Scanner) {
keyIndices := make(map[string]int)
type keyValues struct {
key string
values []string
}
var info []keyValues
for scanner.Scan() {
splitted := strings.Split(scanner.Text(), ":")
if len(splitted) != 2 {
continue
}
key := strings.TrimSpace(splitted[0])
val := strings.TrimSpace(splitted[1])
if idx, ok := keyIndices[key]; !ok {
idx = len(keyIndices)
keyIndices[key] = idx
info = append(info, keyValues{key, []string{val}})
} else {
info[idx].values = append(info[idx].values, val)
}
}
for _, kv := range info {
// It is guaranteed that len(vals) >= 1
key := kv.key
vals := kv.values
if allEqual(vals) {
fmt.Fprintf(buffer, "%-20s: %s\n", key, vals[0])
} else {
fmt.Fprintf(buffer, "%-20s: %s\n", key, strings.Join(vals, ", "))
}
}
}
func allEqual(slice []string) bool {
if len(slice) == 0 {
return true
}
for i := 1; i < len(slice); i++ {
if slice[i] != slice[0] {
return false
}
}
return true
}
func readKVMInfo(buffer *bytes.Buffer) error {
files, err := ioutil.ReadDir("/sys/module/")
if err != nil {
return err
}
for _, file := range files {
name := file.Name()
if !strings.HasPrefix(name, "kvm") {
continue
}
paramPath := filepath.Join("/sys", "module", name, "parameters")
params, err := ioutil.ReadDir(paramPath)
if err != nil {
if os.IsNotExist(err) {
continue
}
return err
}
if len(params) == 0 {
continue
}
fmt.Fprintf(buffer, "/sys/module/%s:\n", name)
for _, key := range params {
keyName := key.Name()
data, err := ioutil.ReadFile(filepath.Join(paramPath, keyName))
if err != nil {
return err
}
fmt.Fprintf(buffer, "\t%s: ", keyName)
buffer.Write(data)
}
buffer.WriteByte('\n')
}
return nil
}
|