systeminformation 5.31.16 → 5.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -7
- package/lib/audio.js +6 -5
- package/lib/battery.js +6 -2
- package/lib/bluetooth.js +6 -2
- package/lib/cpu.js +68 -45
- package/lib/docker.js +49 -62
- package/lib/dockerSocket.js +56 -261
- package/lib/filesystem.js +32 -23
- package/lib/graphics.js +167 -89
- package/lib/index.d.ts +1 -0
- package/lib/index.js +4 -2
- package/lib/memory.js +6 -3
- package/lib/network.js +19 -5
- package/lib/osinfo.js +20 -9
- package/lib/printer.js +5 -5
- package/lib/processes.js +49 -15
- package/lib/system.js +3 -4
- package/lib/usb.js +0 -4
- package/lib/util.js +32 -14
- package/lib/virtualbox.js +10 -4
- package/lib/wifi.js +32 -19
- package/package.json +4 -3
package/lib/dockerSocket.js
CHANGED
|
@@ -15,307 +15,102 @@
|
|
|
15
15
|
|
|
16
16
|
const net = require('net');
|
|
17
17
|
const isWin = require('os').type() === 'Windows_NT';
|
|
18
|
-
const socketPath = isWin ? '//./pipe/docker_engine' : '/var/run/docker.sock';
|
|
18
|
+
const socketPath = process.env.DOCKER_SOCKET || (isWin ? '//./pipe/docker_engine' : '/var/run/docker.sock');
|
|
19
|
+
const socketTimeout = +process.env.DOCKER_SOCKET_TIMEOUT || 30000;
|
|
20
|
+
|
|
21
|
+
function fetchJson(path, callback) {
|
|
22
|
+
let done = false;
|
|
23
|
+
const finish = (result) => {
|
|
24
|
+
if (!done) {
|
|
25
|
+
done = true;
|
|
26
|
+
callback(result);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
try {
|
|
30
|
+
const socket = net.createConnection({ path: socketPath });
|
|
31
|
+
let alldata = '';
|
|
32
|
+
|
|
33
|
+
socket.setTimeout(socketTimeout, () => {
|
|
34
|
+
socket.destroy();
|
|
35
|
+
finish({});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
socket.on('connect', () => {
|
|
39
|
+
socket.write(`GET ${path} HTTP/1.0\r\n\r\n`);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
socket.on('data', (data) => {
|
|
43
|
+
alldata = alldata + data.toString();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
socket.on('error', () => {
|
|
47
|
+
finish({});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
socket.on('end', () => {
|
|
51
|
+
const startbody = alldata.indexOf('\r\n\r\n');
|
|
52
|
+
const status = parseInt(alldata.split(' ')[1], 10);
|
|
53
|
+
if (startbody < 0 || isNaN(status) || status < 200 || status >= 300) {
|
|
54
|
+
return finish({});
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
finish(JSON.parse(alldata.substring(startbody + 4)));
|
|
58
|
+
} catch {
|
|
59
|
+
finish({});
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
} catch {
|
|
63
|
+
finish({});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
19
66
|
|
|
20
67
|
class DockerSocket {
|
|
21
68
|
getInfo(callback) {
|
|
22
|
-
|
|
23
|
-
let socket = net.createConnection({ path: socketPath });
|
|
24
|
-
let alldata = '';
|
|
25
|
-
let data;
|
|
26
|
-
|
|
27
|
-
socket.on('connect', () => {
|
|
28
|
-
socket.write('GET http:/info HTTP/1.0\r\n\r\n');
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
socket.on('data', (data) => {
|
|
32
|
-
alldata = alldata + data.toString();
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
socket.on('error', () => {
|
|
36
|
-
socket = false;
|
|
37
|
-
callback({});
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
socket.on('end', () => {
|
|
41
|
-
const startbody = alldata.indexOf('\r\n\r\n');
|
|
42
|
-
alldata = alldata.substring(startbody + 4);
|
|
43
|
-
socket = false;
|
|
44
|
-
try {
|
|
45
|
-
data = JSON.parse(alldata);
|
|
46
|
-
callback(data);
|
|
47
|
-
} catch {
|
|
48
|
-
callback({});
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
} catch {
|
|
52
|
-
callback({});
|
|
53
|
-
}
|
|
69
|
+
fetchJson('http:/info', callback);
|
|
54
70
|
}
|
|
55
71
|
|
|
56
72
|
listImages(all, callback) {
|
|
57
|
-
|
|
58
|
-
let socket = net.createConnection({ path: socketPath });
|
|
59
|
-
let alldata = '';
|
|
60
|
-
let data;
|
|
61
|
-
|
|
62
|
-
socket.on('connect', () => {
|
|
63
|
-
socket.write('GET http:/images/json' + (all ? '?all=1' : '') + ' HTTP/1.0\r\n\r\n');
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
socket.on('data', (data) => {
|
|
67
|
-
alldata = alldata + data.toString();
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
socket.on('error', () => {
|
|
71
|
-
socket = false;
|
|
72
|
-
callback({});
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
socket.on('end', () => {
|
|
76
|
-
const startbody = alldata.indexOf('\r\n\r\n');
|
|
77
|
-
alldata = alldata.substring(startbody + 4);
|
|
78
|
-
socket = false;
|
|
79
|
-
try {
|
|
80
|
-
data = JSON.parse(alldata);
|
|
81
|
-
callback(data);
|
|
82
|
-
} catch {
|
|
83
|
-
callback({});
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
} catch {
|
|
87
|
-
callback({});
|
|
88
|
-
}
|
|
73
|
+
fetchJson(`http:/images/json${all ? '?all=1' : ''}`, callback);
|
|
89
74
|
}
|
|
90
75
|
|
|
91
76
|
inspectImage(id, callback) {
|
|
92
|
-
id = id || '';
|
|
93
77
|
if (id) {
|
|
94
|
-
|
|
95
|
-
let socket = net.createConnection({ path: socketPath });
|
|
96
|
-
let alldata = '';
|
|
97
|
-
let data;
|
|
98
|
-
|
|
99
|
-
socket.on('connect', () => {
|
|
100
|
-
socket.write('GET http:/images/' + id + '/json?stream=0 HTTP/1.0\r\n\r\n');
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
socket.on('data', (data) => {
|
|
104
|
-
alldata = alldata + data.toString();
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
socket.on('error', () => {
|
|
108
|
-
socket = false;
|
|
109
|
-
callback({});
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
socket.on('end', () => {
|
|
113
|
-
const startbody = alldata.indexOf('\r\n\r\n');
|
|
114
|
-
alldata = alldata.substring(startbody + 4);
|
|
115
|
-
socket = false;
|
|
116
|
-
try {
|
|
117
|
-
data = JSON.parse(alldata);
|
|
118
|
-
callback(data);
|
|
119
|
-
} catch {
|
|
120
|
-
callback({});
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
} catch {
|
|
124
|
-
callback({});
|
|
125
|
-
}
|
|
78
|
+
fetchJson(`http:/images/${id}/json?stream=0`, callback);
|
|
126
79
|
} else {
|
|
127
80
|
callback({});
|
|
128
81
|
}
|
|
129
82
|
}
|
|
130
83
|
|
|
131
84
|
listContainers(all, callback) {
|
|
132
|
-
|
|
133
|
-
let socket = net.createConnection({ path: socketPath });
|
|
134
|
-
let alldata = '';
|
|
135
|
-
let data;
|
|
136
|
-
|
|
137
|
-
socket.on('connect', () => {
|
|
138
|
-
socket.write('GET http:/containers/json' + (all ? '?all=1' : '') + ' HTTP/1.0\r\n\r\n');
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
socket.on('data', (data) => {
|
|
142
|
-
alldata = alldata + data.toString();
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
socket.on('error', () => {
|
|
146
|
-
socket = false;
|
|
147
|
-
callback({});
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
socket.on('end', () => {
|
|
151
|
-
const startbody = alldata.indexOf('\r\n\r\n');
|
|
152
|
-
alldata = alldata.substring(startbody + 4);
|
|
153
|
-
socket = false;
|
|
154
|
-
try {
|
|
155
|
-
data = JSON.parse(alldata);
|
|
156
|
-
callback(data);
|
|
157
|
-
} catch {
|
|
158
|
-
callback({});
|
|
159
|
-
}
|
|
160
|
-
});
|
|
161
|
-
} catch {
|
|
162
|
-
callback({});
|
|
163
|
-
}
|
|
85
|
+
fetchJson(`http:/containers/json${all ? '?all=1' : ''}`, callback);
|
|
164
86
|
}
|
|
165
87
|
|
|
166
88
|
getStats(id, callback) {
|
|
167
|
-
id = id || '';
|
|
168
89
|
if (id) {
|
|
169
|
-
|
|
170
|
-
let socket = net.createConnection({ path: socketPath });
|
|
171
|
-
let alldata = '';
|
|
172
|
-
let data;
|
|
173
|
-
|
|
174
|
-
socket.on('connect', () => {
|
|
175
|
-
socket.write('GET http:/containers/' + id + '/stats?stream=0 HTTP/1.0\r\n\r\n');
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
socket.on('data', (data) => {
|
|
179
|
-
alldata = alldata + data.toString();
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
socket.on('error', () => {
|
|
183
|
-
socket = false;
|
|
184
|
-
callback({});
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
socket.on('end', () => {
|
|
188
|
-
const startbody = alldata.indexOf('\r\n\r\n');
|
|
189
|
-
alldata = alldata.substring(startbody + 4);
|
|
190
|
-
socket = false;
|
|
191
|
-
try {
|
|
192
|
-
data = JSON.parse(alldata);
|
|
193
|
-
callback(data);
|
|
194
|
-
} catch {
|
|
195
|
-
callback({});
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
} catch {
|
|
199
|
-
callback({});
|
|
200
|
-
}
|
|
90
|
+
fetchJson(`http:/containers/${id}/stats?stream=0`, callback);
|
|
201
91
|
} else {
|
|
202
92
|
callback({});
|
|
203
93
|
}
|
|
204
94
|
}
|
|
205
95
|
|
|
206
96
|
getInspect(id, callback) {
|
|
207
|
-
id = id || '';
|
|
208
97
|
if (id) {
|
|
209
|
-
|
|
210
|
-
let socket = net.createConnection({ path: socketPath });
|
|
211
|
-
let alldata = '';
|
|
212
|
-
let data;
|
|
213
|
-
|
|
214
|
-
socket.on('connect', () => {
|
|
215
|
-
socket.write('GET http:/containers/' + id + '/json?stream=0 HTTP/1.0\r\n\r\n');
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
socket.on('data', (data) => {
|
|
219
|
-
alldata = alldata + data.toString();
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
socket.on('error', () => {
|
|
223
|
-
socket = false;
|
|
224
|
-
callback({});
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
socket.on('end', () => {
|
|
228
|
-
const startbody = alldata.indexOf('\r\n\r\n');
|
|
229
|
-
alldata = alldata.substring(startbody + 4);
|
|
230
|
-
socket = false;
|
|
231
|
-
try {
|
|
232
|
-
data = JSON.parse(alldata);
|
|
233
|
-
callback(data);
|
|
234
|
-
} catch {
|
|
235
|
-
callback({});
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
} catch {
|
|
239
|
-
callback({});
|
|
240
|
-
}
|
|
98
|
+
fetchJson(`http:/containers/${id}/json?stream=0`, callback);
|
|
241
99
|
} else {
|
|
242
100
|
callback({});
|
|
243
101
|
}
|
|
244
102
|
}
|
|
245
103
|
|
|
246
104
|
getProcesses(id, callback) {
|
|
247
|
-
id = id || '';
|
|
248
105
|
if (id) {
|
|
249
|
-
|
|
250
|
-
let socket = net.createConnection({ path: socketPath });
|
|
251
|
-
let alldata = '';
|
|
252
|
-
let data;
|
|
253
|
-
|
|
254
|
-
socket.on('connect', () => {
|
|
255
|
-
socket.write('GET http:/containers/' + id + '/top?ps_args=-opid,ppid,pgid,vsz,time,etime,nice,ruser,user,rgroup,group,stat,rss,args HTTP/1.0\r\n\r\n');
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
socket.on('data', (data) => {
|
|
259
|
-
alldata = alldata + data.toString();
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
socket.on('error', () => {
|
|
263
|
-
socket = false;
|
|
264
|
-
callback({});
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
socket.on('end', () => {
|
|
268
|
-
const startbody = alldata.indexOf('\r\n\r\n');
|
|
269
|
-
alldata = alldata.substring(startbody + 4);
|
|
270
|
-
socket = false;
|
|
271
|
-
try {
|
|
272
|
-
data = JSON.parse(alldata);
|
|
273
|
-
callback(data);
|
|
274
|
-
} catch {
|
|
275
|
-
callback({});
|
|
276
|
-
}
|
|
277
|
-
});
|
|
278
|
-
} catch {
|
|
279
|
-
callback({});
|
|
280
|
-
}
|
|
106
|
+
fetchJson(`http:/containers/${id}/top?ps_args=-opid,ppid,pgid,vsz,time,etime,nice,ruser,user,rgroup,group,stat,rss,args`, callback);
|
|
281
107
|
} else {
|
|
282
108
|
callback({});
|
|
283
109
|
}
|
|
284
110
|
}
|
|
285
111
|
|
|
286
112
|
listVolumes(callback) {
|
|
287
|
-
|
|
288
|
-
let socket = net.createConnection({ path: socketPath });
|
|
289
|
-
let alldata = '';
|
|
290
|
-
let data;
|
|
291
|
-
|
|
292
|
-
socket.on('connect', () => {
|
|
293
|
-
socket.write('GET http:/volumes HTTP/1.0\r\n\r\n');
|
|
294
|
-
});
|
|
295
|
-
|
|
296
|
-
socket.on('data', (data) => {
|
|
297
|
-
alldata = alldata + data.toString();
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
socket.on('error', () => {
|
|
301
|
-
socket = false;
|
|
302
|
-
callback({});
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
socket.on('end', () => {
|
|
306
|
-
const startbody = alldata.indexOf('\r\n\r\n');
|
|
307
|
-
alldata = alldata.substring(startbody + 4);
|
|
308
|
-
socket = false;
|
|
309
|
-
try {
|
|
310
|
-
data = JSON.parse(alldata);
|
|
311
|
-
callback(data);
|
|
312
|
-
} catch {
|
|
313
|
-
callback({});
|
|
314
|
-
}
|
|
315
|
-
});
|
|
316
|
-
} catch {
|
|
317
|
-
callback({});
|
|
318
|
-
}
|
|
113
|
+
fetchJson('http:/volumes', callback);
|
|
319
114
|
}
|
|
320
115
|
}
|
|
321
116
|
|
package/lib/filesystem.js
CHANGED
|
@@ -72,7 +72,7 @@ function fsSize(drive, callback) {
|
|
|
72
72
|
function filterLines(stdout) {
|
|
73
73
|
const lines = stdout.toString().split('\n');
|
|
74
74
|
lines.shift();
|
|
75
|
-
if (stdout.toString().toLowerCase().indexOf('filesystem')) {
|
|
75
|
+
if (stdout.toString().toLowerCase().indexOf('filesystem') >= 0) {
|
|
76
76
|
let removeLines = 0;
|
|
77
77
|
for (let i = 0; i < lines.length; i++) {
|
|
78
78
|
if (lines[i] && lines[i].toLowerCase().startsWith('filesystem')) {
|
|
@@ -88,19 +88,23 @@ function fsSize(drive, callback) {
|
|
|
88
88
|
|
|
89
89
|
function parseDf(lines) {
|
|
90
90
|
const data = [];
|
|
91
|
+
// filesystem (first column) and mount point (last column) may contain spaces:
|
|
92
|
+
// anchor parsing on the numeric columns in between (blocks, used, available, capacity)
|
|
93
|
+
const dfWithType = /^(.+?)\s+(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(?:\d+%|-)\s+(.+)$/;
|
|
94
|
+
const dfNoType = /^(.+?)\s+(\d+)\s+(\d+)\s+(\d+)\s+(?:\d+%|-)\s+(.+)$/;
|
|
95
|
+
const hasType = _linux || _freebsd || _openbsd || _netbsd;
|
|
91
96
|
lines.forEach((line) => {
|
|
92
97
|
if (line !== '') {
|
|
93
|
-
|
|
94
|
-
if (
|
|
95
|
-
const fs =
|
|
96
|
-
const fsType =
|
|
97
|
-
const size = parseInt(
|
|
98
|
-
const used = parseInt(
|
|
99
|
-
const available = parseInt(
|
|
98
|
+
const parts = line.trim().match(hasType ? dfWithType : dfNoType);
|
|
99
|
+
if (parts && (parts[1].startsWith('/') || parts[hasType ? 6 : 5] === '/' || parts[1].indexOf('/') > 0 || parts[1].indexOf(':') === 1 || (!_darwin && !isLinuxTmpFs(parts[2])))) {
|
|
100
|
+
const fs = parts[1];
|
|
101
|
+
const fsType = hasType ? parts[2] : getmacOsFsType(parts[1]);
|
|
102
|
+
const size = parseInt(parts[hasType ? 3 : 2], 10) * 1024;
|
|
103
|
+
const used = parseInt(parts[hasType ? 4 : 3], 10) * 1024;
|
|
104
|
+
const available = parseInt(parts[hasType ? 5 : 4], 10) * 1024;
|
|
100
105
|
const use = parseFloat((100.0 * (used / (used + available))).toFixed(2));
|
|
101
106
|
const rw = osMounts && Object.keys(osMounts).length > 0 ? osMounts[fs] || false : null;
|
|
102
|
-
|
|
103
|
-
const mount = line.join(' ');
|
|
107
|
+
const mount = parts[hasType ? 6 : 5];
|
|
104
108
|
if (!data.find((el) => el.fs === fs && el.type === fsType && el.mount === mount)) {
|
|
105
109
|
data.push({
|
|
106
110
|
fs,
|
|
@@ -158,9 +162,11 @@ function fsSize(drive, callback) {
|
|
|
158
162
|
return line.startsWith('/');
|
|
159
163
|
})
|
|
160
164
|
.forEach((line) => {
|
|
161
|
-
|
|
165
|
+
// /proc/mounts escapes spaces as \040
|
|
166
|
+
const fs = line.split(' ')[0].replace(/\\040/g, ' ');
|
|
167
|
+
osMounts[fs] = osMounts[fs] || false;
|
|
162
168
|
if (line.toLowerCase().indexOf('/snap/') === -1) {
|
|
163
|
-
osMounts[
|
|
169
|
+
osMounts[fs] = line.toLowerCase().indexOf('rw,') >= 0 || line.toLowerCase().indexOf(' rw ') >= 0;
|
|
164
170
|
}
|
|
165
171
|
});
|
|
166
172
|
} catch {
|
|
@@ -341,7 +347,9 @@ exports.fsOpenFiles = fsOpenFiles;
|
|
|
341
347
|
// disks
|
|
342
348
|
|
|
343
349
|
function parseBytes(s) {
|
|
344
|
-
|
|
350
|
+
const start = s.indexOf(' (') + 2;
|
|
351
|
+
const end = s.indexOf(' Bytes)');
|
|
352
|
+
return parseInt(s.substr(start, end - start), 10);
|
|
345
353
|
}
|
|
346
354
|
|
|
347
355
|
function parseDevices(lines) {
|
|
@@ -836,8 +844,9 @@ function fsStats(callback) {
|
|
|
836
844
|
lines.forEach((line) => {
|
|
837
845
|
if (line !== '') {
|
|
838
846
|
line = line.trim().split(' ');
|
|
839
|
-
|
|
840
|
-
|
|
847
|
+
const dev = util.sanitizeShellString(line[0], true);
|
|
848
|
+
if (dev && fs_filter.indexOf(dev) === -1) {
|
|
849
|
+
fs_filter.push(dev);
|
|
841
850
|
}
|
|
842
851
|
}
|
|
843
852
|
});
|
|
@@ -1193,7 +1202,7 @@ function diskLayout(callback) {
|
|
|
1193
1202
|
let devices = [];
|
|
1194
1203
|
try {
|
|
1195
1204
|
const outJSON = JSON.parse(out);
|
|
1196
|
-
if (outJSON &&
|
|
1205
|
+
if (outJSON && {}.hasOwnProperty.call(outJSON, 'blockdevices')) {
|
|
1197
1206
|
devices = outJSON.blockdevices.filter((item) => {
|
|
1198
1207
|
return (
|
|
1199
1208
|
item.type === 'disk' &&
|
|
@@ -1229,8 +1238,8 @@ function diskLayout(callback) {
|
|
|
1229
1238
|
}
|
|
1230
1239
|
devices.forEach((device) => {
|
|
1231
1240
|
let mediumType = '';
|
|
1232
|
-
const
|
|
1233
|
-
const
|
|
1241
|
+
const logical = util.sanitizeShellString(device.name, true);
|
|
1242
|
+
const BSDName = '/dev/' + logical;
|
|
1234
1243
|
try {
|
|
1235
1244
|
mediumType = execSync('cat /sys/block/' + logical + '/queue/rotational 2>/dev/null', util.execOptsLinux)
|
|
1236
1245
|
.toString()
|
|
@@ -1387,7 +1396,7 @@ function diskLayout(callback) {
|
|
|
1387
1396
|
const lines = device.split('\n');
|
|
1388
1397
|
const mediumType = util.getValue(lines, 'Medium Type', ':', true).trim();
|
|
1389
1398
|
const sizeStr = util.getValue(lines, 'capacity', ':', true).trim();
|
|
1390
|
-
const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
|
|
1399
|
+
const BSDName = util.sanitizeShellString(util.getValue(lines, 'BSD Name', ':', true).trim(), true);
|
|
1391
1400
|
if (sizeStr) {
|
|
1392
1401
|
let sizeValue = 0;
|
|
1393
1402
|
if (sizeStr.indexOf('(') >= 0) {
|
|
@@ -1443,7 +1452,7 @@ function diskLayout(callback) {
|
|
|
1443
1452
|
const lines = device.split('\n');
|
|
1444
1453
|
const linkWidth = util.getValue(lines, 'link width', ':', true).trim();
|
|
1445
1454
|
const sizeStr = util.getValue(lines, '!capacity', ':', true).trim();
|
|
1446
|
-
const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
|
|
1455
|
+
const BSDName = util.sanitizeShellString(util.getValue(lines, 'BSD Name', ':', true).trim(), true);
|
|
1447
1456
|
if (sizeStr) {
|
|
1448
1457
|
let sizeValue = 0;
|
|
1449
1458
|
if (sizeStr.indexOf('(') >= 0) {
|
|
@@ -1491,12 +1500,12 @@ function diskLayout(callback) {
|
|
|
1491
1500
|
}
|
|
1492
1501
|
// USB Drives (older macOS report storage devices under SPUSBDataType)
|
|
1493
1502
|
try {
|
|
1494
|
-
const devices = linesUSB.join('\n').
|
|
1503
|
+
const devices = linesUSB.join('\n').replace(/Media:\n /g, 'Model:').split('\n\n Product ID:');
|
|
1495
1504
|
devices.shift();
|
|
1496
1505
|
devices.forEach((device) => {
|
|
1497
1506
|
const lines = device.split('\n');
|
|
1498
1507
|
const sizeStr = util.getValue(lines, 'Capacity', ':', true).trim();
|
|
1499
|
-
const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
|
|
1508
|
+
const BSDName = util.sanitizeShellString(util.getValue(lines, 'BSD Name', ':', true).trim(), true);
|
|
1500
1509
|
if (sizeStr) {
|
|
1501
1510
|
let sizeValue = 0;
|
|
1502
1511
|
if (sizeStr.indexOf('(') >= 0) {
|
|
@@ -1517,7 +1526,7 @@ function diskLayout(callback) {
|
|
|
1517
1526
|
result.push({
|
|
1518
1527
|
device: BSDName,
|
|
1519
1528
|
type: 'USB',
|
|
1520
|
-
name: util.getValue(lines, 'Model', ':', true).trim().
|
|
1529
|
+
name: util.getValue(lines, 'Model', ':', true).trim().replace(/:/g, ''),
|
|
1521
1530
|
vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()),
|
|
1522
1531
|
size: sizeValue,
|
|
1523
1532
|
bytesPerSector: null,
|