added blockDevices, fixed fsSize, added file system type

This commit is contained in:
Sebastian Hildebrandt 2016-11-12 09:25:34 +01:00
parent 3bd3069dfe
commit 609f667a85
5 changed files with 113 additions and 5 deletions

View File

@ -16,6 +16,7 @@
New Functions
- `blockDevices`: returns array of block devices like disks, partitions, raids, roms (new in version 3.10)
- `dockerContainerProcesses`: returns processes for a specific docker container (new in version 3.8)
- `versions`: returns object of versions - kernel, ssl, node, npm, ...(new in version 3.6)
- `graphics`: returns arrays of graphics controllers and displays (new in version 3.5)
@ -88,6 +89,7 @@ Other changes
| Version | Date | Comment |
| -------------- | -------------- | -------- |
| 3.10.0 | 2016-11-12 | added blockDevices, fixed fsSize, added file system type |
| 3.9.0 | 2016-11-11 | added MAC address to networkInterfaces, fixed currentLoad |
| 3.8.1 | 2016-11-04 | updated docs |
| 3.8.0 | 2016-11-04 | added dockerContainerProcesses |

View File

@ -42,6 +42,7 @@ si.cpu()
### Latest Activity
- Version 3.10.0: added blockDevices (list of disks, partitions, raids and roms).
- Version 3.9.0: extended networkInterfaces (added MAC address).
- Version 3.8.0: added dockerContainerProcesses (array of processes inside a docker container).
- Version 3.7.0: extended docker stats.
@ -160,10 +161,19 @@ This library is splitted in several sections:
| - displays[0].sizey | X | X | size in mm vertical |
| si.fsSize(cb) | X | X | returns array of mounted file systems |
| - [0].fs | X | X | name of file system |
| - [0].type | X | X | type of file system |
| - [0].size | X | X | sizes in Bytes |
| - [0].used | X | X | used in Bytes |
| - [0].use | X | X | used in % |
| - [0].mount | X | X | mount point |
| si.blockDevices(cb) | X | X | returns array of disks, partitions,<br>raids and roms |
| - [0].name | X | X | name |
| - [0].type | X | X | type |
| - [0].fstype | X | X | file system type (e.g. ext4) |
| - [0].mount | X | X | mount point |
| - [0].size | X | X | size in bytes |
| - [0].physical | X | X | physical type (HDD, SSD, CD/DVD) |
| - [0].uuid | X | X | UUID |
| si.fsStats(cb) | X | X | current transfer stats |
| - rx | X | X | bytes read since startup |
| - wx | X | X | bytes written since startup |

View File

@ -28,7 +28,7 @@ let _fs_speed = {};
let _disk_io = {};
// --------------------------
// FS - devices
// FS - mounted file systems
function fsSize(callback) {
@ -40,7 +40,7 @@ function fsSize(callback) {
reject(error);
}
exec("df -lk | grep ^/", function (error, stdout) {
exec("df -lkPT | grep ^/", function (error, stdout) {
let data = [];
if (!error) {
let lines = stdout.toString().split('\n');
@ -50,9 +50,10 @@ function fsSize(callback) {
line = line.replace(/ +/g, " ").split(' ');
data.push({
'fs': line[0],
'size': parseInt(line[1]) * 1024,
'used': parseInt(line[2]) * 1024,
'use': parseFloat((100.0 * line[2] / line[1]).toFixed(2)),
'type': line[1],
'size': parseInt(line[2]) * 1024,
'used': parseInt(line[3]) * 1024,
'use': parseFloat((100.0 * line[3] / line[2]).toFixed(2)),
'mount': line[line.length - 1]
})
}
@ -67,6 +68,67 @@ function fsSize(callback) {
exports.fsSize = fsSize;
// --------------------------
// disks
function blockDevices(callback) {
return new Promise((resolve, reject) => {
process.nextTick(() => {
if (_windows) {
let error = new Error(NOT_SUPPORTED);
if (callback) { callback(NOT_SUPPORTED) }
reject(error);
}
if (_linux) {
exec("lsblk -bo NAME,TYPE,SIZE,FSTYPE,MOUNTPOINT,UUID,ROTA,OWNER,GROUP,MODE,LABEL,ALIGNMENT,MIN-IO,OPT-IO,PHY-SEC,LOG-SEC,SCHED,RQ-SIZE,RA,WSAME", function (error, stdout) {
let data = [];
if (!error) {
let lines = stdout.toString().split('\n');
let header = lines[0];
lines.splice(0, 1);
lines.forEach(function (line) {
if (line != '') {
if (line.substr(header.indexOf('FSTYPE'), 1) == ' ') { line = line.substr(0, header.indexOf('FSTYPE')) + '-' + line.substr(header.indexOf('FSTYPE') + 1, 1000)}
if (line.substr(header.indexOf('MOUNTPOINT'), 1) == ' ') { line = line.substr(0, header.indexOf('MOUNTPOINT')) + '-' + line.substr(header.indexOf('MOUNTPOINT') + 1, 1000)}
if (line.substr(header.indexOf('UUID'), 1) == ' ') { line = line.substr(0, header.indexOf('UUID')) + '-' + line.substr(header.indexOf('UUID') + 1, 1000)}
line = line.replace(/[├─│└]+/g, "");
line = line.replace(/ +/g, " ").trim().split(' ');
data.push({
'name': line[0],
'type': line[1],
'fstype': (line[3] == '-' ? '' : line[3]),
'mount': (line[4] == '-' ? '' : line[4]),
'size': parseInt(line[2]),
'physical': (line[1] == 'disk' ? (line[6] == '0' ? 'SSD' : 'HDD') : (line[1] == 'rom' ? 'CD/DVD' : '')),
'uuid': (line[5] == '-' ? '' : line[5])
})
}
});
data = util.unique(data);
data = util.sortByKey(data, ['type', 'name']);
}
if (callback) {
callback(data)
}
resolve(data);
});
}
if (_darwin) {
// last minute decision to remove code ... not stable
let data = [];
if (callback) {
callback(data)
}
resolve(data);
}
});
});
}
exports.blockDevices = blockDevices;
// --------------------------
// FS - speed

View File

@ -81,6 +81,7 @@
// --------------------------------
//
// version date comment
// 3.10.0 2016-11-12 added blockDevices, fixed fsSize, added file system type
// 3.9.0 2016-11-11 added MAC address to networkInterfaces, fixed currentLoad
// 3.8.1 2016-11-04 updated docs
// 3.8.0 2016-11-04 added dockerContainerProcesses
@ -396,6 +397,7 @@ exports.battery = battery;
exports.graphics = graphics.graphics;
exports.fsSize = filesystem.fsSize;
exports.blockDevices = filesystem.blockDevices;
exports.fsStats = filesystem.fsStats;
exports.disksIO = filesystem.disksIO;

View File

@ -20,6 +20,36 @@ function isFunction(functionToCheck) {
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}
function unique(obj){
var uniques=[];
var stringify={};
for(var i=0;i<obj.length;i++){
var keys=Object.keys(obj[i]);
keys.sort(function(a,b) {return a-b});
var str='';
for(var j=0;j<keys.length;j++){
str+= JSON.stringify(keys[j]);
str+= JSON.stringify(obj[i][keys[j]]);
}
if(!stringify.hasOwnProperty(str)){
uniques.push(obj[i]);
stringify[str]=true;
}
}
return uniques;
}
function sortByKey(array, keys) {
return array.sort(function(a, b) {
let x ='';
let y ='';
keys.forEach(function (key) {
x = x + a[key]; y = y + b[key];
});
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});
}
function cores() {
if (_cores == 0) {
_cores = os.cpus().length;
@ -28,4 +58,6 @@ function cores() {
}
exports.isFunction = isFunction;
exports.unique = unique;
exports.sortByKey= sortByKey;
exports.cores = cores;