-
13,682
+
13,752
Lines of code
diff --git a/lib/filesystem.js b/lib/filesystem.js
index 99a7321..b19d535 100755
--- a/lib/filesystem.js
+++ b/lib/filesystem.js
@@ -929,157 +929,178 @@ function diskLayout(callback) {
else if (dataType === 'NVMe') { linesNVMe.push(line); }
else if (dataType === 'USB') { linesUSB.push(line); }
});
- // Serial ATA Drives
- let devices = linesSATA.join('\n').split(' Physical Interconnect: ');
- devices.shift();
- devices.forEach(function (device) {
- device = 'InterfaceType: ' + device;
- let lines = device.split('\n');
- const mediumType = util.getValue(lines, 'Medium Type', ':', true).trim();
- const sizeStr = util.getValue(lines, 'capacity', ':', true).trim();
- const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
- if (sizeStr) {
- let sizeValue = 0;
- if (sizeStr.indexOf('(') >= 0) {
- sizeValue = parseInt(sizeStr.match(/\(([^)]+)\)/)[1].replace(/\./g, '').replace(/,/g, ''));
+ try {
+ // Serial ATA Drives
+ let devices = linesSATA.join('\n').split(' Physical Interconnect: ');
+ devices.shift();
+ devices.forEach(function (device) {
+ device = 'InterfaceType: ' + device;
+ let lines = device.split('\n');
+ const mediumType = util.getValue(lines, 'Medium Type', ':', true).trim();
+ const sizeStr = util.getValue(lines, 'capacity', ':', true).trim();
+ const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
+ if (sizeStr) {
+ let sizeValue = 0;
+ if (sizeStr.indexOf('(') >= 0) {
+ sizeValue = parseInt(sizeStr.match(/\(([^)]+)\)/)[1].replace(/\./g, '').replace(/,/g, ''));
+ }
+ if (!sizeValue) {
+ sizeValue = parseInt(sizeStr);
+ }
+ if (sizeValue) {
+ const smartStatusString = util.getValue(lines, 'S.M.A.R.T. status', ':', true).trim().toLowerCase();
+ result.push({
+ device: BSDName,
+ type: mediumType.startsWith('Solid') ? 'SSD' : 'HD',
+ name: util.getValue(lines, 'Model', ':', true).trim(),
+ vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()) || util.getValue(lines, 'Manufacturer', ':', true),
+ size: sizeValue,
+ bytesPerSector: null,
+ totalCylinders: null,
+ totalHeads: null,
+ totalSectors: null,
+ totalTracks: null,
+ tracksPerCylinder: null,
+ sectorsPerTrack: null,
+ firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
+ serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
+ interfaceType: util.getValue(lines, 'InterfaceType', ':', true).trim(),
+ smartStatus: smartStatusString === 'verified' ? 'OK' : smartStatusString || 'unknown',
+ temperature: null,
+ BSDName: BSDName
+ });
+ cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
+ }
}
- if (!sizeValue) {
- sizeValue = parseInt(sizeStr);
- }
- if (sizeValue) {
- const smartStatusString = util.getValue(lines, 'S.M.A.R.T. status', ':', true).trim().toLowerCase();
- result.push({
- device: BSDName,
- type: mediumType.startsWith('Solid') ? 'SSD' : 'HD',
- name: util.getValue(lines, 'Model', ':', true).trim(),
- vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()) || util.getValue(lines, 'Manufacturer', ':', true),
- size: sizeValue,
- bytesPerSector: null,
- totalCylinders: null,
- totalHeads: null,
- totalSectors: null,
- totalTracks: null,
- tracksPerCylinder: null,
- sectorsPerTrack: null,
- firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
- serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
- interfaceType: util.getValue(lines, 'InterfaceType', ':', true).trim(),
- smartStatus: smartStatusString === 'verified' ? 'OK' : smartStatusString || 'unknown',
- temperature: null,
- BSDName: BSDName
- });
- cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
- }
- }
- });
+ });
+ } catch (e) {
+ util.noop();
+ }
+
// NVME Drives
- devices = linesNVMe.join('\n').split('\n\n Capacity:');
- devices.shift();
- devices.forEach(function (device) {
- device = '!Capacity: ' + device;
- let lines = device.split('\n');
- const linkWidth = util.getValue(lines, 'link width', ':', true).trim();
- const sizeStr = util.getValue(lines, '!capacity', ':', true).trim();
- const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
- if (sizeStr) {
- let sizeValue = 0;
- if (sizeStr.indexOf('(') >= 0) {
- sizeValue = parseInt(sizeStr.match(/\(([^)]+)\)/)[1].replace(/\./g, '').replace(/,/g, ''));
+ try {
+ let devices = linesNVMe.join('\n').split('\n\n Capacity:');
+ devices.shift();
+ devices.forEach(function (device) {
+ device = '!Capacity: ' + device;
+ let lines = device.split('\n');
+ const linkWidth = util.getValue(lines, 'link width', ':', true).trim();
+ const sizeStr = util.getValue(lines, '!capacity', ':', true).trim();
+ const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
+ if (sizeStr) {
+ let sizeValue = 0;
+ if (sizeStr.indexOf('(') >= 0) {
+ sizeValue = parseInt(sizeStr.match(/\(([^)]+)\)/)[1].replace(/\./g, '').replace(/,/g, ''));
+ }
+ if (!sizeValue) {
+ sizeValue = parseInt(sizeStr);
+ }
+ if (sizeValue) {
+ const smartStatusString = util.getValue(lines, 'S.M.A.R.T. status', ':', true).trim().toLowerCase();
+ result.push({
+ device: BSDName,
+ type: 'NVMe',
+ name: util.getValue(lines, 'Model', ':', true).trim(),
+ vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()),
+ size: sizeValue,
+ bytesPerSector: null,
+ totalCylinders: null,
+ totalHeads: null,
+ totalSectors: null,
+ totalTracks: null,
+ tracksPerCylinder: null,
+ sectorsPerTrack: null,
+ firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
+ serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
+ interfaceType: ('PCIe ' + linkWidth).trim(),
+ smartStatus: smartStatusString === 'verified' ? 'OK' : smartStatusString || 'unknown',
+ temperature: null,
+ BSDName: BSDName
+ });
+ cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
+ }
}
- if (!sizeValue) {
- sizeValue = parseInt(sizeStr);
- }
- if (sizeValue) {
- const smartStatusString = util.getValue(lines, 'S.M.A.R.T. status', ':', true).trim().toLowerCase();
- result.push({
- device: BSDName,
- type: 'NVMe',
- name: util.getValue(lines, 'Model', ':', true).trim(),
- vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()),
- size: sizeValue,
- bytesPerSector: null,
- totalCylinders: null,
- totalHeads: null,
- totalSectors: null,
- totalTracks: null,
- tracksPerCylinder: null,
- sectorsPerTrack: null,
- firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
- serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
- interfaceType: ('PCIe ' + linkWidth).trim(),
- smartStatus: smartStatusString === 'verified' ? 'OK' : smartStatusString || 'unknown',
- temperature: null,
- BSDName: BSDName
- });
- cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
- }
- }
- });
+ });
+ } catch (e) {
+ util.noop();
+ }
// USB Drives
- devices = linesUSB.join('\n').replaceAll('Media:\n ', 'Model:').split('\n\n Product ID:');
- devices.shift();
- devices.forEach(function (device) {
- let lines = device.split('\n');
- const sizeStr = util.getValue(lines, 'Capacity', ':', true).trim();
- const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
- if (sizeStr) {
- let sizeValue = 0;
- if (sizeStr.indexOf('(') >= 0) {
- sizeValue = parseInt(sizeStr.match(/\(([^)]+)\)/)[1].replace(/\./g, '').replace(/,/g, ''));
+ try {
+ let devices = linesUSB.join('\n').replaceAll('Media:\n ', 'Model:').split('\n\n Product ID:');
+ devices.shift();
+ devices.forEach(function (device) {
+ let lines = device.split('\n');
+ const sizeStr = util.getValue(lines, 'Capacity', ':', true).trim();
+ const BSDName = util.getValue(lines, 'BSD Name', ':', true).trim();
+ if (sizeStr) {
+ let sizeValue = 0;
+ if (sizeStr.indexOf('(') >= 0) {
+ sizeValue = parseInt(sizeStr.match(/\(([^)]+)\)/)[1].replace(/\./g, '').replace(/,/g, ''));
+ }
+ if (!sizeValue) {
+ sizeValue = parseInt(sizeStr);
+ }
+ if (sizeValue) {
+ const smartStatusString = util.getValue(lines, 'S.M.A.R.T. status', ':', true).trim().toLowerCase();
+ result.push({
+ device: BSDName,
+ type: 'USB',
+ name: util.getValue(lines, 'Model', ':', true).trim().replaceAll(':', ''),
+ vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()),
+ size: sizeValue,
+ bytesPerSector: null,
+ totalCylinders: null,
+ totalHeads: null,
+ totalSectors: null,
+ totalTracks: null,
+ tracksPerCylinder: null,
+ sectorsPerTrack: null,
+ firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
+ serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
+ interfaceType: 'USB',
+ smartStatus: smartStatusString === 'verified' ? 'OK' : smartStatusString || 'unknown',
+ temperature: null,
+ BSDName: BSDName
+ });
+ cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
+ }
}
- if (!sizeValue) {
- sizeValue = parseInt(sizeStr);
- }
- if (sizeValue) {
- const smartStatusString = util.getValue(lines, 'S.M.A.R.T. status', ':', true).trim().toLowerCase();
- result.push({
- device: BSDName,
- type: 'USB',
- name: util.getValue(lines, 'Model', ':', true).trim().replaceAll(':', ''),
- vendor: getVendorFromModel(util.getValue(lines, 'Model', ':', true).trim()),
- size: sizeValue,
- bytesPerSector: null,
- totalCylinders: null,
- totalHeads: null,
- totalSectors: null,
- totalTracks: null,
- tracksPerCylinder: null,
- sectorsPerTrack: null,
- firmwareRevision: util.getValue(lines, 'Revision', ':', true).trim(),
- serialNum: util.getValue(lines, 'Serial Number', ':', true).trim(),
- interfaceType: 'USB',
- smartStatus: smartStatusString === 'verified' ? 'OK' : smartStatusString || 'unknown',
- temperature: null,
- BSDName: BSDName
- });
- cmd = cmd + 'printf "\n' + BSDName + '|"; diskutil info /dev/' + BSDName + ' | grep SMART;';
- }
- }
- });
- }
- if (cmd) {
- cmd = cmd + 'printf "\n"';
- exec(cmd, function (error, stdout) {
- let lines = stdout.toString().split('\n');
- lines.forEach(line => {
- if (line) {
- let parts = line.split('|');
- if (parts.length === 2) {
- let BSDName = parts[0];
- parts[1] = parts[1].trim();
- let parts2 = parts[1].split(':');
- if (parts2.length === 2) {
- parts2[1] = parts2[1].trim();
- let status = parts2[1].toLowerCase();
- for (let i = 0; i < result.length; i++) {
- if (result[i].BSDName === BSDName) {
- result[i].smartStatus = (status === 'not supported' ? 'not supported' : (status === 'verified' ? 'Ok' : (status === 'failing' ? 'Predicted Failure' : 'unknown')));
+ });
+ } catch (e) {
+ util.noop();
+ }
+ if (cmd) {
+ cmd = cmd + 'printf "\n"';
+ exec(cmd, function (error, stdout) {
+ let lines = stdout.toString().split('\n');
+ lines.forEach(line => {
+ if (line) {
+ let parts = line.split('|');
+ if (parts.length === 2) {
+ let BSDName = parts[0];
+ parts[1] = parts[1].trim();
+ let parts2 = parts[1].split(':');
+ if (parts2.length === 2) {
+ parts2[1] = parts2[1].trim();
+ let status = parts2[1].toLowerCase();
+ for (let i = 0; i < result.length; i++) {
+ if (result[i].BSDName === BSDName) {
+ result[i].smartStatus = (status === 'not supported' ? 'not supported' : (status === 'verified' ? 'Ok' : (status === 'failing' ? 'Predicted Failure' : 'unknown')));
+ }
}
}
}
}
+ });
+ for (let i = 0; i < result.length; i++) {
+ delete result[i].BSDName;
}
+ if (callback) {
+ callback(result);
+ }
+ resolve(result);
});
+ } else {
for (let i = 0; i < result.length; i++) {
delete result[i].BSDName;
}
@@ -1087,15 +1108,7 @@ function diskLayout(callback) {
callback(result);
}
resolve(result);
- });
- } else {
- for (let i = 0; i < result.length; i++) {
- delete result[i].BSDName;
}
- if (callback) {
- callback(result);
- }
- resolve(result);
}
});
}