systeminformation 5.30.7 → 5.31.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 CHANGED
@@ -31,7 +31,7 @@
31
31
  ## The Systeminformation Project
32
32
 
33
33
  This is amazing. Started as a small project just for myself, it now has > 19,000
34
- lines of code, > 700 versions published, up to 15 mio downloads per month, > 450
34
+ lines of code, > 700 versions published, up to 20 mio downloads per month, > 480
35
35
  mio downloads overall. Top 10 NPM ranking for backend packages. Thank you to all
36
36
  who contributed to this project!
37
37
 
@@ -539,8 +539,8 @@ Full function reference with examples can be found at
539
539
  | | [0].serialNum | X | | X | X | | serial number |
540
540
  | | [0].interfaceType | X | | X | X | | SATA, PCIe, ... |
541
541
  | | [0].smartStatus | X | | X | X | | S.M.A.R.T Status (see Known Issues) |
542
- | | [0].temperature | X | | | | | S.M.A.R.T temperature |
543
- | | [0].smartData | X | | | X | | full S.M.A.R.T data from smartctl<br>requires at least smartmontools 7.0 |
542
+ | | [0].temperature | X | | X | X | | S.M.A.R.T temperature |
543
+ | | [0].smartData | X | | X | X | | full S.M.A.R.T data from smartctl<br>requires at least smartmontools 7.0 |
544
544
  | si.blockDevices(cb) | [{...}] | X | | X | X | | returns array of disks, partitions,<br>raids and roms |
545
545
  | | [0].name | X | | X | X | | name |
546
546
  | | [0].type | X | | X | X | | type |
package/lib/filesystem.js CHANGED
@@ -1349,6 +1349,7 @@ function diskLayout(callback) {
1349
1349
  resolve(result);
1350
1350
  }
1351
1351
  if (_darwin) {
1352
+ let cmdFullSmart = '';
1352
1353
  exec('system_profiler SPSerialATADataType SPNVMeDataType SPUSBDataType', { maxBuffer: 1024 * 1024 }, (error, stdout) => {
1353
1354
  if (!error) {
1354
1355
  // split by type:
@@ -1420,6 +1421,7 @@ function diskLayout(callback) {
1420
1421
  BSDName: BSDName
1421
1422
  });
1422
1423
  cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
1424
+ cmdFullSmart += `${cmdFullSmart ? 'printf ",";' : ''}smartctl -a -j ${BSDName};`;
1423
1425
  }
1424
1426
  }
1425
1427
  });
@@ -1475,6 +1477,7 @@ function diskLayout(callback) {
1475
1477
  BSDName: BSDName
1476
1478
  });
1477
1479
  cmd = `${cmd}printf "\n${BSDName}|"; diskutil info /dev/${BSDName} | grep SMART;`;
1480
+ cmdFullSmart += `${cmdFullSmart ? 'printf ",";' : ''}smartctl -a -j ${BSDName};`;
1478
1481
  }
1479
1482
  }
1480
1483
  });
@@ -1527,13 +1530,64 @@ function diskLayout(callback) {
1527
1530
  BSDName: BSDName
1528
1531
  });
1529
1532
  cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
1533
+ cmdFullSmart += `${cmdFullSmart ? 'printf ",";' : ''}smartctl -a -j ${BSDName};`;
1530
1534
  }
1531
1535
  }
1532
1536
  });
1533
1537
  } catch {
1534
1538
  util.noop();
1535
1539
  }
1536
- if (cmd) {
1540
+ // check S.M.A.R.T. status
1541
+ if (cmdFullSmart) {
1542
+ exec(cmdFullSmart, { maxBuffer: 1024 * 1024 }, (error, stdout) => {
1543
+ try {
1544
+ const data = JSON.parse(`[${stdout}]`);
1545
+ data.forEach((disk) => {
1546
+ const diskBSDName = disk.smartctl.argv[disk.smartctl.argv.length - 1];
1547
+
1548
+ for (let i = 0; i < result.length; i++) {
1549
+ if (result[i].BSDName === diskBSDName) {
1550
+ result[i].smartStatus = disk.smart_status.passed ? 'Ok' : disk.smart_status.passed === false ? 'Predicted Failure' : 'unknown';
1551
+ if (disk.temperature && disk.temperature.current) {
1552
+ result[i].temperature = disk.temperature.current;
1553
+ }
1554
+ result[i].smartData = disk;
1555
+ }
1556
+ }
1557
+ });
1558
+ commitResult(result);
1559
+ } catch (e) {
1560
+ if (cmd) {
1561
+ cmd = cmd + 'printf "\n"';
1562
+ exec(cmd, { maxBuffer: 1024 * 1024 }, (error, stdout) => {
1563
+ const lines = stdout.toString().split('\n');
1564
+ lines.forEach((line) => {
1565
+ if (line) {
1566
+ const parts = line.split('|');
1567
+ if (parts.length === 2) {
1568
+ const BSDName = parts[0];
1569
+ parts[1] = parts[1].trim();
1570
+ const parts2 = parts[1].split(':');
1571
+ if (parts2.length === 2) {
1572
+ parts2[1] = parts2[1].trim();
1573
+ const status = parts2[1].toLowerCase();
1574
+ for (let i = 0; i < result.length; i++) {
1575
+ if (result[i].BSDName === BSDName) {
1576
+ result[i].smartStatus = status === 'passed' ? 'Ok' : status === 'failed!' ? 'Predicted Failure' : 'unknown';
1577
+ }
1578
+ }
1579
+ }
1580
+ }
1581
+ }
1582
+ });
1583
+ commitResult(result);
1584
+ });
1585
+ } else {
1586
+ commitResult(result);
1587
+ }
1588
+ }
1589
+ });
1590
+ } else if (cmd) {
1537
1591
  cmd = cmd + 'printf "\n"';
1538
1592
  exec(cmd, { maxBuffer: 1024 * 1024 }, (error, stdout) => {
1539
1593
  const lines = stdout.toString().split('\n');
package/lib/osinfo.js CHANGED
@@ -769,9 +769,14 @@ function versions(apps, callback) {
769
769
  if (_linux) {
770
770
  exec('locate bin/postgres', (error, stdout) => {
771
771
  if (!error) {
772
- const postgresqlBin = stdout.toString().split('\n').sort();
772
+ const safePath = /^[a-zA-Z0-9/_.-]+$/;
773
+ const postgresqlBin = stdout
774
+ .toString()
775
+ .split('\n')
776
+ .filter((p) => safePath.test(p.trim()))
777
+ .sort();
773
778
  if (postgresqlBin.length) {
774
- exec(postgresqlBin[postgresqlBin.length - 1] + ' -V', (error, stdout) => {
779
+ execFile(postgresqlBin[postgresqlBin.length - 1], ['-V'], (error, stdout) => {
775
780
  if (!error) {
776
781
  const postgresql = stdout.toString().split('\n')[0].split(' ') || [];
777
782
  appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : '';
package/lib/wifi.js CHANGED
@@ -437,8 +437,8 @@ function wifiNetworks(callback) {
437
437
  const res = getWifiNetworkListIw(ifaceSanitized);
438
438
  if (res === -1) {
439
439
  // try again after 4 secs
440
- setTimeout((iface) => {
441
- const res = getWifiNetworkListIw(iface);
440
+ setTimeout(() => {
441
+ const res = getWifiNetworkListIw(ifaceSanitized);
442
442
  if (res !== -1) {
443
443
  result = res;
444
444
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "systeminformation",
3
- "version": "5.30.7",
3
+ "version": "5.31.0",
4
4
  "description": "Advanced, lightweight system and OS information library",
5
5
  "license": "MIT",
6
6
  "author": "Sebastian Hildebrandt <hildebrandt@plus-innovations.com> (https://plus-innovations.com)",