@@ -2,187 +2,52 @@ package system
2
2
3
3
import (
4
4
"context"
5
- "fmt"
6
5
"os"
7
6
"runtime"
8
- "strings"
9
7
"time"
10
8
11
9
log "github.com/sirupsen/logrus"
12
- "github.com/yusufpapurcu/wmi"
13
- "golang.org/x/sys/windows/registry"
14
10
15
11
"github.com/netbirdio/netbird/version"
16
12
)
17
13
18
- type Win32_OperatingSystem struct {
19
- Caption string
20
- }
21
-
22
- type Win32_ComputerSystem struct {
23
- Manufacturer string
24
- }
25
-
26
- type Win32_ComputerSystemProduct struct {
27
- Name string
28
- }
29
-
30
- type Win32_BIOS struct {
31
- SerialNumber string
14
+ func UpdateStaticInfoAsync () {
15
+ go updateStaticInfo ()
32
16
}
33
17
34
18
// GetInfo retrieves and parses the system information
35
19
func GetInfo (ctx context.Context ) * Info {
36
- osName , osVersion := getOSNameAndVersion ()
37
- buildVersion := getBuildVersion ()
38
-
39
- addrs , err := networkAddresses ()
40
- if err != nil {
41
- log .Warnf ("failed to discover network addresses: %s" , err )
42
- }
43
-
44
20
start := time .Now ()
45
- si := updateStaticInfo ()
21
+ si := getStaticInfo ()
46
22
if time .Since (start ) > 1 * time .Second {
47
23
log .Warnf ("updateStaticInfo took %s" , time .Since (start ))
48
24
}
49
25
50
26
gio := & Info {
51
27
Kernel : "windows" ,
52
- OSVersion : osVersion ,
28
+ OSVersion : si . OSVersion ,
53
29
Platform : "unknown" ,
54
- OS : osName ,
30
+ OS : si . OSName ,
55
31
GoOS : runtime .GOOS ,
56
32
CPUs : runtime .NumCPU (),
57
- KernelVersion : buildVersion ,
58
- NetworkAddresses : addrs ,
33
+ KernelVersion : si .BuildVersion ,
59
34
SystemSerialNumber : si .SystemSerialNumber ,
60
35
SystemProductName : si .SystemProductName ,
61
36
SystemManufacturer : si .SystemManufacturer ,
62
37
Environment : si .Environment ,
63
38
}
64
39
40
+ addrs , err := networkAddresses ()
41
+ if err != nil {
42
+ log .Warnf ("failed to discover network addresses: %s" , err )
43
+ } else {
44
+ gio .NetworkAddresses = addrs
45
+ }
46
+
65
47
systemHostname , _ := os .Hostname ()
66
48
gio .Hostname = extractDeviceName (ctx , systemHostname )
67
49
gio .NetbirdVersion = version .NetbirdVersion ()
68
50
gio .UIVersion = extractUserAgent (ctx )
69
51
70
52
return gio
71
53
}
72
-
73
- func sysInfo () (serialNumber string , productName string , manufacturer string ) {
74
- var err error
75
- serialNumber , err = sysNumber ()
76
- if err != nil {
77
- log .Warnf ("failed to get system serial number: %s" , err )
78
- }
79
-
80
- productName , err = sysProductName ()
81
- if err != nil {
82
- log .Warnf ("failed to get system product name: %s" , err )
83
- }
84
-
85
- manufacturer , err = sysManufacturer ()
86
- if err != nil {
87
- log .Warnf ("failed to get system manufacturer: %s" , err )
88
- }
89
-
90
- return serialNumber , productName , manufacturer
91
- }
92
-
93
- func getOSNameAndVersion () (string , string ) {
94
- var dst []Win32_OperatingSystem
95
- query := wmi .CreateQuery (& dst , "" )
96
- err := wmi .Query (query , & dst )
97
- if err != nil {
98
- log .Error (err )
99
- return "Windows" , getBuildVersion ()
100
- }
101
-
102
- if len (dst ) == 0 {
103
- return "Windows" , getBuildVersion ()
104
- }
105
-
106
- split := strings .Split (dst [0 ].Caption , " " )
107
-
108
- if len (split ) <= 3 {
109
- return "Windows" , getBuildVersion ()
110
- }
111
-
112
- name := split [1 ]
113
- version := split [2 ]
114
- if split [2 ] == "Server" {
115
- name = fmt .Sprintf ("%s %s" , split [1 ], split [2 ])
116
- version = split [3 ]
117
- }
118
-
119
- return name , version
120
- }
121
-
122
- func getBuildVersion () string {
123
- k , err := registry .OpenKey (registry .LOCAL_MACHINE , `SOFTWARE\Microsoft\Windows NT\CurrentVersion` , registry .QUERY_VALUE )
124
- if err != nil {
125
- log .Error (err )
126
- return "0.0.0.0"
127
- }
128
- defer func () {
129
- deferErr := k .Close ()
130
- if deferErr != nil {
131
- log .Error (deferErr )
132
- }
133
- }()
134
-
135
- major , _ , err := k .GetIntegerValue ("CurrentMajorVersionNumber" )
136
- if err != nil {
137
- log .Error (err )
138
- }
139
- minor , _ , err := k .GetIntegerValue ("CurrentMinorVersionNumber" )
140
- if err != nil {
141
- log .Error (err )
142
- }
143
- build , _ , err := k .GetStringValue ("CurrentBuildNumber" )
144
- if err != nil {
145
- log .Error (err )
146
- }
147
- // Update Build Revision
148
- ubr , _ , err := k .GetIntegerValue ("UBR" )
149
- if err != nil {
150
- log .Error (err )
151
- }
152
- ver := fmt .Sprintf ("%d.%d.%s.%d" , major , minor , build , ubr )
153
- return ver
154
- }
155
-
156
- func sysNumber () (string , error ) {
157
- var dst []Win32_BIOS
158
- query := wmi .CreateQuery (& dst , "" )
159
- err := wmi .Query (query , & dst )
160
- if err != nil {
161
- return "" , err
162
- }
163
- return dst [0 ].SerialNumber , nil
164
- }
165
-
166
- func sysProductName () (string , error ) {
167
- var dst []Win32_ComputerSystemProduct
168
- query := wmi .CreateQuery (& dst , "" )
169
- err := wmi .Query (query , & dst )
170
- if err != nil {
171
- return "" , err
172
- }
173
- // `ComputerSystemProduct` could be empty on some virtualized systems
174
- if len (dst ) < 1 {
175
- return "unknown" , nil
176
- }
177
- return dst [0 ].Name , nil
178
- }
179
-
180
- func sysManufacturer () (string , error ) {
181
- var dst []Win32_ComputerSystem
182
- query := wmi .CreateQuery (& dst , "" )
183
- err := wmi .Query (query , & dst )
184
- if err != nil {
185
- return "" , err
186
- }
187
- return dst [0 ].Manufacturer , nil
188
- }
0 commit comments