Compare commits
No commits in common. "504ecf272dfdfbdcb4435a38d1e78bbcd61adc5f" and "ea020217e1c90219aede9debfe9394592dc7a425" have entirely different histories.
504ecf272d
...
ea020217e1
@ -56,7 +56,6 @@ and adapt your own code to be again compatible to the new version 5.
|
||||
- `disksIO()` added wait time (linux)
|
||||
- `diskLayout()`: added USB drives (mac OS)
|
||||
- `diskLayout()`: added S.M.R.R.T. (win)
|
||||
- `diskLayout()`: added S.M.R.R.T. (macOS)
|
||||
- `fsSize()`: added available
|
||||
- `fsSize()`: improved calculation of used
|
||||
- `getData()`: support for passing parameters and filters (see section General /
|
||||
@ -91,10 +90,6 @@ For major (breaking) changes - **version 4, 3 and 2** - see end of page.
|
||||
|
||||
| Version | Date | Comment |
|
||||
| ------- | ---------- | --------------------------------------------------------------------------------------------------- |
|
||||
| 5.31.1 | 2026-02-17 | `docs` updated (security advisory) |
|
||||
| 5.31.0 | 2026-02-15 | `diskLayout()` added smartmontools support (macOS), `versions()` command injection issue (linux) |
|
||||
| 5.30.8 | 2026-02-14 | `wifiNetworks()` fixed CWE-78 command injection issue (linux) |
|
||||
| 5.30.7 | 2026-01-31 | `networkInterfaces()` fixed getWindowsIEEE8021x issue (windows) |
|
||||
| 5.30.6 | 2026-01-22 | `graphics()` improved nvidia-smi detection (windows) |
|
||||
| 5.30.5 | 2026-01-16 | `networkInterfaces()` fix uppercase iface names (linux) |
|
||||
| 5.30.4 | 2026-01-15 | `powerShell()` fix UTF8 output (windows) |
|
||||
@ -538,7 +533,7 @@ For major (breaking) changes - **version 4, 3 and 2** - see end of page.
|
||||
| 4.18.3 | 2020-01-10 | `fsSize()` fix excluding loop/snap devices |
|
||||
| 4.18.2 | 2020-01-10 | `memLayout()` fix memsize linux (modules >= 32 GB) |
|
||||
| 4.18.1 | 2020-01-07 | updated docs |
|
||||
| 4.18.0 | 2020-01-07 | `networkInterfaces()` added dhcp for macOS, added dhcp linux fallback |
|
||||
| 4.18.0 | 2020-01-07 | `networkInterfaces()` added dhcp for mac os, added dhcp linux fallback |
|
||||
| 4.17.3 | 2020-01-05 | code cleanup |
|
||||
| 4.17.2 | 2020-01-05 | `cpu().speed` AMD base frequency and fix (0.00) |
|
||||
| 4.17.1 | 2020-01-04 | `fsSize()` alpine linux support |
|
||||
|
||||
@ -31,7 +31,7 @@
|
||||
## The Systeminformation Project
|
||||
|
||||
This is amazing. Started as a small project just for myself, it now has > 19,000
|
||||
lines of code, > 700 versions published, up to 20 mio downloads per month, > 480
|
||||
lines of code, > 700 versions published, up to 15 mio downloads per month, > 450
|
||||
mio downloads overall. Top 10 NPM ranking for backend packages. Thank you to all
|
||||
who contributed to this project!
|
||||
|
||||
@ -539,8 +539,8 @@ Full function reference with examples can be found at
|
||||
| | [0].serialNum | X | | X | X | | serial number |
|
||||
| | [0].interfaceType | X | | X | X | | SATA, PCIe, ... |
|
||||
| | [0].smartStatus | X | | X | X | | S.M.A.R.T Status (see Known Issues) |
|
||||
| | [0].temperature | X | | X | X | | S.M.A.R.T temperature |
|
||||
| | [0].smartData | X | | X | X | | full S.M.A.R.T data from smartctl<br>requires at least smartmontools 7.0 |
|
||||
| | [0].temperature | X | | | | | S.M.A.R.T temperature |
|
||||
| | [0].smartData | X | | | X | | full S.M.A.R.T data from smartctl<br>requires at least smartmontools 7.0 |
|
||||
| si.blockDevices(cb) | [{...}] | X | | X | X | | returns array of disks, partitions,<br>raids and roms |
|
||||
| | [0].name | X | | X | X | | name |
|
||||
| | [0].type | X | | X | X | | type |
|
||||
|
||||
@ -242,8 +242,8 @@
|
||||
<td>[0].temperature</td>
|
||||
<td>X</td>
|
||||
<td></td>
|
||||
<td>X</td>
|
||||
<td>X</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>S.M.A.R.T temperature (if available)</td>
|
||||
</tr>
|
||||
@ -252,7 +252,7 @@
|
||||
<td>[0].smartData</td>
|
||||
<td>X</td>
|
||||
<td></td>
|
||||
<td>X</td>
|
||||
<td></td>
|
||||
<td>X</td>
|
||||
<td></td>
|
||||
<td>full S.M.A.R.T data from smartctl<br>requires at least smartmontools 7.0<br>(see Known Issues)</td>
|
||||
|
||||
@ -57,30 +57,6 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row">5.31.1
|
||||
</th>
|
||||
<td>2026-02-17</td>
|
||||
<td><span class="code">docs</span> updated (security advisory)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">5.31.0
|
||||
</th>
|
||||
<td>2026-02-15</td>
|
||||
<td><span class="code">diskLayout()</span> added smartmontools support (macOS), <span class="code">versions()</span> fix command injection</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">5.30.8
|
||||
</th>
|
||||
<td>2026-02-14</td>
|
||||
<td><span class="code">wifiNetworks()</span> fixed CWE-78 command injection issue (linux)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">5.30.7
|
||||
</th>
|
||||
<td>2026-01-31</td>
|
||||
<td><span class="code">networkInterfaces()</span> fixed getWindowsIEEE8021x issue (windows)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row">5.30.6
|
||||
</th>
|
||||
|
||||
@ -166,11 +166,11 @@
|
||||
<body>
|
||||
<header class="bg-image-full">
|
||||
<div class="top-container">
|
||||
<a href="security.html" class="recommendation">Security advisory:<br>Update to v5.31.1</a>
|
||||
<a href="security.html" class="recommendation">Security advisory:<br>Update to v5.27.14</a>
|
||||
<img class="logo" src="assets/logo.png" alt="logo">
|
||||
<div class="title">systeminformation</div>
|
||||
<div class="subtitle"><span id="typed"></span> </div>
|
||||
<div class="version">New Version: <span id="version">5.31.0</span></div>
|
||||
<div class="version">New Version: <span id="version">5.30.6</span></div>
|
||||
<button class="btn btn-light" onclick="location.href='https://github.com/sebhildebrandt/systeminformation'">View on Github <i class=" fab fa-github"></i></button>
|
||||
</div>
|
||||
<div class="down">
|
||||
@ -212,7 +212,7 @@
|
||||
<div class="title">Downloads last month</div>
|
||||
</div>
|
||||
<div class="col-xl-4 col-lg-4 col-md-4 col-12">
|
||||
<div class="numbers">977</div>
|
||||
<div class="numbers">941</div>
|
||||
<div class="title">Dependents</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -73,14 +73,10 @@
|
||||
<p><span class="code">node.js</span> and <span class="code">get-WmiObject</span> are not able to determine correct CPU current speed on windows and macOS.
|
||||
This means, you will have constant values here on both platforms for all processor cores in <span class="code">cpuCurrentSpeed()</span>.</p>
|
||||
|
||||
<h4>Linux, Windows, macOS - S.M.A.R.T. Status</h4>
|
||||
<h4>Linux S.M.A.R.T. Status</h4>
|
||||
|
||||
<p>To be able to detect S.M.A.R.T. status on macOS, Windows and Linux you need to install <span class="code">smartmontools</span>.</p>
|
||||
<p>On DEBIAN based linux distributions you can install it by running:</p>
|
||||
<p>To be able to detect S.M.A.R.T. status on Linux you need to install <span class="code">smartmontools</span>. On DEBIAN based linux distributions you can install it by running:</p>
|
||||
<pre>$ sudo apt-get install smartmontools</pre>
|
||||
<p>On macOS you can install it using <span class="code">brew</span>:</p>
|
||||
<pre>$ brew install smartmontools</pre>
|
||||
<p>On windows you can download it from <a href="https://www.smartmontools.org/">https://www.smartmontools.org/</a></p>
|
||||
<p>If you have smartmontools version >= 7.0 then you will get also full smart data in diskLayout()</p>
|
||||
|
||||
<h4>Stats Functions</h4>
|
||||
|
||||
@ -44,36 +44,6 @@
|
||||
<div class="col-12 sectionheader">
|
||||
<div class="title">Security Advisories</div>
|
||||
<div class="text">
|
||||
<h2>versions() Command Injection Vulnerability</h2>
|
||||
<p><span class="bold">Affected versions:</span>
|
||||
< 5.31.0<br>
|
||||
<span class="bold">Date:</span> 2026-02-15<br>
|
||||
<span class="bold">CVE indentifier</span> CVE-2026-26318
|
||||
</p>
|
||||
|
||||
<h4>Impact</h4>
|
||||
<p>We had an issue that there was a possibility to perform a potential command injection possibility by craft the malicious file path for postgres that is then used in <span class="code">versions()</span> on linux machines.</p>
|
||||
|
||||
<h4>Patch</h4>
|
||||
<p>Problem was fixed with parameter checking and execFile. If you are using version 5, please upgrade to version >= 5.31.0.</p>
|
||||
<hr>
|
||||
<br>
|
||||
|
||||
<h2>wifiNetworks Command Injection Vulnerability</h2>
|
||||
<p><span class="bold">Affected versions:</span>
|
||||
< 5.30.8<br>
|
||||
<span class="bold">Date:</span> 2026-02-14<br>
|
||||
<span class="bold">CVE indentifier</span> CVE-2026-26280
|
||||
</p>
|
||||
|
||||
<h4>Impact</h4>
|
||||
<p>We had an issue that there was a possibility to perform a potential command injection possibility by manipulating SSIDs in <span class="code">wifiNetworks()</span> on linux machines.</p>
|
||||
|
||||
<h4>Patch</h4>
|
||||
<p>Problem was fixed with parameter checking. If you are using version 5, please upgrade to version >= 5.30.8.</p>
|
||||
<hr>
|
||||
<br>
|
||||
|
||||
<h2>fsSize Command Injection Vulnerability</h2>
|
||||
<p><span class="bold">Affected versions:</span>
|
||||
< 5.27.14<br>
|
||||
@ -88,6 +58,7 @@
|
||||
<p>Problem was fixed with parameter checking. If you are using version 5, please upgrade to version >= 5.27.14.</p>
|
||||
<hr>
|
||||
<br>
|
||||
|
||||
<h2>SSID Command Injection Vulnerability</h2>
|
||||
<p><span class="bold">Affected versions:</span>
|
||||
< 5.23.7<br>
|
||||
|
||||
@ -1349,7 +1349,6 @@ function diskLayout(callback) {
|
||||
resolve(result);
|
||||
}
|
||||
if (_darwin) {
|
||||
let cmdFullSmart = '';
|
||||
exec('system_profiler SPSerialATADataType SPNVMeDataType SPUSBDataType', { maxBuffer: 1024 * 1024 }, (error, stdout) => {
|
||||
if (!error) {
|
||||
// split by type:
|
||||
@ -1421,7 +1420,6 @@ function diskLayout(callback) {
|
||||
BSDName: BSDName
|
||||
});
|
||||
cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
|
||||
cmdFullSmart += `${cmdFullSmart ? 'printf ",";' : ''}smartctl -a -j ${BSDName};`;
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -1477,7 +1475,6 @@ function diskLayout(callback) {
|
||||
BSDName: BSDName
|
||||
});
|
||||
cmd = `${cmd}printf "\n${BSDName}|"; diskutil info /dev/${BSDName} | grep SMART;`;
|
||||
cmdFullSmart += `${cmdFullSmart ? 'printf ",";' : ''}smartctl -a -j ${BSDName};`;
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -1530,64 +1527,13 @@ function diskLayout(callback) {
|
||||
BSDName: BSDName
|
||||
});
|
||||
cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
|
||||
cmdFullSmart += `${cmdFullSmart ? 'printf ",";' : ''}smartctl -a -j ${BSDName};`;
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch {
|
||||
util.noop();
|
||||
}
|
||||
// check S.M.A.R.T. status
|
||||
if (cmdFullSmart) {
|
||||
exec(cmdFullSmart, { maxBuffer: 1024 * 1024 }, (error, stdout) => {
|
||||
try {
|
||||
const data = JSON.parse(`[${stdout}]`);
|
||||
data.forEach((disk) => {
|
||||
const diskBSDName = disk.smartctl.argv[disk.smartctl.argv.length - 1];
|
||||
|
||||
for (let i = 0; i < result.length; i++) {
|
||||
if (result[i].BSDName === diskBSDName) {
|
||||
result[i].smartStatus = disk.smart_status.passed ? 'Ok' : disk.smart_status.passed === false ? 'Predicted Failure' : 'unknown';
|
||||
if (disk.temperature && disk.temperature.current) {
|
||||
result[i].temperature = disk.temperature.current;
|
||||
}
|
||||
result[i].smartData = disk;
|
||||
}
|
||||
}
|
||||
});
|
||||
commitResult(result);
|
||||
} catch (e) {
|
||||
if (cmd) {
|
||||
cmd = cmd + 'printf "\n"';
|
||||
exec(cmd, { maxBuffer: 1024 * 1024 }, (error, stdout) => {
|
||||
const lines = stdout.toString().split('\n');
|
||||
lines.forEach((line) => {
|
||||
if (line) {
|
||||
const parts = line.split('|');
|
||||
if (parts.length === 2) {
|
||||
const BSDName = parts[0];
|
||||
parts[1] = parts[1].trim();
|
||||
const parts2 = parts[1].split(':');
|
||||
if (parts2.length === 2) {
|
||||
parts2[1] = parts2[1].trim();
|
||||
const status = parts2[1].toLowerCase();
|
||||
for (let i = 0; i < result.length; i++) {
|
||||
if (result[i].BSDName === BSDName) {
|
||||
result[i].smartStatus = status === 'passed' ? 'Ok' : status === 'failed!' ? 'Predicted Failure' : 'unknown';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
commitResult(result);
|
||||
});
|
||||
} else {
|
||||
commitResult(result);
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if (cmd) {
|
||||
cmd = cmd + 'printf "\n"';
|
||||
exec(cmd, { maxBuffer: 1024 * 1024 }, (error, stdout) => {
|
||||
const lines = stdout.toString().split('\n');
|
||||
|
||||
@ -434,7 +434,7 @@ function getWindowsIEEE8021x(connectionType, iface, ifaces) {
|
||||
i8021x.state = i8021xState.split(':').pop();
|
||||
i8021x.protocol = i8021xProtocol.split(':').pop();
|
||||
}
|
||||
} catch (error) {
|
||||
} catch {
|
||||
if (error.status === 1 && error.stdout.includes('AutoConfig')) {
|
||||
i8021x.state = 'Disabled';
|
||||
i8021x.protocol = 'Not defined';
|
||||
|
||||
@ -228,7 +228,6 @@ function osInfo(callback) {
|
||||
distro: 'unknown',
|
||||
release: 'unknown',
|
||||
codename: '',
|
||||
domain: '',
|
||||
kernel: os.release(),
|
||||
arch: os.arch(),
|
||||
hostname: os.hostname(),
|
||||
@ -365,7 +364,6 @@ function osInfo(callback) {
|
||||
workload.push(util.powerShell('(Get-CimInstance Win32_ComputerSystem).HypervisorPresent'));
|
||||
workload.push(util.powerShell('Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SystemInformation]::TerminalServerSession'));
|
||||
workload.push(util.powerShell('reg query "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion" /v DisplayVersion'));
|
||||
workload.push(util.powerShell('Get-CimInstance Win32_ComputerSystem | select Domain | fl '));
|
||||
util.promiseAll(workload).then((data) => {
|
||||
const lines = data.results[0] ? data.results[0].toString().split('\r\n') : [''];
|
||||
result.distro = util.getValue(lines, 'Caption', ':').trim();
|
||||
@ -380,8 +378,6 @@ function osInfo(callback) {
|
||||
const codenameParts = data.results[3].split('REG_SZ');
|
||||
result.codename = codenameParts.length > 1 ? codenameParts[1].trim() : '';
|
||||
}
|
||||
const domain = data.results[4] ? data.results[4].toString().split('\r\n') : [''];
|
||||
result.domain = util.getValue(domain, 'Domain', ':').trim();
|
||||
if (!result.codename) {
|
||||
const buildNum = parseInt(result.build, 10);
|
||||
result.codename = getWindowsRelease(buildNum);
|
||||
@ -773,14 +769,9 @@ function versions(apps, callback) {
|
||||
if (_linux) {
|
||||
exec('locate bin/postgres', (error, stdout) => {
|
||||
if (!error) {
|
||||
const safePath = /^[a-zA-Z0-9/_.-]+$/;
|
||||
const postgresqlBin = stdout
|
||||
.toString()
|
||||
.split('\n')
|
||||
.filter((p) => safePath.test(p.trim()))
|
||||
.sort();
|
||||
const postgresqlBin = stdout.toString().split('\n').sort();
|
||||
if (postgresqlBin.length) {
|
||||
execFile(postgresqlBin[postgresqlBin.length - 1], ['-V'], (error, stdout) => {
|
||||
exec(postgresqlBin[postgresqlBin.length - 1] + ' -V', (error, stdout) => {
|
||||
if (!error) {
|
||||
const postgresql = stdout.toString().split('\n')[0].split(' ') || [];
|
||||
appsObj.versions.postgresql = postgresql.length ? postgresql[postgresql.length - 1] : '';
|
||||
|
||||
@ -437,8 +437,8 @@ function wifiNetworks(callback) {
|
||||
const res = getWifiNetworkListIw(ifaceSanitized);
|
||||
if (res === -1) {
|
||||
// try again after 4 secs
|
||||
setTimeout(() => {
|
||||
const res = getWifiNetworkListIw(ifaceSanitized);
|
||||
setTimeout((iface) => {
|
||||
const res = getWifiNetworkListIw(iface);
|
||||
if (res !== -1) {
|
||||
result = res;
|
||||
}
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "systeminformation",
|
||||
"version": "5.31.1",
|
||||
"version": "5.30.6",
|
||||
"description": "Advanced, lightweight system and OS information library",
|
||||
"license": "MIT",
|
||||
"author": "Sebastian Hildebrandt <hildebrandt@plus-innovations.com> (https://plus-innovations.com)",
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user