diff --git a/README.md b/README.md index 0942742..55f82f8 100644 --- a/README.md +++ b/README.md @@ -200,6 +200,8 @@ I also created a nice little command line tool called [mmon][mmon-github-url] (m | | stepping | X | X | X | X | | processor stepping | | | revision | X | | X | X | | revision | | | voltage | | X | | | | voltage | +| | flags | X | X | X | X | | CPU flags | +| | virtualization | X | X | X | X | | virtualization supported | | | cache | X | X | X | X | | cache in bytes (object) | | | cache.l1d | X | X | X | X | | L1D (data) size | | | cache.l1i | X | X | X | X | | L1I (instruction) size | @@ -324,6 +326,7 @@ I also created a nice little command line tool called [mmon][mmon-github-url] (m | | uefi | X | X | X | X | | OS started via UEFI | | si.uuid(cb) | {...} | X | X | X | X | X | object of several UUIDs | | | os | X | X | X | X | | os specific UUID | +| | hardware | X | X | X | X | | hardware specific UUID | | si.versions(apps, cb) | {...} | X | X | X | X | X | version information (kernel, ssl, node, ...)
apps param is optional for detecting
only specific apps/libs
(string, comma separated) | | si.shell(cb) | : string | X | X | X | | | standard shell | | si.users(cb) | [{...}] | X | X | X | X | X | array of users online | diff --git a/docs/cpu.html b/docs/cpu.html index 25e7745..ef8ae0b 100644 --- a/docs/cpu.html +++ b/docs/cpu.html @@ -255,6 +255,26 @@ voltage + + + flags + X + X + X + X + + CPU flags + + + + virtualization + X + X + X + X + + supports virtualization + cache @@ -329,8 +349,9 @@ si.cpu().then(data => console.log(data)); physicalCores: 8, processors: 1, socket: 'LGA1151', - cache: { l1d: 262144, l1i: 262144, l2: 2, l3: 16 }, - flags: 'fpu vme de pse ...' + flags: 'fpu vme de pse ...', + virtualization: true, + cache: { l1d: 262144, l1i: 262144, l2: 2, l3: 16 } } @@ -598,4 +619,4 @@ si.cpuTemperature().then(data => console.log(data)); - + \ No newline at end of file diff --git a/docs/os.html b/docs/os.html index cfadc0c..11cf4f9 100644 --- a/docs/os.html +++ b/docs/os.html @@ -259,6 +259,16 @@ si.osInfo().then(data => console.log(data)); os specific UUID + + + hardware + X + X + X + X + + hardware specific UUID + si.shell(cb) : string diff --git a/lib/index.d.ts b/lib/index.d.ts index 1a3658d..d48b44f 100644 --- a/lib/index.d.ts +++ b/lib/index.d.ts @@ -315,6 +315,7 @@ export namespace Systeminformation { interface UuidData { os: string; + hardware: string; } interface VersionData { diff --git a/lib/internet.js b/lib/internet.js index 0191852..9cfba16 100644 --- a/lib/internet.js +++ b/lib/internet.js @@ -14,6 +14,7 @@ // ---------------------------------------------------------------------------------- const exec = require('child_process').exec; +const execFile = require('child_process').execFile; const util = require('./util'); let _platform = process.platform; @@ -125,23 +126,23 @@ function inetLatency(host, callback) { } host = host || '8.8.8.8'; - const hostSanitized = util.isPrototypePolluted() ? '8.8.8.8' : util.sanitizeShellString(host); + const hostSanitized = (util.isPrototypePolluted() ? '8.8.8.8' : util.sanitizeShellString(host)).trim(); return new Promise((resolve) => { process.nextTick(() => { - let cmd; + let params; if (_linux || _freebsd || _openbsd || _netbsd || _darwin) { if (_linux) { - cmd = 'ping -c 2 -w 3 ' + hostSanitized + ' | grep rtt'; + params = '-c 2 -w 3 ' + hostSanitized + ' | grep rtt'; } if (_freebsd || _openbsd || _netbsd) { - cmd = 'ping -c 2 -t 3 ' + hostSanitized + ' | grep round-trip'; + params = '-c 2 -t 3 ' + hostSanitized + ' | grep round-trip'; } if (_darwin) { - cmd = 'ping -c 2 -t 3 ' + hostSanitized + ' | grep avg'; + params = '-c 2 -t 3 ' + hostSanitized + ' | grep avg'; } - exec(cmd, function (error, stdout) { + execFile('ping', params.split(' '), function (error, stdout) { let result = null; if (!error) { const line = stdout.toString().split('='); @@ -157,7 +158,8 @@ function inetLatency(host, callback) { }); } if (_sunos) { - exec('ping -s -a ' + hostSanitized + ' 56 2 | grep avg', { timeout: 3000 }, function (error, stdout) { + const params = '-s -a ' + hostSanitized + ' 56 2 | grep avg'; + execFile('ping', params.split(' '), { timeout: 3000 }, function (error, stdout) { let result = null; if (!error) { const line = stdout.toString().split('='); @@ -175,7 +177,8 @@ function inetLatency(host, callback) { if (_windows) { let result = null; try { - exec('ping ' + hostSanitized + ' -n 1', util.execOptsWin, function (error, stdout) { + const params = hostSanitized + ' -n 1'; + execFile('ping', params.split(' '), util.execOptsWin, function (error, stdout) { if (!error) { let lines = stdout.toString().split('\r\n'); lines.shift(); diff --git a/lib/osinfo.js b/lib/osinfo.js index 1fa1d7d..658be84 100644 --- a/lib/osinfo.js +++ b/lib/osinfo.js @@ -957,7 +957,8 @@ function uuid(callback) { process.nextTick(() => { let result = { - os: '' + os: '', + hardware: '' }; let parts; @@ -984,10 +985,13 @@ function uuid(callback) { }); } if (_linux) { - exec('( cat /var/lib/dbus/machine-id /etc/machine-id 2> /dev/null || hostname ) | head -n 1 || :', function (error, stdout) { - if (!error) { - result.os = stdout.toString().split('\n')[0].trim().toLowerCase(); - } + const cmd = `echo -n "os: "; cat /var/lib/dbus/machine-id 2> /dev/null; echo; +echo -n "os: "; cat /etc/machine-id 2> /dev/null; echo; +echo -n "machine: "; cat /sys/class/dmi/id/product_uuid 2> /dev/null; echo;`; + exec(cmd, function (error, stdout) { + const lines = stdout.toString.split('\n'); + result.os = util.getValue(lines, 'os').toLowerCase(); + result.hardware = util.getValue(lines, 'hardware').toLowerCase(); if (callback) { callback(result); } @@ -995,10 +999,14 @@ function uuid(callback) { }); } if (_freebsd || _openbsd || _netbsd) { - exec('kenv -q smbios.system.uuid', function (error, stdout) { - if (!error) { - result.os = stdout.toString().split('\n')[0].trim().toLowerCase(); - } + const cmd = `echo -n "os: "; sysctl -n kern.hostid; echo; +echo -n "hardware: "; sysctl -n kern.hostuuid; echo;`; + exec(cmd, function (error, stdout) { + const lines = stdout.toString.split('\n'); + result.os = util.getValue(lines, 'os').toLowerCase(); + result.hardware = util.getValue(lines, 'hardware').toLowerCase(); + if (result.os.indexOf('unknown') >= 0) { result.os = ''; } + if (result.hardware.indexOf('unknown') >= 0) { result.hardware = ''; } if (callback) { callback(result); } @@ -1007,14 +1015,17 @@ function uuid(callback) { } if (_windows) { exec('%windir%\\System32\\reg query "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography" /v MachineGuid', util.execOptsWin, function (error, stdout) { - if (!error) { - parts = stdout.toString().split('\n\r')[0].split('REG_SZ'); - result.os = parts.length > 1 ? parts[1].replace(/\r+|\n+|\s+/ig, '').toLowerCase() : ''; - } - if (callback) { - callback(result); - } - resolve(result); + parts = stdout.toString().split('\n\r')[0].split('REG_SZ'); + result.os = parts.length > 1 ? parts[1].replace(/\r+|\n+|\s+/ig, '').toLowerCase() : ''; + util.wmic('csproduct get /value').then((stdout) => { + // 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.hardware = util.getValue(lines, 'uuid', '=').toLowerCase(); + if (callback) { + callback(result); + } + resolve(result); + }); }); } }); diff --git a/lib/processes.js b/lib/processes.js index 128730f..cd24ddb 100644 --- a/lib/processes.js +++ b/lib/processes.js @@ -18,6 +18,8 @@ const fs = require('fs'); const path = require('path'); const exec = require('child_process').exec; const execSync = require('child_process').execSync; +const execFile = require('child_process').execFile; + const util = require('./util'); @@ -971,7 +973,8 @@ function processLoad(proc, callback) { } if (_darwin || _linux) { - exec('ps -axo pid,pcpu,pmem,comm | grep -i ' + procSanitized + ' | grep -v grep', { maxBuffer: 1024 * 20000 }, function (error, stdout) { + const params = '-axo pid,pcpu,pmem,comm | grep -i ' + procSanitized + ' | grep -v grep'; + execFile('ps', params.split(' '), { maxBuffer: 1024 * 20000 }, function (error, stdout) { if (!error) { let lines = stdout.toString().split('\n'); diff --git a/lib/system.js b/lib/system.js index 770eef9..bd50102 100644 --- a/lib/system.js +++ b/lib/system.js @@ -77,7 +77,7 @@ function system(callback) { if (!result.sku || result.sku.toLowerCase().indexOf('o.e.m.') !== -1) result.sku = '-'; // detect virtual (1) - if (result.model.toLowerCase() === 'virtualbox' || result.model.toLowerCase() === 'kvm' || result.model.toLowerCase() === 'virtual machine' || result.model.toLowerCase() === 'bochs' || result.model.toLowerCase().startsWith('vmware')) { + if (result.model.toLowerCase() === 'virtualbox' || result.model.toLowerCase() === 'kvm' || result.model.toLowerCase() === 'virtual machine' || result.model.toLowerCase() === 'bochs' || result.model.toLowerCase().startsWith('vmware') || result.model.toLowerCase().startsWith('droplet')) { result.virtual = true; switch (result.model.toLowerCase()) { case 'virtualbox': @@ -124,168 +124,165 @@ function system(callback) { if (fs.existsSync('/.dockerenv') || fs.existsSync('/.dockerinit')) { result.model = 'Docker Container'; } - if (result.manufacturer === '' && result.model === 'Computer' && result.version === '') { // still default values - exec('dmesg | grep -iE "virtual|hypervisor" | grep -iE "vmware|qemu|kvm|xen"', function (error, stdout) { - // detect virtual machines + try { + const stdout = execSync('dmesg | grep -iE "virtual|hypervisor" | grep -iE "vmware|qemu|kvm|xen"') + // detect virtual machines + let lines = stdout.toString().split('\n'); + if (lines.length > 0) { + if (result.model === 'Computer') { result.model = 'Virtual machine'; } + result.virtual = true; + if (stdout.toString().toLowerCase().indexOf('vmware') && !result.virtualHost) { + result.virtualHost = 'VMware'; + } + if (stdout.toString().toLowerCase().indexOf('qemu') && !result.virtualHost) { + result.virtualHost = 'QEMU'; + } + if (stdout.toString().toLowerCase().indexOf('xen') && !result.virtualHost) { + result.virtualHost = 'Xen'; + } + if (stdout.toString().toLowerCase().indexOf('kvm') && !result.virtualHost) { + result.virtualHost = 'KVM'; + } + } + } catch (e) { + util.noop(); + } + + if (result.manufacturer === '' && result.model === 'Computer' && result.version === '') { + // Check Raspberry Pi + fs.readFile('/proc/cpuinfo', function (error, stdout) { if (!error) { let lines = stdout.toString().split('\n'); - if (lines.length > 0) { - result.model = 'Virtual machine'; - result.virtual = true; - if (stdout.toString().toLowerCase().indexOf('vmware') && !result.virtualHost) { - result.virtualHost = 'VMware'; - } - if (stdout.toString().toLowerCase().indexOf('qemu') && !result.virtualHost) { - result.virtualHost = 'QEMU'; - } - if (stdout.toString().toLowerCase().indexOf('xen') && !result.virtualHost) { - result.virtualHost = 'Xen'; - } - if (stdout.toString().toLowerCase().indexOf('kvm') && !result.virtualHost) { - result.virtualHost = 'KVM'; - } + result.model = util.getValue(lines, 'hardware', ':', true).toUpperCase(); + result.version = util.getValue(lines, 'revision', ':', true).toLowerCase(); + result.serial = util.getValue(lines, 'serial', ':', true); + const model = util.getValue(lines, 'model:', ':', true); + // reference values: https://elinux.org/RPi_HardwareHistory + // https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md + if ((result.model === 'BCM2835' || result.model === 'BCM2708' || result.model === 'BCM2709' || result.model === 'BCM2836' || result.model === 'BCM2837') && model.toLowerCase().indexOf('raspberry') >= 0) { + const rPIRevision = util.decodePiCpuinfo(lines); + result.model = rPIRevision.model; + result.version = rPIRevision.revisionCode; + result.manufacturer = 'Raspberry Pi Foundation'; + result.raspberry = { + manufacturer: rPIRevision.manufacturer, + processor: rPIRevision.processor, + type: rPIRevision.type, + revision: rPIRevision.revision + }; } + + // if (result.model === 'BCM2835' || result.model === 'BCM2708' || result.model === 'BCM2709' || result.model === 'BCM2835' || result.model === 'BCM2837') { + + + // // Pi 4 + // if (['d03114'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 4 Model B'; + // result.version = result.version + ' - Rev. 1.4'; + // } + // if (['b03112', 'c03112'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 4 Model B'; + // result.version = result.version + ' - Rev. 1.2'; + // } + // if (['a03111', 'b03111', 'c03111'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 4 Model B'; + // result.version = result.version + ' - Rev. 1.1'; + // } + // // Pi 3 + // if (['a02082', 'a22082', 'a32082', 'a52082'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 3 Model B'; + // result.version = result.version + ' - Rev. 1.2'; + // } + // if (['a22083'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 3 Model B'; + // result.version = result.version + ' - Rev. 1.3'; + // } + // if (['a020d3'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 3 Model B+'; + // result.version = result.version + ' - Rev. 1.3'; + // } + // if (['9020e0'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 3 Model A+'; + // result.version = result.version + ' - Rev. 1.3'; + // } + // // Pi 2 Model B + // if (['a01040'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 2 Model B'; + // result.version = result.version + ' - Rev. 1.0'; + // } + // if (['a01041', 'a21041'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 2 Model B'; + // result.version = result.version + ' - Rev. 1.1'; + // } + // if (['a22042', 'a02042'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi 2 Model B'; + // result.version = result.version + ' - Rev. 1.2'; + // } + + // // Compute Model + // if (['a02100'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi CM3+'; + // result.version = result.version + ' - Rev 1.0'; + // } + // if (['a020a0', 'a220a0'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi CM3'; + // result.version = result.version + ' - Rev 1.0'; + // } + // if (['900061'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi CM'; + // result.version = result.version + ' - Rev 1.1'; + // } + + // // Pi Zero + // if (['900092', '920092'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Zero'; + // result.version = result.version + ' - Rev 1.2'; + // } + // if (['900093', '920093'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Zero'; + // result.version = result.version + ' - Rev 1.3'; + // } + // if (['9000c1'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Zero W'; + // result.version = result.version + ' - Rev 1.1'; + // } + + // // A, B, A+ B+ + // if (['0002', '0003'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Model B'; + // result.version = result.version + ' - Rev 1.0'; + // } + // if (['0004', '0005', '0006', '000d', '000e', '000f'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Model B'; + // result.version = result.version + ' - Rev 2.0'; + // } + // if (['0007', '0008', '0009'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Model A'; + // result.version = result.version + ' - Rev 2.0'; + // } + // if (['0010'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Model B+'; + // result.version = result.version + ' - Rev 1.0'; + // } + // if (['0012'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Model A+'; + // result.version = result.version + ' - Rev 1.0'; + // } + // if (['0013', '900032'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Model B+'; + // result.version = result.version + ' - Rev 1.2'; + // } + // if (['0015', '900021'].indexOf(result.version) >= 0) { + // result.model = result.model + ' - Pi Model A+'; + // result.version = result.version + ' - Rev 1.1'; + // } + // if (result.model.indexOf('Pi') !== -1 && result.version) { // Pi, Pi Zero + // result.manufacturer = 'Raspberry Pi Foundation'; + // } + // } } - if (result.manufacturer === '' && result.model === 'Computer' && result.version === '') { - // Check Raspberry Pi - fs.readFile('/proc/cpuinfo', function (error, stdout) { - if (!error) { - let lines = stdout.toString().split('\n'); - result.model = util.getValue(lines, 'hardware', ':', true).toUpperCase(); - result.version = util.getValue(lines, 'revision', ':', true).toLowerCase(); - result.serial = util.getValue(lines, 'serial', ':', true); - const model = util.getValue(lines, 'model:', ':', true); - // reference values: https://elinux.org/RPi_HardwareHistory - // https://www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/README.md - if ((result.model === 'BCM2835' || result.model === 'BCM2708' || result.model === 'BCM2709' || result.model === 'BCM2836' || result.model === 'BCM2837') && model.toLowerCase().indexOf('raspberry') >= 0) { - const rPIRevision = util.decodePiCpuinfo(lines); - result.model = rPIRevision.model; - result.version = rPIRevision.revisionCode; - result.manufacturer = 'Raspberry Pi Foundation'; - result.raspberry = { - manufacturer: rPIRevision.manufacturer, - processor: rPIRevision.processor, - type: rPIRevision.type, - revision: rPIRevision.revision - }; - } - - // if (result.model === 'BCM2835' || result.model === 'BCM2708' || result.model === 'BCM2709' || result.model === 'BCM2835' || result.model === 'BCM2837') { - - - // // Pi 4 - // if (['d03114'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 4 Model B'; - // result.version = result.version + ' - Rev. 1.4'; - // } - // if (['b03112', 'c03112'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 4 Model B'; - // result.version = result.version + ' - Rev. 1.2'; - // } - // if (['a03111', 'b03111', 'c03111'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 4 Model B'; - // result.version = result.version + ' - Rev. 1.1'; - // } - // // Pi 3 - // if (['a02082', 'a22082', 'a32082', 'a52082'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 3 Model B'; - // result.version = result.version + ' - Rev. 1.2'; - // } - // if (['a22083'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 3 Model B'; - // result.version = result.version + ' - Rev. 1.3'; - // } - // if (['a020d3'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 3 Model B+'; - // result.version = result.version + ' - Rev. 1.3'; - // } - // if (['9020e0'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 3 Model A+'; - // result.version = result.version + ' - Rev. 1.3'; - // } - // // Pi 2 Model B - // if (['a01040'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 2 Model B'; - // result.version = result.version + ' - Rev. 1.0'; - // } - // if (['a01041', 'a21041'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 2 Model B'; - // result.version = result.version + ' - Rev. 1.1'; - // } - // if (['a22042', 'a02042'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi 2 Model B'; - // result.version = result.version + ' - Rev. 1.2'; - // } - - // // Compute Model - // if (['a02100'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi CM3+'; - // result.version = result.version + ' - Rev 1.0'; - // } - // if (['a020a0', 'a220a0'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi CM3'; - // result.version = result.version + ' - Rev 1.0'; - // } - // if (['900061'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi CM'; - // result.version = result.version + ' - Rev 1.1'; - // } - - // // Pi Zero - // if (['900092', '920092'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Zero'; - // result.version = result.version + ' - Rev 1.2'; - // } - // if (['900093', '920093'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Zero'; - // result.version = result.version + ' - Rev 1.3'; - // } - // if (['9000c1'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Zero W'; - // result.version = result.version + ' - Rev 1.1'; - // } - - // // A, B, A+ B+ - // if (['0002', '0003'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Model B'; - // result.version = result.version + ' - Rev 1.0'; - // } - // if (['0004', '0005', '0006', '000d', '000e', '000f'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Model B'; - // result.version = result.version + ' - Rev 2.0'; - // } - // if (['0007', '0008', '0009'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Model A'; - // result.version = result.version + ' - Rev 2.0'; - // } - // if (['0010'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Model B+'; - // result.version = result.version + ' - Rev 1.0'; - // } - // if (['0012'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Model A+'; - // result.version = result.version + ' - Rev 1.0'; - // } - // if (['0013', '900032'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Model B+'; - // result.version = result.version + ' - Rev 1.2'; - // } - // if (['0015', '900021'].indexOf(result.version) >= 0) { - // result.model = result.model + ' - Pi Model A+'; - // result.version = result.version + ' - Rev 1.1'; - // } - // if (result.model.indexOf('Pi') !== -1 && result.version) { // Pi, Pi Zero - // result.manufacturer = 'Raspberry Pi Foundation'; - // } - // } - } - if (callback) { callback(result); } - resolve(result); - }); - } else { - if (callback) { callback(result); } - resolve(result); - } + if (callback) { callback(result); } + resolve(result); }); } else { if (callback) { callback(result); }