diskLayout() for linux rewritten - better detection
This commit is contained in:
parent
c1d35b550e
commit
5302d24069
@ -30,6 +30,7 @@ For major (breaking) changes - version 3 and 2 see end of page.
|
|||||||
|
|
||||||
| Version | Date | Comment |
|
| 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.11 | 2019-02-23 | `users()` fix windows (time), added @ts-check |
|
||||||
| 4.0.10 | 2019-02-10 | `networkInterfaceDefault()` fix windows |
|
| 4.0.10 | 2019-02-10 | `networkInterfaceDefault()` fix windows |
|
||||||
| 4.0.9 | 2019-02-08 | `cpu()` fix, code cleanup |
|
| 4.0.9 | 2019-02-08 | `cpu()` fix, code cleanup |
|
||||||
|
|||||||
10
README.md
10
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].type | X | | X | X | | HD, SSD |
|
||||||
| | [0].name | X | | X | X | | disk name |
|
| | [0].name | X | | X | X | | disk name |
|
||||||
| | [0].vendor | X | | | X | | vendor/producer |
|
| | [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].size | X | | X | X | | size in bytes |
|
||||||
|
| | [0].bytesPerSector | | | | X | | bytes per sector |
|
||||||
| | [0].totalCylinders | | | | X | | total cylinders |
|
| | [0].totalCylinders | | | | X | | total cylinders |
|
||||||
| | [0].totalHeads | | | | X | | total heads |
|
| | [0].totalHeads | | | | X | | total heads |
|
||||||
|
| | [0].totalSectors | | | | X | | total sectors |
|
||||||
| | [0].totalTracks | | | | X | | total tracks |
|
| | [0].totalTracks | | | | X | | total tracks |
|
||||||
| | [0].tracksPerCylinder | | | | X | | tracks per cylinder |
|
| | [0].tracksPerCylinder | | | | X | | tracks per cylinder |
|
||||||
| | [0].sectorsPerTrack | | | | X | | sectors per track |
|
| | [0].sectorsPerTrack | | | | X | | sectors per track |
|
||||||
| | [0].totalSectors | | | | X | | total sectors |
|
| | [0].firmwareRevision | X | | X | X | | firmware revision |
|
||||||
| | [0].bytesPerSector | | | | X | | bytes per sector |
|
| | [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) |
|
| | [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,<br>raids and roms |
|
| si.blockDevices(cb) | [{...}] | X | | X | X | | returns array of disks, partitions,<br>raids and roms |
|
||||||
| | [0].name | X | | X | X | | name |
|
| | [0].name | X | | X | X | | name |
|
||||||
|
|||||||
@ -105,36 +105,6 @@
|
|||||||
<td></td>
|
<td></td>
|
||||||
<td>vendor/producer</td>
|
<td>vendor/producer</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td>[0].firmwareRevision</td>
|
|
||||||
<td>X</td>
|
|
||||||
<td></td>
|
|
||||||
<td>X</td>
|
|
||||||
<td>X</td>
|
|
||||||
<td></td>
|
|
||||||
<td>firmware revision</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td>[0].serialNum</td>
|
|
||||||
<td>X</td>
|
|
||||||
<td></td>
|
|
||||||
<td>X</td>
|
|
||||||
<td>X</td>
|
|
||||||
<td></td>
|
|
||||||
<td>serial number</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td>[0].interfaceType</td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td>X</td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td>[0].size</td>
|
<td>[0].size</td>
|
||||||
@ -175,6 +145,16 @@
|
|||||||
<td></td>
|
<td></td>
|
||||||
<td>total tracks</td>
|
<td>total tracks</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td>[0].totalSectors</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td>X</td>
|
||||||
|
<td></td>
|
||||||
|
<td>total sectors</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td>[0].tracksPerCylinder</td>
|
<td>[0].tracksPerCylinder</td>
|
||||||
@ -195,16 +175,6 @@
|
|||||||
<td></td>
|
<td></td>
|
||||||
<td>sectors per track</td>
|
<td>sectors per track</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td>[0].totalSectors</td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td>X</td>
|
|
||||||
<td></td>
|
|
||||||
<td>total sectors</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td>[0].bytesPerSector</td>
|
<td>[0].bytesPerSector</td>
|
||||||
@ -215,6 +185,36 @@
|
|||||||
<td></td>
|
<td></td>
|
||||||
<td>bytes per sector</td>
|
<td>bytes per sector</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td>[0].firmwareRevision</td>
|
||||||
|
<td>X</td>
|
||||||
|
<td></td>
|
||||||
|
<td>X</td>
|
||||||
|
<td>X</td>
|
||||||
|
<td></td>
|
||||||
|
<td>firmware revision</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td>[0].serialNum</td>
|
||||||
|
<td>X</td>
|
||||||
|
<td></td>
|
||||||
|
<td>X</td>
|
||||||
|
<td>X</td>
|
||||||
|
<td></td>
|
||||||
|
<td>serial number</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td>[0].interfaceType</td>
|
||||||
|
<td>X</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td>X</td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td></td>
|
<td></td>
|
||||||
<td>[0].smartStatus</td>
|
<td>[0].smartStatus</td>
|
||||||
|
|||||||
@ -80,6 +80,11 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">4.0.12</th>
|
||||||
|
<td>2019-03-01</td>
|
||||||
|
<td><span class="code">diskLayout()</span> linux rewritten - better detection</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row">4.0.11</th>
|
<th scope="row">4.0.11</th>
|
||||||
<td>2019-02-23</td>
|
<td>2019-02-23</td>
|
||||||
|
|||||||
@ -170,7 +170,7 @@
|
|||||||
<img class="logo" src="assets/logo.png">
|
<img class="logo" src="assets/logo.png">
|
||||||
<div class="title">systeminformation</div>
|
<div class="title">systeminformation</div>
|
||||||
<div class="subtitle"><span id="typed"></span></div>
|
<div class="subtitle"><span id="typed"></span></div>
|
||||||
<div class="version">Current Version: <span id="version">4.0.11</span></div>
|
<div class="version">Current Version: <span id="version">4.0.12</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>
|
<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>
|
||||||
<div class="down">
|
<div class="down">
|
||||||
@ -193,7 +193,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row number-section">
|
<div class="row number-section">
|
||||||
<div class="col-xl-4 col-lg-4 col-md-4 col-12">
|
<div class="col-xl-4 col-lg-4 col-md-4 col-12">
|
||||||
<div class="numbers">8,112</div>
|
<div class="numbers">8,158</div>
|
||||||
<div class="title">Lines of code</div>
|
<div class="title">Lines of code</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xl-4 col-lg-4 col-md-4 col-12">
|
<div class="col-xl-4 col-lg-4 col-md-4 col-12">
|
||||||
@ -201,7 +201,7 @@
|
|||||||
<div class="title">Downloads last month</div>
|
<div class="title">Downloads last month</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xl-4 col-lg-4 col-md-4 col-12">
|
<div class="col-xl-4 col-lg-4 col-md-4 col-12">
|
||||||
<div class="numbers">131</div>
|
<div class="numbers">133</div>
|
||||||
<div class="title">Dependends</div>
|
<div class="title">Dependends</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -601,6 +601,48 @@ exports.disksIO = disksIO;
|
|||||||
|
|
||||||
function diskLayout(callback) {
|
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) => {
|
return new Promise((resolve) => {
|
||||||
process.nextTick(() => {
|
process.nextTick(() => {
|
||||||
|
|
||||||
@ -608,46 +650,50 @@ function diskLayout(callback) {
|
|||||||
let cmd = '';
|
let cmd = '';
|
||||||
|
|
||||||
if (_linux) {
|
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) {
|
if (!error) {
|
||||||
let devices = stdout.toString().split('*-');
|
try {
|
||||||
devices.shift();
|
const out = stdout.toString().trim();
|
||||||
devices.forEach(function (device) {
|
const outJSON = JSON.parse(out);
|
||||||
let lines = device.split('\n');
|
if (outJSON && outJSON.hasOwnProperty('blockdevices')) {
|
||||||
let mediumType = '';
|
let devices = outJSON.blockdevices.filter(item => { return item.group === 'disk' && item.size > 0 && item.model !== null });
|
||||||
const BSDName = util.getValue(lines, 'logical name', ':', true).trim();
|
devices.forEach((device) => {
|
||||||
const logical = util.getValue(lines, 'logical name', ':', true).trim().replace(/\/dev\//g, '');
|
let mediumType = '';
|
||||||
try {
|
const BSDName = '/dev/' + device.name;
|
||||||
mediumType = execSync('cat /sys/block/' + logical + '/queue/rotational').toString().split('\n')[0];
|
const logical = device.name;
|
||||||
} catch (e) {
|
try {
|
||||||
util.noop();
|
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;';
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
const sizeString = util.getValue(lines, 'size', ':', true).trim();
|
util.noop();
|
||||||
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;';
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
// lshw sometimes returns empty results, try lsblk
|
||||||
|
|
||||||
|
// check S.M.A.R.T. status
|
||||||
if (cmd) {
|
if (cmd) {
|
||||||
cmd = cmd + 'printf "\n"';
|
cmd = cmd + 'printf "\n"';
|
||||||
exec(cmd, function (error, stdout) {
|
exec(cmd, function (error, stdout) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user