'use strict'; // ================================================================================== // system.js // ---------------------------------------------------------------------------------- // Description: System Information - library // for Node.js // Copyright: (c) 2014 - 2017 // Author: Sebastian Hildebrandt // ---------------------------------------------------------------------------------- // License: MIT // ================================================================================== // 2. System (Hardware) // ---------------------------------------------------------------------------------- const os = require('os'); const exec = require('child_process').exec; const fs = require('fs'); let _platform = os.type(); const _linux = (_platform === 'Linux'); const _darwin = (_platform === 'Darwin'); const _windows = (_platform === 'Windows_NT'); module.exports = function (callback) { return new Promise((resolve) => { process.nextTick(() => { let result = { manufacturer: '', model: 'Computer', version: '', serial: '-', uuid: '-' }; 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(); } }); 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.manufacturer === '' && result.model === 'Computer' && result.version === '-') { // Check Raspberry Pi exec('grep Hardware /proc/cpuinfo; grep Serial /proc/cpuinfo; grep Revision /proc/cpuinfo', function (error, stdout) { if (!error) { let lines = stdout.toString().split('\n'); lines.forEach(function (line) { if (line.indexOf(':') !== -1) { if (line.toLowerCase().indexOf('hardware') !== -1) result.model = 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 (result.model === 'BCM2835') { // Pi 3 result.manufacturer = 'Raspberry Pi Foundation'; result.model = result.model + ' - Pi 3 Model B'; if (['a02082', 'a22082', 'a32082'].indexOf(result.version) >= 0) { result.version = result.version + ' - Rev. 1.2'; } } if (result.model === 'BCM2709') { // Pi 2 result.manufacturer = 'Raspberry Pi Foundation'; result.model = result.model + ' - Pi 2 Model B'; if (['a01041', 'a21041'].indexOf(result.version) >= 0) { result.version = result.version + ' - Rev. 1.1'; } } if (result.model === 'BCM2708') { // Pi, Pi Zero result.manufacturer = 'Raspberry Pi Foundation'; if (['0002', '0003'].indexOf(result.version) >= 0) { result.model = result.model + ' - Pi Model B'; result.version = result.version + ' - Rev 1.0'; } if (['900092'].indexOf(result.version) >= 0) { result.model = result.model + ' - Pi Zero'; result.version = result.version + ' - Rev 1.2'; } if (['900092', '900093', '920093'].indexOf(result.version) >= 0) { result.model = result.model + ' - Pi Zero'; result.version = result.version + ' - Rev 1.3'; } if (['0007', '0008', '0009'].indexOf(result.version) >= 0) { result.model = result.model + ' - Pi Model A'; result.version = result.version + ' - Rev 2.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 (['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'].indexOf(result.version) >= 0) { result.model = result.model + ' - Pi Model B+'; result.version = result.version + ' - Rev 1.2'; } if (['0015'].indexOf(result.version) >= 0) { result.model = result.model + ' - Pi Model A+'; result.version = result.version + ' - Rev 1.1'; } } } if (callback) { callback(result); } resolve(result); }); } else { if (callback) { callback(result); } resolve(result); } } else { 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'; } if (fs.existsSync('/.dockerenv') || fs.existsSync('/.dockerinit')) { result.model = 'Docker Container'; } if (callback) { callback(result); } resolve(result); }); } }); } 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(); } }); } if (callback) { callback(result); } resolve(result); }); } if (_windows) { exec('wmic csproduct get', 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]; } if (callback) { callback(result); } resolve(result); }); } }); }); };