added bios and main board information

This commit is contained in:
Sebastian Hildebrandt 2017-11-07 13:22:09 +01:00
parent a1ee65e19c
commit 68c5fd91ce
10 changed files with 289 additions and 121 deletions

View File

@ -11,7 +11,7 @@ end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
# trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = true

View File

@ -99,6 +99,7 @@ Other changes
| Version | Date | Comment |
| -------------- | -------------- | -------- |
| 3.33.0 | 2017-11-07 | added bios and main board information |
| 3.32.4 | 2017-11-02 | AMD cpu base frequencies table also for windows |
| 3.32.3 | 2017-11-02 | code cleanup, AMD cpu base frequencies table |
| 3.32.2 | 2017-11-01 | bugfix JSON.parse error `blockDevices()` |

View File

@ -53,13 +53,13 @@ async function cpu() {
### Latest Activity
(last 7 major and minor version releases)
- Version 3.33.0: added bios `bios()` and main board `baseboard()` information
- Version 3.32.0: extended `memLayout()` - added manufacturer
- Version 3.31.0: extended windows support `cpuFlags()` (partially)
- Version 3.30.0: extended `versions()` (added `yarn`, `gulp`, `grunt`, `tsc`, `git`)
- Version 3.29.0: extended windows support `services()`
- Version 3.28.0: extended windows support `processes()`
- Version 3.27.0: added raw data to `currentLoad()`, fixed `networkInterfaces()` MAC problem node 8.x
- Version 3.26.0: improved windows support `getDynamicData()`, updated docs
- ...
You can find all changes here: [detailed changelog][changelog-url]
@ -103,6 +103,18 @@ I also created a nice little command line tool called [mmon][mmon-github-url] (
| | version | X | X | X | version e.g. '1.0' |
| | serial | X | X | X | serial number |
| | uuid | X | X | X | UUID |
| | sku | X | | X | SKU number |
| si.bios(cb) | {...} | X | X | X | hardware information |
| | vendor | X | X | X | e.g. 'AMI' |
| | version | X | | X | Version |
| | releaseDate | X | | X | Release Date |
| | revision | X | | X | Revision |
| si.baseboard(cb) | {...} | X | X | X | hardware information |
| | manufacturer | X | X | X | e.g. 'ASUS' |
| | model | X | X | X | Model / Product Name |
| | version | X | X | X | Version |
| | serial | X | X | X | Serial Number |
| | assetTag | X | X | X | Asset Tag |
#### 3. CPU, Memory, Disks, Battery, Graphics

View File

@ -1,3 +1,9 @@
### Issue Type
* [ ] Bug
* [ ] Feature Request
* [ ] Question
### Expected behavior
-

View File

@ -17,11 +17,13 @@ const exec = require('child_process').exec;
const fs = require('fs');
const util = require('./util');
let _platform = os.type();
let _platform = process.platform;
const _linux = (_platform === 'Linux');
const _darwin = (_platform === 'Darwin');
const _windows = (_platform === 'Windows_NT');
const _linux = (_platform === 'linux');
const _darwin = (_platform === 'darwin');
const _windows = (_platform === 'win32');
const _freebsd = (_platform === 'freebsd');
const _sunos = (_platform === 'sunos');
let _cpu_speed = '0.00';
let _current_cpu = {

View File

@ -51,12 +51,7 @@ function dockerContainers(all, callback) {
_docker_socket.listContainers(all, data => {
let docker_containers = {};
// let cmd = "curl --unix-socket /var/run/docker.sock http:/containers/json" + (all ? "?all=1" : "");
// exec(cmd, function (error, stdout) {
// if (!error) {
try {
// let jsonString = stdout.toString();
// let docker_containers = JSON.parse(jsonString);
docker_containers = data;
if (docker_containers && Object.prototype.toString.call(docker_containers) === '[object Array]' && docker_containers.length > 0) {
docker_containers.forEach(function (element) {
@ -221,12 +216,7 @@ function dockerContainerStats(containerID, callback) {
}
_docker_socket.getStats(containerID, data => {
// let cmd = "curl --unix-socket /var/run/docker.sock http:/containers/" + containerID + "/stats?stream=0";
// exec(cmd, function (error, stdout) {
// if (!error) {
// let jsonString = stdout.toString();
try {
// let stats = JSON.parse(jsonString);
let stats = data;
/**
* @namespace

View File

@ -128,7 +128,9 @@ function getStaticData(callback) {
data.version = version();
Promise.all([
system(),
system.system(),
system.bios(),
system.baseboard(),
osInfo.osInfo(),
osInfo.versions(),
cpu.cpu(),
@ -139,14 +141,16 @@ function getStaticData(callback) {
filesystem.diskLayout()
]).then(res => {
data.system = res[0];
data.os = res[1];
data.versions = res[2];
data.cpu = res[3];
data.cpu.flags = res[4];
data.graphics = res[5];
data.net = res[6];
data.memLayout = res[7];
data.diskLayout = res[8];
data.bios = res[1];
data.baseboard = res[2];
data.os = res[3];
data.versions =res[4];
data.cpu = res[5];
data.cpu.flags = res[6];
data.graphics = res[7];
data.net = res[8];
data.memLayout = res[9];
data.diskLayout = res[10];
if (callback) { callback(data); }
resolve(data);
});
@ -330,7 +334,9 @@ function getAllData(srv, iface, callback) {
// ----------------------------------------------------------------------------------
exports.version = version;
exports.system = system;
exports.system = system.system;
exports.bios = system.bios;
exports.baseboard = system.baseboard;
exports.time = osInfo.time;
exports.osInfo = osInfo.osInfo;

View File

@ -9,20 +9,22 @@
// ----------------------------------------------------------------------------------
// License: MIT
// ==================================================================================
// 2. System (Hardware)
// 2. System (Hardware, BIOS, Base Board)
// ----------------------------------------------------------------------------------
const os = require('os');
const exec = require('child_process').exec;
const fs = require('fs');
const util = require('./util');
let _platform = os.type();
let _platform = process.platform;
const _linux = (_platform === 'Linux');
const _darwin = (_platform === 'Darwin');
const _windows = (_platform === 'Windows_NT');
const _linux = (_platform === 'linux');
const _darwin = (_platform === 'darwin');
const _windows = (_platform === 'win32');
const _freebsd = (_platform === 'freebsd');
const _sunos = (_platform === 'sunos');
module.exports = function (callback) {
function system(callback) {
return new Promise((resolve) => {
process.nextTick(() => {
@ -32,26 +34,25 @@ module.exports = function (callback) {
model: 'Computer',
version: '',
serial: '-',
uuid: '-'
uuid: '-',
sku: '-',
};
if (_linux) {
exec('dmidecode -t system', function (error, stdout) {
if (!error) {
let lines = stdout.toString().split('\n');
lines.forEach(function (line) {
if (line.indexOf(':') !== -1) {
if (line.toLowerCase().indexOf('manufacturer') !== -1) result.manufacturer = result.manufacturer || line.split(':')[1].trim();
if (line.toLowerCase().indexOf('product name') !== -1) result.model = line.split(':')[1].trim();
if (line.toLowerCase().indexOf('version') !== -1) result.version = result.version || line.split(':')[1].trim();
if (line.toLowerCase().indexOf('serial number') !== -1) result.serial = line.split(':')[1].trim();
if (line.toLowerCase().indexOf('uuid') !== -1) result.uuid = line.split(':')[1].trim();
}
});
result.manufacturer = util.getValue(lines, 'manufacturer');
result.model = util.getValue(lines, 'product name');
result.version = util.getValue(lines, 'version');
result.serial = util.getValue(lines, 'serial number');
result.uuid = util.getValue(lines, 'uuid');
result.sku = util.getValue(lines, 'sku number');
if (result.serial.toLowerCase().indexOf('o.e.m.') !== -1) result.serial = '-';
if (result.manufacturer.toLowerCase().indexOf('o.e.m.') !== -1) result.manufacturer = '';
if (result.model.toLowerCase().indexOf('o.e.m.') !== -1) result.model = 'Computer';
if (result.version.toLowerCase().indexOf('o.e.m.') !== -1) result.version = '-';
if (result.sku.toLowerCase().indexOf('o.e.m.') !== -1) result.sku = '-';
if (result.manufacturer === '' && result.model === 'Computer' && result.version === '-') {
// Check Raspberry Pi
@ -119,6 +120,7 @@ module.exports = function (callback) {
}
}
}
if (callback) { callback(result); }
resolve(result);
});
@ -127,7 +129,7 @@ module.exports = function (callback) {
resolve(result);
}
} else {
exec("dmesg | grep -i virtual | grep -iE 'vmware|qemu|kvm|xen'", function (error, stdout) {
exec('dmesg | grep -i virtual | grep -iE "vmware|qemu|kvm|xen"', function (error, stdout) {
if (!error) {
let lines = stdout.toString().split('\n');
if (lines.length > 0) result.model = 'Virtual machine';
@ -144,31 +146,31 @@ module.exports = function (callback) {
if (_darwin) {
exec('ioreg -c IOPlatformExpertDevice -d 2', function (error, stdout) {
if (!error) {
let lines = stdout.toString().split('\n');
lines.forEach(function (line) {
line = line.replace(/[<>"]/g, '');
if (line.indexOf('=') !== -1) {
if (line.toLowerCase().indexOf('manufacturer') !== -1) result.manufacturer = line.split('=')[1].trim();
if (line.toLowerCase().indexOf('model') !== -1) result.model = line.split('=')[1].trim();
if (line.toLowerCase().indexOf('version') !== -1) result.version = line.split('=')[1].trim();
if (line.toLowerCase().indexOf('ioplatformserialnumber') !== -1) result.serial = line.split('=')[1].trim();
if (line.toLowerCase().indexOf('ioplatformuuid') !== -1) result.uuid = line.split('=')[1].trim();
}
});
let lines = stdout.toString().replace(/[<>"]/g, '').split('\n');
result.manufacturer = util.getValue(lines, 'manufacturer', '=', true);
result.model = util.getValue(lines, 'model', '=', true);
result.version = util.getValue(lines, 'version', '=', true);
result.serial = util.getValue(lines, 'ioplatformserialnumber', '=', true);
result.uuid = util.getValue(lines, 'ioplatformuuid', '=', true);
result.sku = util.getValue(lines, 'board-id', '=', true);
}
if (callback) { callback(result); }
resolve(result);
});
}
if (_windows) {
exec('wmic csproduct get', function (error, stdout) {
// exec('wmic csproduct get', function (error, stdout) {
// ToDo: refactor /value
exec('wmic csproduct get /value', function (error, stdout) {
if (!error) {
let lines = stdout.split('\r\n').filter(line => line.trim() !== '').filter((line, idx) => idx > 0)[0].trim().split(/\s\s+/);
result.manufacturer = lines[5];
result.model = lines[3];
result.version = lines[6];
result.serial = lines[2];
result.uuid = lines[4];
// let lines = stdout.split('\r\n').filter(line => line.trim() !== '').filter((line, idx) => idx > 0)[0].trim().split(/\s\s+/);
let lines = stdout.split('\r\n');
result.manufacturer = util.getValue(lines, 'vendor', '=');
result.model = util.getValue(lines, 'name', '=');
result.version = util.getValue(lines, 'version', '=');
result.serial = util.getValue(lines, 'identifyingnumber', '=');
result.uuid = util.getValue(lines, 'uuid', '=');
result.sku = util.getValue(lines, 'skunumber', '=');
}
if (callback) { callback(result); }
resolve(result);
@ -176,4 +178,151 @@ module.exports = function (callback) {
}
});
});
};
}
exports.system = system;
function bios(callback) {
return new Promise((resolve) => {
process.nextTick(() => {
let result = {
vendor: '',
version: '',
releaseDate: '',
revision: '',
};
let cmd = '';
if (_linux) {
if (process.arch === 'arm') {
cmd = 'cat /proc/cpuinfo | grep Serial';
} else {
cmd = 'dmidecode --type 0';
}
exec(cmd, function (error, stdout) {
if (!error) {
let lines = stdout.toString().split('\n');
result.vendor = util.getValue(lines, 'Vendor');
result.version = util.getValue(lines, 'Version');
const datetime = util.getValue(lines, 'Release Date');
result.releaseDate = datetime.date;
result.revision = util.getValue(lines, 'BIOS Revision');
}
if (callback) { callback(result); }
resolve(result);
});
}
if (_darwin) {
result.vendor = 'Apple Inc.';
if (callback) { callback(result); }
resolve(result);
}
if (_windows) {
// ToDo: check BIOS windows
exec('wmic bios get BIOSversion, BuildNumber, Caption, Description, IdentificationCode, Manufacturer, Name, ReleaseDate, Version /value', function (error, stdout) {
if (!error) {
let lines = stdout.toString().split('\r\n');
const description = util.getValue(lines, 'description', '=');
if (description.indexOf(' Version ') !== -1) {
// ... Phoenix ROM BIOS PLUS Version 1.10 A04
result.vendor = description.split(' Version ')[0].trim();
result.version = description.split(' Version ')[1].trim();
} else {
result.vendor = util.getValue(lines, 'manufacturer', '=');
result.version = util.getValue(lines, 'version', '=');
}
result.releaseDate = util.getValue(lines, 'releasedate', '=');
if (result.releaseDate.length >= 10) {
result.releaseDate = result.releaseDate.substr(0,4) + '-' + result.releaseDate.substr(4,2) + '-' + result.releaseDate.substr(6,2);
}
result.revision = util.getValue(lines, 'buildnumber', '=');
}
if (callback) { callback(result); }
resolve(result);
});
}
});
});
}
exports.bios = bios;
function baseboard(callback) {
return new Promise((resolve) => {
process.nextTick(() => {
let result = {
manufacturer: '',
model: '',
version: '',
serial: '-',
assetTag: '-',
};
let cmd = '';
if (_linux) {
if (process.arch === 'arm') {
cmd = 'cat /proc/cpuinfo | grep Serial';
// 'BCM2709', 'BCM2835', 'BCM2708' -->
} else {
cmd = 'dmidecode -t 2';
}
exec(cmd, function (error, stdout) {
if (!error) {
let lines = stdout.toString().split('\n');
result.manufacturer = util.getValue(lines, 'Manufacturer');
result.model = util.getValue(lines, 'Product Name');
result.version = util.getValue(lines, 'Version');
result.serial = util.getValue(lines, 'Serial Number');
result.assetTag = util.getValue(lines, 'Asset Tag');
if (result.serial.toLowerCase().indexOf('o.e.m.') !== -1) result.serial = '-';
if (result.assetTag.toLowerCase().indexOf('o.e.m.') !== -1) result.assetTag = '-';
}
if (callback) { callback(result); }
resolve(result);
});
}
if (_darwin) {
exec('ioreg -c IOPlatformExpertDevice -d 2', function (error, stdout) {
if (!error) {
let lines = stdout.toString().replace(/[<>"]/g, '').split('\n');
result.manufacturer = util.getValue(lines, 'manufacturer', '=', true);
result.model = util.getValue(lines, 'model', '=', true);
result.version = util.getValue(lines, 'version', '=', true);
result.serial = util.getValue(lines, 'ioplatformserialnumber', '=', true);
result.assetTag = util.getValue(lines, 'board-id', '=', true);
}
if (callback) { callback(result); }
resolve(result);
});
}
if (_windows) {
// ToDo: check BIOS windows
exec('wmic baseboard get manufacturer, model, partnumber, product, serialnumber, sku, version /value', function (error, stdout) {
if (!error) {
let lines = stdout.toString().split('\r\n');
result.manufacturer = util.getValue(lines, 'manufacturer', '=');
result.model = util.getValue(lines, 'model', '=');
result.version = util.getValue(lines, 'version', '=');
result.serial = util.getValue(lines, 'serialnumber', '=');
result.assetTag = util.getValue(lines, 'partnumber', '=');
}
if (callback) { callback(result); }
resolve(result);
});
}
});
});
}
exports.baseboard = baseboard;

View File

@ -14,6 +14,7 @@
const os = require('os');
const exec = require('child_process').exec;
const util = require('./util');
let _platform = os.type();
@ -134,41 +135,6 @@ function parseUsersDarwin(lines) {
function parseUsersWin(lines) {
function parseDateTime(dt) {
const result = {
date: '',
time: ''
};
const parts = dt.split(' ');
if (parts[0]) {
if (parts[0].indexOf('/') >= 0) {
// Dateformat: mm/dd/yyyy
const dtparts = parts[0].split('/');
if (dtparts.length === 3) {
result.date = dtparts[2] + '-' + ('0' + dtparts[0]).substr(-2) + '-' + ('0' + dtparts[1]).substr(-2);
}
}
if (parts[0].indexOf('.') >= 0) {
// Dateformat: dd.mm.yyyy
const dtparts = parts[0].split('.');
if (dtparts.length === 3) {
result.date = dtparts[2] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[0]).substr(-2);
}
}
if (parts[0].indexOf('-') >= 0) {
// Dateformat: yyyy-mm-dd
const dtparts = parts[0].split('-');
if (dtparts.length === 3) {
result.date = dtparts[0] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[2]).substr(-2);
}
}
}
if (parts[1]) {
result.time = parts[1];
}
return result;
}
let result = [];
const header = lines[0];
const headerDelimiter = [];
@ -191,7 +157,7 @@ function parseUsersWin(lines) {
if (lines[i].trim()) {
const user = lines[i].substring(headerDelimiter[0]+1, headerDelimiter[1]).trim() || '';
const tty = lines[i].substring(headerDelimiter[1]+1, headerDelimiter[2] - 2).trim() || '';
const dateTime = parseDateTime(lines[i].substring(headerDelimiter[5]+1, 2000).trim()) || '';
const dateTime = util.parseDateTime(lines[i].substring(headerDelimiter[5]+1, 2000).trim()) || '';
result.push({
user: user,
tty: tty,

View File

@ -86,9 +86,45 @@ function decodeEscapeSequence(str, base) {
});
}
function parseDateTime(dt) {
const result = {
date: '',
time: ''
};
const parts = dt.split(' ');
if (parts[0]) {
if (parts[0].indexOf('/') >= 0) {
// Dateformat: mm/dd/yyyy
const dtparts = parts[0].split('/');
if (dtparts.length === 3) {
result.date = dtparts[2] + '-' + ('0' + dtparts[0]).substr(-2) + '-' + ('0' + dtparts[1]).substr(-2);
}
}
if (parts[0].indexOf('.') >= 0) {
// Dateformat: dd.mm.yyyy
const dtparts = parts[0].split('.');
if (dtparts.length === 3) {
result.date = dtparts[2] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[0]).substr(-2);
}
}
if (parts[0].indexOf('-') >= 0) {
// Dateformat: yyyy-mm-dd
const dtparts = parts[0].split('-');
if (dtparts.length === 3) {
result.date = dtparts[0] + '-' + ('0' + dtparts[1]).substr(-2) + '-' + ('0' + dtparts[2]).substr(-2);
}
}
}
if (parts[1]) {
result.time = parts[1];
}
return result;
}
exports.isFunction = isFunction;
exports.unique = unique;
exports.sortByKey= sortByKey;
exports.cores = cores;
exports.getValue = getValue;
exports.decodeEscapeSequence = decodeEscapeSequence;
exports.parseDateTime = parseDateTime;