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.
@@ -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
- try {
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
- try {
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
- try {
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
- try {
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
- try {
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
- try {
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
- try {
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
- try {
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
- line = line.replace(/ +/g, ' ').split(' ');
94
- if (line && (line[0].startsWith('/') || (line[6] && line[6] === '/') || line[0].indexOf('/') > 0 || line[0].indexOf(':') === 1 || (!_darwin && !isLinuxTmpFs(line[1])))) {
95
- const fs = line[0];
96
- const fsType = _linux || _freebsd || _openbsd || _netbsd ? line[1] : getmacOsFsType(line[0]);
97
- const size = parseInt(_linux || _freebsd || _openbsd || _netbsd ? line[2] : line[1], 10) * 1024;
98
- const used = parseInt(_linux || _freebsd || _openbsd || _netbsd ? line[3] : line[2], 10) * 1024;
99
- const available = parseInt(_linux || _freebsd || _openbsd || _netbsd ? line[4] : line[3], 10) * 1024;
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
- line.splice(0, _linux || _freebsd || _openbsd || _netbsd ? 6 : 5);
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
- osMounts[line.split(' ')[0]] = osMounts[line.split(' ')[0]] || false;
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[line.split(' ')[0]] = line.toLowerCase().indexOf('rw,') >= 0 || line.toLowerCase().indexOf(' rw ') >= 0;
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
- return parseInt(s.substr(s.indexOf(' (') + 2, s.indexOf(' Bytes)') - 10), 10);
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
- if (fs_filter.indexOf(line[0]) === -1) {
840
- fs_filter.push(line[0]);
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 && Object.hasOwn(outJSON, 'blockdevices')) {
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 BSDName = '/dev/' + device.name;
1233
- const logical = device.name;
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').replaceAll('Media:\n ', 'Model:').split('\n\n Product ID:');
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().replaceAll(':', ''),
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,