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
-
131
+
133
Dependends
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) {