added bios and main board information
This commit is contained in:
parent
a1ee65e19c
commit
68c5fd91ce
@ -11,7 +11,7 @@ end_of_line = lf
|
|||||||
indent_style = space
|
indent_style = space
|
||||||
indent_size = 2
|
indent_size = 2
|
||||||
insert_final_newline = true
|
insert_final_newline = true
|
||||||
trim_trailing_whitespace = true
|
# trim_trailing_whitespace = true
|
||||||
|
|
||||||
[*.md]
|
[*.md]
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|||||||
@ -38,7 +38,7 @@ New Functions
|
|||||||
|
|
||||||
Bug Fixes / improvements
|
Bug Fixes / improvements
|
||||||
|
|
||||||
- improvement `cpuTemperature` - works now also on Raspberry Pi
|
- improvement `cpuTemperature` - works now also on Raspberry Pi
|
||||||
- bugfix `disksIO` - on OSX read and write got mixed up
|
- bugfix `disksIO` - on OSX read and write got mixed up
|
||||||
- several bug fixes (like assess errors in `cpuCurrentspeed`, potentially incorrect results in `users`, ...)
|
- several bug fixes (like assess errors in `cpuCurrentspeed`, potentially incorrect results in `users`, ...)
|
||||||
- testet on even more platforms and linux distributions
|
- testet on even more platforms and linux distributions
|
||||||
@ -99,6 +99,7 @@ Other changes
|
|||||||
|
|
||||||
| Version | Date | Comment |
|
| 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.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.3 | 2017-11-02 | code cleanup, AMD cpu base frequencies table |
|
||||||
| 3.32.2 | 2017-11-01 | bugfix JSON.parse error `blockDevices()` |
|
| 3.32.2 | 2017-11-01 | bugfix JSON.parse error `blockDevices()` |
|
||||||
|
|||||||
48
README.md
48
README.md
@ -52,14 +52,14 @@ async function cpu() {
|
|||||||
|
|
||||||
### Latest Activity
|
### Latest Activity
|
||||||
|
|
||||||
(last 7 major and minor version releases)
|
(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.32.0: extended `memLayout()` - added manufacturer
|
||||||
- Version 3.31.0: extended windows support `cpuFlags()` (partially)
|
- Version 3.31.0: extended windows support `cpuFlags()` (partially)
|
||||||
- Version 3.30.0: extended `versions()` (added `yarn`, `gulp`, `grunt`, `tsc`, `git`)
|
- Version 3.30.0: extended `versions()` (added `yarn`, `gulp`, `grunt`, `tsc`, `git`)
|
||||||
- Version 3.29.0: extended windows support `services()`
|
- Version 3.29.0: extended windows support `services()`
|
||||||
- Version 3.28.0: extended windows support `processes()`
|
- 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.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]
|
You can find all changes here: [detailed changelog][changelog-url]
|
||||||
@ -103,8 +103,20 @@ I also created a nice little command line tool called [mmon][mmon-github-url] (
|
|||||||
| | version | X | X | X | version e.g. '1.0' |
|
| | version | X | X | X | version e.g. '1.0' |
|
||||||
| | serial | X | X | X | serial number |
|
| | serial | X | X | X | serial number |
|
||||||
| | uuid | X | X | X | UUID |
|
| | 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
|
#### 3. CPU, Memory, Disks, Battery, Graphics
|
||||||
|
|
||||||
| Function | Result object | Linux | OSX | Win | Comments |
|
| Function | Result object | Linux | OSX | Win | Comments |
|
||||||
| --------------- | ----- | ----- | ---- | ------- | -------- |
|
| --------------- | ----- | ----- | ---- | ------- | -------- |
|
||||||
@ -298,7 +310,7 @@ I also created a nice little command line tool called [mmon][mmon-github-url] (
|
|||||||
| | ms | X | X | X | response time in ms |
|
| | ms | X | X | X | response time in ms |
|
||||||
| si.inetLatency(host, cb) | : number | X | X | X | response-time (ms) to external resource<br>host parameter is optional (default 8.8.8.8)|
|
| si.inetLatency(host, cb) | : number | X | X | X | response-time (ms) to external resource<br>host parameter is optional (default 8.8.8.8)|
|
||||||
|
|
||||||
#### 7. Current Load, Processes & Services
|
#### 7. Current Load, Processes & Services
|
||||||
|
|
||||||
| Function | Result object | Linux | OSX | Win | Comments |
|
| Function | Result object | Linux | OSX | Win | Comments |
|
||||||
| --------------- | ----- | ----- | ---- | ------- | -------- |
|
| --------------- | ----- | ----- | ---- | ------- | -------- |
|
||||||
@ -346,7 +358,7 @@ I also created a nice little command line tool called [mmon][mmon-github-url] (
|
|||||||
| | [0].pcpu | X | X | | process % CPU |
|
| | [0].pcpu | X | X | | process % CPU |
|
||||||
| | [0].pmem | X | X | | process % MEM |
|
| | [0].pmem | X | X | | process % MEM |
|
||||||
|
|
||||||
#### 8. Docker
|
#### 8. Docker
|
||||||
|
|
||||||
| Function | Result object | Linux | OSX | Win | Comments |
|
| Function | Result object | Linux | OSX | Win | Comments |
|
||||||
| --------------- | ----- | ----- | ---- | ------- | -------- |
|
| --------------- | ----- | ----- | ---- | ------- | -------- |
|
||||||
@ -467,31 +479,31 @@ async function network() {
|
|||||||
|
|
||||||
## Known Issues
|
## Known Issues
|
||||||
|
|
||||||
#### OSX - Temperature Sensor
|
#### OSX - Temperature Sensor
|
||||||
|
|
||||||
To be able to measure temperature on OSX I created a litte additional package. Due to some difficulties
|
|
||||||
in NPM with `optionalDependencies` I unfortunately was getting unexpected warnings on other platforms.
|
|
||||||
So I decided to drop this optional dependencies for OSX - so by default, you will not get correct values.
|
|
||||||
|
|
||||||
But if you need to detect OSX temperature just run the following additional
|
To be able to measure temperature on OSX I created a litte additional package. Due to some difficulties
|
||||||
|
in NPM with `optionalDependencies` I unfortunately was getting unexpected warnings on other platforms.
|
||||||
|
So I decided to drop this optional dependencies for OSX - so by default, you will not get correct values.
|
||||||
|
|
||||||
|
But if you need to detect OSX temperature just run the following additional
|
||||||
installation command:
|
installation command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ npm install osx-temperature-sensor --save
|
$ npm install osx-temperature-sensor --save
|
||||||
```
|
```
|
||||||
|
|
||||||
`systeminformation` will then detect this additional library and return the temperature when calling systeminformations standard function `cpuTemperature()`
|
`systeminformation` will then detect this additional library and return the temperature when calling systeminformations standard function `cpuTemperature()`
|
||||||
|
|
||||||
#### Windows Temperature, Battery, ...
|
#### Windows Temperature, Battery, ...
|
||||||
|
|
||||||
`wmic` - which is used to determine temperature and battery sometimes needs to be run with admin
|
`wmic` - which is used to determine temperature and battery sometimes needs to be run with admin
|
||||||
privileges. So if you do not get any values, try to run it again with according
|
privileges. So if you do not get any values, try to run it again with according
|
||||||
privileges. If you still do not get any values, your system might not support this feature.
|
privileges. If you still do not get any values, your system might not support this feature.
|
||||||
In some cases we also discovered that `wmic` returned incorrect temperature values.
|
In some cases we also discovered that `wmic` returned incorrect temperature values.
|
||||||
|
|
||||||
#### Linux Temperature
|
#### Linux Temperature
|
||||||
|
|
||||||
In some cases you need to install the linux `sensors` package to be able to measure temperature
|
In some cases you need to install the linux `sensors` package to be able to measure temperature
|
||||||
e.g. on DEBIAN based systems by running `sudo apt-get install lm-sensors`
|
e.g. on DEBIAN based systems by running `sudo apt-get install lm-sensors`
|
||||||
|
|
||||||
#### *: Additional Notes
|
#### *: Additional Notes
|
||||||
@ -532,7 +544,7 @@ Written by Sebastian Hildebrandt [sebhildebrandt](https://github.com/sebhildebra
|
|||||||
- Adam Reis [adamreisnz](https://github.com/adamreisnz)
|
- Adam Reis [adamreisnz](https://github.com/adamreisnz)
|
||||||
|
|
||||||
OSX Temperature: Credits here are going to:
|
OSX Temperature: Credits here are going to:
|
||||||
|
|
||||||
- Massimiliano Marcon [mmarcon](https://github.com/mmarcon) for his work on [smc-code][smc-code-url]
|
- Massimiliano Marcon [mmarcon](https://github.com/mmarcon) for his work on [smc-code][smc-code-url]
|
||||||
- Sébastien Lavoie [lavoiesl](https://github.com/lavoiesl) for his work on [osx-cpu-temp][osx-cpu-temp-url] code.
|
- Sébastien Lavoie [lavoiesl](https://github.com/lavoiesl) for his work on [osx-cpu-temp][osx-cpu-temp-url] code.
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,9 @@
|
|||||||
|
### Issue Type
|
||||||
|
|
||||||
|
* [ ] Bug
|
||||||
|
* [ ] Feature Request
|
||||||
|
* [ ] Question
|
||||||
|
|
||||||
### Expected behavior
|
### Expected behavior
|
||||||
|
|
||||||
-
|
-
|
||||||
|
|||||||
14
lib/cpu.js
14
lib/cpu.js
@ -17,11 +17,13 @@ const exec = require('child_process').exec;
|
|||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const util = require('./util');
|
const util = require('./util');
|
||||||
|
|
||||||
let _platform = os.type();
|
let _platform = process.platform;
|
||||||
|
|
||||||
const _linux = (_platform === 'Linux');
|
const _linux = (_platform === 'linux');
|
||||||
const _darwin = (_platform === 'Darwin');
|
const _darwin = (_platform === 'darwin');
|
||||||
const _windows = (_platform === 'Windows_NT');
|
const _windows = (_platform === 'win32');
|
||||||
|
const _freebsd = (_platform === 'freebsd');
|
||||||
|
const _sunos = (_platform === 'sunos');
|
||||||
|
|
||||||
let _cpu_speed = '0.00';
|
let _cpu_speed = '0.00';
|
||||||
let _current_cpu = {
|
let _current_cpu = {
|
||||||
@ -199,7 +201,7 @@ function getCpu() {
|
|||||||
result.speed = modelline.split('@')[1] ? parseFloat(modelline.split('@')[1].trim()).toFixed(2) : '0.00';
|
result.speed = modelline.split('@')[1] ? parseFloat(modelline.split('@')[1].trim()).toFixed(2) : '0.00';
|
||||||
if (result.speed === '0.00' && result.brand.indexOf('AMD') > -1) {
|
if (result.speed === '0.00' && result.brand.indexOf('AMD') > -1) {
|
||||||
result.speed = getAMDSpeed(result.brand);
|
result.speed = getAMDSpeed(result.brand);
|
||||||
}
|
}
|
||||||
if (result.speed === '0.00') {
|
if (result.speed === '0.00') {
|
||||||
let current = getCpuCurrentSpeedSync();
|
let current = getCpuCurrentSpeedSync();
|
||||||
if (current !== '0.00') result.speed = current;
|
if (current !== '0.00') result.speed = current;
|
||||||
@ -258,7 +260,7 @@ function getCpu() {
|
|||||||
result.speedmax = result.speedmax ? parseFloat(result.speedmax).toFixed(2) : '';
|
result.speedmax = result.speedmax ? parseFloat(result.speedmax).toFixed(2) : '';
|
||||||
if (!result.speed && result.brand.indexOf('AMD') > -1) {
|
if (!result.speed && result.brand.indexOf('AMD') > -1) {
|
||||||
result.speed = getAMDSpeed(result.brand);
|
result.speed = getAMDSpeed(result.brand);
|
||||||
}
|
}
|
||||||
if (!result.speed) {
|
if (!result.speed) {
|
||||||
result.speed = result.speedmax;
|
result.speed = result.speedmax;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,12 +51,7 @@ function dockerContainers(all, callback) {
|
|||||||
|
|
||||||
_docker_socket.listContainers(all, data => {
|
_docker_socket.listContainers(all, data => {
|
||||||
let docker_containers = {};
|
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 {
|
try {
|
||||||
// let jsonString = stdout.toString();
|
|
||||||
// let docker_containers = JSON.parse(jsonString);
|
|
||||||
docker_containers = data;
|
docker_containers = data;
|
||||||
if (docker_containers && Object.prototype.toString.call(docker_containers) === '[object Array]' && docker_containers.length > 0) {
|
if (docker_containers && Object.prototype.toString.call(docker_containers) === '[object Array]' && docker_containers.length > 0) {
|
||||||
docker_containers.forEach(function (element) {
|
docker_containers.forEach(function (element) {
|
||||||
@ -221,12 +216,7 @@ function dockerContainerStats(containerID, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_docker_socket.getStats(containerID, data => {
|
_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 {
|
try {
|
||||||
// let stats = JSON.parse(jsonString);
|
|
||||||
let stats = data;
|
let stats = data;
|
||||||
/**
|
/**
|
||||||
* @namespace
|
* @namespace
|
||||||
|
|||||||
26
lib/index.js
26
lib/index.js
@ -128,7 +128,9 @@ function getStaticData(callback) {
|
|||||||
data.version = version();
|
data.version = version();
|
||||||
|
|
||||||
Promise.all([
|
Promise.all([
|
||||||
system(),
|
system.system(),
|
||||||
|
system.bios(),
|
||||||
|
system.baseboard(),
|
||||||
osInfo.osInfo(),
|
osInfo.osInfo(),
|
||||||
osInfo.versions(),
|
osInfo.versions(),
|
||||||
cpu.cpu(),
|
cpu.cpu(),
|
||||||
@ -139,14 +141,16 @@ function getStaticData(callback) {
|
|||||||
filesystem.diskLayout()
|
filesystem.diskLayout()
|
||||||
]).then(res => {
|
]).then(res => {
|
||||||
data.system = res[0];
|
data.system = res[0];
|
||||||
data.os = res[1];
|
data.bios = res[1];
|
||||||
data.versions = res[2];
|
data.baseboard = res[2];
|
||||||
data.cpu = res[3];
|
data.os = res[3];
|
||||||
data.cpu.flags = res[4];
|
data.versions =res[4];
|
||||||
data.graphics = res[5];
|
data.cpu = res[5];
|
||||||
data.net = res[6];
|
data.cpu.flags = res[6];
|
||||||
data.memLayout = res[7];
|
data.graphics = res[7];
|
||||||
data.diskLayout = res[8];
|
data.net = res[8];
|
||||||
|
data.memLayout = res[9];
|
||||||
|
data.diskLayout = res[10];
|
||||||
if (callback) { callback(data); }
|
if (callback) { callback(data); }
|
||||||
resolve(data);
|
resolve(data);
|
||||||
});
|
});
|
||||||
@ -330,7 +334,9 @@ function getAllData(srv, iface, callback) {
|
|||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
exports.version = version;
|
exports.version = version;
|
||||||
exports.system = system;
|
exports.system = system.system;
|
||||||
|
exports.bios = system.bios;
|
||||||
|
exports.baseboard = system.baseboard;
|
||||||
|
|
||||||
exports.time = osInfo.time;
|
exports.time = osInfo.time;
|
||||||
exports.osInfo = osInfo.osInfo;
|
exports.osInfo = osInfo.osInfo;
|
||||||
|
|||||||
227
lib/system.js
227
lib/system.js
@ -9,20 +9,22 @@
|
|||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
// License: MIT
|
// License: MIT
|
||||||
// ==================================================================================
|
// ==================================================================================
|
||||||
// 2. System (Hardware)
|
// 2. System (Hardware, BIOS, Base Board)
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
const os = require('os');
|
|
||||||
const exec = require('child_process').exec;
|
const exec = require('child_process').exec;
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
const util = require('./util');
|
||||||
|
|
||||||
let _platform = os.type();
|
let _platform = process.platform;
|
||||||
|
|
||||||
const _linux = (_platform === 'Linux');
|
const _linux = (_platform === 'linux');
|
||||||
const _darwin = (_platform === 'Darwin');
|
const _darwin = (_platform === 'darwin');
|
||||||
const _windows = (_platform === 'Windows_NT');
|
const _windows = (_platform === 'win32');
|
||||||
|
const _freebsd = (_platform === 'freebsd');
|
||||||
|
const _sunos = (_platform === 'sunos');
|
||||||
|
|
||||||
module.exports = function (callback) {
|
function system(callback) {
|
||||||
|
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
process.nextTick(() => {
|
process.nextTick(() => {
|
||||||
@ -32,27 +34,26 @@ module.exports = function (callback) {
|
|||||||
model: 'Computer',
|
model: 'Computer',
|
||||||
version: '',
|
version: '',
|
||||||
serial: '-',
|
serial: '-',
|
||||||
uuid: '-'
|
uuid: '-',
|
||||||
|
sku: '-',
|
||||||
};
|
};
|
||||||
|
|
||||||
if (_linux) {
|
if (_linux) {
|
||||||
exec('dmidecode -t system', function (error, stdout) {
|
exec('dmidecode -t system', function (error, stdout) {
|
||||||
if (!error) {
|
if (!error) {
|
||||||
let lines = stdout.toString().split('\n');
|
let lines = stdout.toString().split('\n');
|
||||||
lines.forEach(function (line) {
|
result.manufacturer = util.getValue(lines, 'manufacturer');
|
||||||
if (line.indexOf(':') !== -1) {
|
result.model = util.getValue(lines, 'product name');
|
||||||
if (line.toLowerCase().indexOf('manufacturer') !== -1) result.manufacturer = result.manufacturer || line.split(':')[1].trim();
|
result.version = util.getValue(lines, 'version');
|
||||||
if (line.toLowerCase().indexOf('product name') !== -1) result.model = line.split(':')[1].trim();
|
result.serial = util.getValue(lines, 'serial number');
|
||||||
if (line.toLowerCase().indexOf('version') !== -1) result.version = result.version || line.split(':')[1].trim();
|
result.uuid = util.getValue(lines, 'uuid');
|
||||||
if (line.toLowerCase().indexOf('serial number') !== -1) result.serial = line.split(':')[1].trim();
|
result.sku = util.getValue(lines, 'sku number');
|
||||||
if (line.toLowerCase().indexOf('uuid') !== -1) result.uuid = line.split(':')[1].trim();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (result.serial.toLowerCase().indexOf('o.e.m.') !== -1) result.serial = '-';
|
if (result.serial.toLowerCase().indexOf('o.e.m.') !== -1) result.serial = '-';
|
||||||
if (result.manufacturer.toLowerCase().indexOf('o.e.m.') !== -1) result.manufacturer = '';
|
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.model.toLowerCase().indexOf('o.e.m.') !== -1) result.model = 'Computer';
|
||||||
if (result.version.toLowerCase().indexOf('o.e.m.') !== -1) result.version = '-';
|
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 === '-') {
|
if (result.manufacturer === '' && result.model === 'Computer' && result.version === '-') {
|
||||||
// Check Raspberry Pi
|
// Check Raspberry Pi
|
||||||
exec('grep Hardware /proc/cpuinfo; grep Serial /proc/cpuinfo; grep Revision /proc/cpuinfo', function (error, stdout) {
|
exec('grep Hardware /proc/cpuinfo; grep Serial /proc/cpuinfo; grep Revision /proc/cpuinfo', function (error, stdout) {
|
||||||
@ -64,7 +65,7 @@ module.exports = function (callback) {
|
|||||||
if (line.toLowerCase().indexOf('revision') !== -1) result.version = line.split(':')[1].trim();
|
if (line.toLowerCase().indexOf('revision') !== -1) result.version = line.split(':')[1].trim();
|
||||||
if (line.toLowerCase().indexOf('serial') !== -1) result.serial = line.split(':')[1].trim();
|
if (line.toLowerCase().indexOf('serial') !== -1) result.serial = line.split(':')[1].trim();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (result.model === 'BCM2835') { // Pi 3
|
if (result.model === 'BCM2835') { // Pi 3
|
||||||
result.manufacturer = 'Raspberry Pi Foundation';
|
result.manufacturer = 'Raspberry Pi Foundation';
|
||||||
result.model = result.model + ' - Pi 3 Model B';
|
result.model = result.model + ' - Pi 3 Model B';
|
||||||
@ -119,6 +120,7 @@ module.exports = function (callback) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (callback) { callback(result); }
|
if (callback) { callback(result); }
|
||||||
resolve(result);
|
resolve(result);
|
||||||
});
|
});
|
||||||
@ -127,7 +129,7 @@ module.exports = function (callback) {
|
|||||||
resolve(result);
|
resolve(result);
|
||||||
}
|
}
|
||||||
} else {
|
} 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) {
|
if (!error) {
|
||||||
let lines = stdout.toString().split('\n');
|
let lines = stdout.toString().split('\n');
|
||||||
if (lines.length > 0) result.model = 'Virtual machine';
|
if (lines.length > 0) result.model = 'Virtual machine';
|
||||||
@ -144,31 +146,31 @@ module.exports = function (callback) {
|
|||||||
if (_darwin) {
|
if (_darwin) {
|
||||||
exec('ioreg -c IOPlatformExpertDevice -d 2', function (error, stdout) {
|
exec('ioreg -c IOPlatformExpertDevice -d 2', function (error, stdout) {
|
||||||
if (!error) {
|
if (!error) {
|
||||||
let lines = stdout.toString().split('\n');
|
let lines = stdout.toString().replace(/[<>"]/g, '').split('\n');
|
||||||
lines.forEach(function (line) {
|
result.manufacturer = util.getValue(lines, 'manufacturer', '=', true);
|
||||||
line = line.replace(/[<>"]/g, '');
|
result.model = util.getValue(lines, 'model', '=', true);
|
||||||
if (line.indexOf('=') !== -1) {
|
result.version = util.getValue(lines, 'version', '=', true);
|
||||||
if (line.toLowerCase().indexOf('manufacturer') !== -1) result.manufacturer = line.split('=')[1].trim();
|
result.serial = util.getValue(lines, 'ioplatformserialnumber', '=', true);
|
||||||
if (line.toLowerCase().indexOf('model') !== -1) result.model = line.split('=')[1].trim();
|
result.uuid = util.getValue(lines, 'ioplatformuuid', '=', true);
|
||||||
if (line.toLowerCase().indexOf('version') !== -1) result.version = line.split('=')[1].trim();
|
result.sku = util.getValue(lines, 'board-id', '=', true);
|
||||||
if (line.toLowerCase().indexOf('ioplatformserialnumber') !== -1) result.serial = line.split('=')[1].trim();
|
|
||||||
if (line.toLowerCase().indexOf('ioplatformuuid') !== -1) result.uuid = line.split('=')[1].trim();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
if (callback) { callback(result); }
|
if (callback) { callback(result); }
|
||||||
resolve(result);
|
resolve(result);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (_windows) {
|
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) {
|
if (!error) {
|
||||||
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').filter(line => line.trim() !== '').filter((line, idx) => idx > 0)[0].trim().split(/\s\s+/);
|
||||||
result.manufacturer = lines[5];
|
let lines = stdout.split('\r\n');
|
||||||
result.model = lines[3];
|
result.manufacturer = util.getValue(lines, 'vendor', '=');
|
||||||
result.version = lines[6];
|
result.model = util.getValue(lines, 'name', '=');
|
||||||
result.serial = lines[2];
|
result.version = util.getValue(lines, 'version', '=');
|
||||||
result.uuid = lines[4];
|
result.serial = util.getValue(lines, 'identifyingnumber', '=');
|
||||||
|
result.uuid = util.getValue(lines, 'uuid', '=');
|
||||||
|
result.sku = util.getValue(lines, 'skunumber', '=');
|
||||||
}
|
}
|
||||||
if (callback) { callback(result); }
|
if (callback) { callback(result); }
|
||||||
resolve(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;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
38
lib/users.js
38
lib/users.js
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
const exec = require('child_process').exec;
|
const exec = require('child_process').exec;
|
||||||
|
const util = require('./util');
|
||||||
|
|
||||||
let _platform = os.type();
|
let _platform = os.type();
|
||||||
|
|
||||||
@ -134,41 +135,6 @@ function parseUsersDarwin(lines) {
|
|||||||
|
|
||||||
function parseUsersWin(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 = [];
|
let result = [];
|
||||||
const header = lines[0];
|
const header = lines[0];
|
||||||
const headerDelimiter = [];
|
const headerDelimiter = [];
|
||||||
@ -191,7 +157,7 @@ function parseUsersWin(lines) {
|
|||||||
if (lines[i].trim()) {
|
if (lines[i].trim()) {
|
||||||
const user = lines[i].substring(headerDelimiter[0]+1, headerDelimiter[1]).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 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({
|
result.push({
|
||||||
user: user,
|
user: user,
|
||||||
tty: tty,
|
tty: tty,
|
||||||
|
|||||||
36
lib/util.js
36
lib/util.js
@ -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.isFunction = isFunction;
|
||||||
exports.unique = unique;
|
exports.unique = unique;
|
||||||
exports.sortByKey= sortByKey;
|
exports.sortByKey= sortByKey;
|
||||||
exports.cores = cores;
|
exports.cores = cores;
|
||||||
exports.getValue = getValue;
|
exports.getValue = getValue;
|
||||||
exports.decodeEscapeSequence = decodeEscapeSequence;
|
exports.decodeEscapeSequence = decodeEscapeSequence;
|
||||||
|
exports.parseDateTime = parseDateTime;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user