diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5a99f78..02aa7e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -30,6 +30,7 @@ For major (breaking) changes - version 3 and 2 see end of page.
| Version | Date | Comment |
| -------------- | -------------- | -------- |
+| 4.0.12 | 2019-03-01 | `diskLayout()` linux rewritten - better detection |
| 4.0.11 | 2019-02-23 | `users()` fix windows (time), added @ts-check |
| 4.0.10 | 2019-02-10 | `networkInterfaceDefault()` fix windows |
| 4.0.9 | 2019-02-08 | `cpu()` fix, code cleanup |
diff --git a/README.md b/README.md
index 03e9cb6..37c594c 100644
--- a/README.md
+++ b/README.md
@@ -346,17 +346,17 @@ I also created a nice little command line tool called [mmon][mmon-github-url] (
| | [0].type | X | | X | X | | HD, SSD |
| | [0].name | X | | X | X | | disk name |
| | [0].vendor | X | | | X | | vendor/producer |
-| | [0].firmwareRevision | X | | X | X | | firmware revision |
-| | [0].serialNum | X | | X | X | | serial number |
-| | [0].interfaceType | | | | X | | |
| | [0].size | X | | X | X | | size in bytes |
+| | [0].bytesPerSector | | | | X | | bytes per sector |
| | [0].totalCylinders | | | | X | | total cylinders |
| | [0].totalHeads | | | | X | | total heads |
+| | [0].totalSectors | | | | X | | total sectors |
| | [0].totalTracks | | | | X | | total tracks |
| | [0].tracksPerCylinder | | | | X | | tracks per cylinder |
| | [0].sectorsPerTrack | | | | X | | sectors per track |
-| | [0].totalSectors | | | | X | | total sectors |
-| | [0].bytesPerSector | | | | X | | bytes per sector |
+| | [0].firmwareRevision | X | | X | X | | firmware revision |
+| | [0].serialNum | X | | X | X | | serial number |
+| | [0].interfaceType | X | | | X | | |
| | [0].smartStatus | X | | X | X | | S.M.A.R.T Status (see Known Issues) |
| si.blockDevices(cb) | [{...}] | X | | X | X | | returns array of disks, partitions,
raids and roms |
| | [0].name | X | | X | X | | name |
diff --git a/docs/filesystem.html b/docs/filesystem.html
index 306abc9..42cfc8e 100644
--- a/docs/filesystem.html
+++ b/docs/filesystem.html
@@ -105,36 +105,6 @@
|
vendor/producer |
-
- |
- [0].firmwareRevision |
- X |
- |
- X |
- X |
- |
- firmware revision |
-
-
- |
- [0].serialNum |
- X |
- |
- X |
- X |
- |
- serial number |
-
-
- |
- [0].interfaceType |
- |
- |
- |
- X |
- |
- |
-
|
[0].size |
@@ -175,6 +145,16 @@
|
total tracks |
+
+ |
+ [0].totalSectors |
+ |
+ |
+ |
+ X |
+ |
+ total sectors |
+
|
[0].tracksPerCylinder |
@@ -195,16 +175,6 @@
|
sectors per track |
-
- |
- [0].totalSectors |
- |
- |
- |
- X |
- |
- total sectors |
-
|
[0].bytesPerSector |
@@ -215,6 +185,36 @@
|
bytes per sector |
+
+ |
+ [0].firmwareRevision |
+ X |
+ |
+ X |
+ X |
+ |
+ firmware revision |
+
+
+ |
+ [0].serialNum |
+ X |
+ |
+ X |
+ X |
+ |
+ serial number |
+
+
+ |
+ [0].interfaceType |
+ X |
+ |
+ |
+ X |
+ |
+ |
+
|
[0].smartStatus |
diff --git a/docs/history.html b/docs/history.html
index b89e39e..09db123 100644
--- a/docs/history.html
+++ b/docs/history.html
@@ -80,6 +80,11 @@
+
+ | 4.0.12 |
+ 2019-03-01 |
+ diskLayout() linux rewritten - better detection |
+
| 4.0.11 |
2019-02-23 |
diff --git a/docs/index.html b/docs/index.html
index 1fcea6f..18dbe82 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -170,7 +170,7 @@
systeminformation
- Current Version: 4.0.11
+ Current Version: 4.0.12
@@ -193,7 +193,7 @@
-
8,112
+
8,158
Lines of code
@@ -201,7 +201,7 @@
Downloads last month
diff --git a/lib/filesystem.js b/lib/filesystem.js
index 9474f8c..9b05e68 100644
--- a/lib/filesystem.js
+++ b/lib/filesystem.js
@@ -601,6 +601,48 @@ exports.disksIO = disksIO;
function diskLayout(callback) {
+ function getVendorFromModel(model) {
+ const diskManufacturers = [
+ { pattern: '^WESTERN.+', manufacturer: 'Western Digital' },
+ { pattern: '^WDC.+', manufacturer: 'Western Digital' },
+ { pattern: 'WD.+', manufacturer: 'Western Digital' },
+ { pattern: '^TOSHIBA.+', manufacturer: 'Toshiba' },
+ { pattern: '^HITACHI.+', manufacturer: 'Hitachi' },
+ { pattern: '^IC.+', manufacturer: 'Hitachi' },
+ { pattern: '^HTS.+', manufacturer: 'Hitachi' },
+ { pattern: '^SANDISK.+', manufacturer: 'SanDisk' },
+ { pattern: '^KINGSTON.+', manufacturer: 'Kingston Technonogy' },
+ { pattern: '^SONY.+', manufacturer: 'Sony' },
+ { pattern: '^TRANSCEND.+', manufacturer: 'Transcend' },
+ { pattern: 'SAMSUNG.+', manufacturer: 'Samsung' },
+ { pattern: '^ST(?!I\\ ).+', manufacturer: 'Seagate' },
+ { pattern: '^STI\\ .+', manufacturer: 'SimpleTech' },
+ { pattern: '^D...-.+', manufacturer: 'IBM' },
+ { pattern: '^IBM.+', manufacturer: 'IBM' },
+ { pattern: '^FUJITSU.+', manufacturer: 'Fujitsu' },
+ { pattern: '^MP.+', manufacturer: 'Fujitsu' },
+ { pattern: '^MK.+', manufacturer: 'Toshiba' },
+ { pattern: '^MAXTOR.+', manufacturer: 'Maxtor' },
+ { pattern: '^Pioneer.+', manufacturer: 'Pioneer' },
+ { pattern: '^PHILIPS.+', manufacturer: 'Philips' },
+ { pattern: '^QUANTUM.+', manufacturer: 'Quantum Technology' },
+ { pattern: 'FIREBALL.+', manufacturer: 'Quantum Technology' },
+ { pattern: '^VBOX.+', manufacturer: 'VirtualBox' },
+ { pattern: 'CORSAIR.+', manufacturer: 'Corsair Components' },
+ { pattern: 'CRUCIAL.+', manufacturer: 'Crucial' },
+ { pattern: 'ECM.+', manufacturer: 'ECM' },
+ { pattern: 'INTEL.+', manufacturer: 'INTEL' },
+ ];
+
+ let result = '';
+ model = model.toUpperCase();
+ diskManufacturers.forEach((manufacturer) => {
+ const re = RegExp(manufacturer.pattern);
+ if (re.test(model)) { result = manufacturer.manufacturer }
+ })
+ return result
+ }
+
return new Promise((resolve) => {
process.nextTick(() => {
@@ -608,46 +650,50 @@ function diskLayout(callback) {
let cmd = '';
if (_linux) {
- exec('export LC_ALL=C; lshw -class disk; unset LC_ALL', function (error, stdout) {
+ exec('export LC_ALL=C; lsblk -ablJO; unset LC_ALL', function (error, stdout) {
if (!error) {
- let devices = stdout.toString().split('*-');
- devices.shift();
- devices.forEach(function (device) {
- let lines = device.split('\n');
- let mediumType = '';
- const BSDName = util.getValue(lines, 'logical name', ':', true).trim();
- const logical = util.getValue(lines, 'logical name', ':', true).trim().replace(/\/dev\//g, '');
- try {
- mediumType = execSync('cat /sys/block/' + logical + '/queue/rotational').toString().split('\n')[0];
- } catch (e) {
- util.noop();
+ try {
+ const out = stdout.toString().trim();
+ const outJSON = JSON.parse(out);
+ if (outJSON && outJSON.hasOwnProperty('blockdevices')) {
+ let devices = outJSON.blockdevices.filter(item => { return item.group === 'disk' && item.size > 0 && item.model !== null });
+ devices.forEach((device) => {
+ let mediumType = '';
+ const BSDName = '/dev/' + device.name;
+ const logical = device.name;
+ try {
+ mediumType = execSync('cat /sys/block/' + logical + '/queue/rotational').toString().split('\n')[0];
+ } catch (e) {
+ util.noop();
+ }
+ result.push({
+ type: (mediumType === '0' ? 'SSD' : (mediumType === '1' ? 'HD' : (device.model && device.model.indexOf('SSD') > -1 ? 'SSD' : 'HD'))),
+ name: device.model || '',
+ vendor: getVendorFromModel(device.model) || (device.vendor ? device.vendor.trim() : ''),
+ size: device.size || 0,
+ bytesPerSector: -1,
+ totalCylinders: -1,
+ totalHeads: -1,
+ totalSectors: -1,
+ totalTracks: -1,
+ tracksPerCylinder: -1,
+ sectorsPerTrack: -1,
+ firmwareRevision: device.rev ? device.rev.trim() : '',
+ serialNum: device.serial ? device.serial.trim() : '',
+ interfaceType: device.tran ? device.tran.trim() : '',
+ smartStatus: 'unknown',
+ BSDName: BSDName
+ });
+ cmd = cmd + 'printf "\n' + BSDName + '|"; smartctl -H ' + BSDName + ' | grep overall;';
+ })
}
-
- const sizeString = util.getValue(lines, 'size', ':', true).trim();
- if (sizeString && lines.length > 0 && lines[0].trim() === 'disk') {
- const sizeValue = sizeString.match(/\(([^)]+)\)/)[1];
- result.push({
- type: (mediumType === '0' ? 'SSD' : (mediumType === '1' ? 'HD' : (device.indexOf('SSD') > -1 ? 'SSD' : 'HD'))), // to be tested ... /sys/block/sda/queue/rotational
- name: util.getValue(lines, 'product:', ':', true),
- vendor: util.getValue(lines, 'vendor:', ':', true),
- size: parseInt(sizeValue, 10) * 1000 * 1000 * 1000 * (sizeValue.indexOf('T') >= 0 ? 1000 : 1),
- bytesPerSector: -1,
- totalCylinders: -1,
- totalHeads: -1,
- totalSectors: -1,
- totalTracks: -1,
- tracksPerCylinder: -1,
- sectorsPerTrack: -1,
- firmwareRevision: util.getValue(lines, 'version:', ':', true).trim(),
- serialNum: util.getValue(lines, 'serial:', ':', true).trim(),
- interfaceType: '',
- smartStatus: 'unknown',
- BSDName: BSDName
- });
- cmd = cmd + 'printf "\n' + BSDName + '|"; smartctl -H ' + BSDName + ' | grep overall;';
- }
- });
+ } catch (e) {
+ util.noop();
+ }
}
+ // lshw sometimes returns empty results, try lsblk
+
+ // check S.M.A.R.T. status
if (cmd) {
cmd = cmd + 'printf "\n"';
exec(cmd, function (error, stdout) {