/* Copyright 2019-2021 Intel Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ function trimIdentifiers(val) { for(var v in val) { if (!val[v] || val[v] == 'None' || val[v] == '') { delete val[v]; } } } function trimResults(val) { var i, x; for (i = 0; i < val.length; ++i) { for (x in val[i]) { if (x.startsWith('_')) { delete val[i][x]; } else { if (val[i][x] == null || val[i][x] == 0) { delete val[i][x]; } } } } } function brief(headers, obj) { var i, x; for (x = 0; x < obj.length; ++x) { for (i in obj[x]) { if (!headers.includes(i)) { delete obj[x][i]; } } } return (obj); } function dataHandler(c) { this.str += c.toString(); } function linux_identifiers() { var identifiers = {}; var ret = {}; var values = {}; if (!require('fs').existsSync('/sys/class/dmi/id')) { if(require('fs').existsSync('/sys/firmware/devicetree/base/model')){ if(require('fs').readFileSync('/sys/firmware/devicetree/base/model').toString().trim().startsWith('Raspberry')){ identifiers['board_vendor'] = 'Raspberry Pi'; identifiers['board_name'] = require('fs').readFileSync('/sys/firmware/devicetree/base/model').toString().trim(); identifiers['board_serial'] = require('fs').readFileSync('/sys/firmware/devicetree/base/serial-number').toString().trim(); }else{ throw('Unknown board'); } }else { throw ('this platform does not have DMI statistics'); } } else { var entries = require('fs').readdirSync('/sys/class/dmi/id'); for(var i in entries) { if (require('fs').statSync('/sys/class/dmi/id/' + entries[i]).isFile()) { try { ret[entries[i]] = require('fs').readFileSync('/sys/class/dmi/id/' + entries[i]).toString().trim(); } catch(z) { } if (ret[entries[i]] == 'None') { delete ret[entries[i]];} } } entries = null; identifiers['bios_date'] = ret['bios_date']; identifiers['bios_vendor'] = ret['bios_vendor']; identifiers['bios_version'] = ret['bios_version']; identifiers['bios_serial'] = ret['product_serial']; identifiers['board_name'] = ret['board_name']; identifiers['board_serial'] = ret['board_serial']; identifiers['board_vendor'] = ret['board_vendor']; identifiers['board_version'] = ret['board_version']; identifiers['product_uuid'] = ret['product_uuid']; identifiers['product_name'] = ret['product_name']; } try { identifiers['bios_mode'] = (require('fs').statSync('/sys/firmware/efi').isDirectory() ? 'UEFI': 'Legacy'); } catch (ex) { identifiers['bios_mode'] = 'Legacy'; } var child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', dataHandler); child.stdin.write('cat /proc/cpuinfo | grep -i "model name" | ' + "tr '\\n' ':' | awk -F: '{ print $2 }'\nexit\n"); child.waitExit(); identifiers['cpu_name'] = child.stdout.str.trim(); if (identifiers['cpu_name'] == "") { // CPU BLANK, check lscpu instead child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', dataHandler); child.stdin.write('lscpu | grep -i "model name" | ' + "tr '\\n' ':' | awk -F: '{ print $2 }'\nexit\n"); child.waitExit(); identifiers['cpu_name'] = child.stdout.str.trim(); } child = null; // Fetch GPU info child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', dataHandler); child.stdin.write("lspci | grep ' VGA ' | tr '\\n' '`' | awk '{ a=split($0,lines" + ',"`"); printf "["; for(i=1;i1)'); child.stdin.write(' {'); child.stdin.write(' sub(/^[ \\t]*/,"",tmp[2]);'); child.stdin.write(' gsub(/ /,"",tmp[1]);'); child.stdin.write(' printf("%s\\"%s\\": \\"%s\\"", ccx, tmp[1], tmp[2]);'); child.stdin.write(' ccx=",";'); child.stdin.write(' }'); child.stdin.write(' }'); child.stdin.write(' printf("}}");'); child.stdin.write(' comma=",";'); child.stdin.write(' }'); child.stdin.write(' }'); child.stdin.write(' printf("]");'); child.stdin.write("}'\nexit\n"); child.waitExit(); try { var j = JSON.parse(child.stdout.str); var i, key, key2; for (i = 0; i < j.length; ++i) { for (key in j[i]) { delete j[i][key]['ArrayHandle']; delete j[i][key]['ErrorInformationHandle']; for (key2 in j[i][key]) { if (j[i][key][key2] == 'Unknown' || j[i][key][key2] == 'Not Specified' || j[i][key][key2] == '') { delete j[i][key][key2]; } } } } if(j.length > 0){ var mem = {}; for (i = 0; i < j.length; ++i) { for (key in j[i]) { if (mem[key] == null) { mem[key] = []; } mem[key].push(j[i][key]); } } values.linux.memory = mem; } } catch (e) { } child = null; } var usbdevices = require('lib-finder').findBinary('usb-devices'); if (usbdevices != null) { var child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', dataHandler); child.stderr.str = ''; child.stderr.on('data', dataHandler); child.stdin.write(usbdevices + " | tr '\\n' '`' | "); child.stdin.write(" awk '"); child.stdin.write('{'); child.stdin.write(' comma="";'); child.stdin.write(' printf("[");'); child.stdin.write(' len=split($0, group, "``");'); child.stdin.write(' for(i=1;i<=len;++i)'); child.stdin.write(' {'); child.stdin.write(' comma2="";'); child.stdin.write(' xlen=split(group[i], line, "`");'); child.stdin.write(' scount=0;'); child.stdin.write(' for(x=1;x0)'); child.stdin.write(' {'); child.stdin.write(' printf("%s{", comma); comma=",";'); child.stdin.write(' for(x=1;x2) { print \"true\"; }}'\nexit\n"); child.waitExit(); if(child.stdout.str.trim() != '') { ret = true; } break; } return (ret); }; module.exports.isVM = function isVM() { var ret = false; var id = this.get(); if (id.linux && id.linux.sys_vendor) { switch (id.linux.sys_vendor) { case 'VMware, Inc.': case 'QEMU': case 'Xen': ret = true; break; default: break; } } if (id.identifiers.bios_vendor) { switch(id.identifiers.bios_vendor) { case 'VMware, Inc.': case 'Xen': case 'SeaBIOS': ret = true; break; default: break; } } if (id.identifiers.board_vendor && id.identifiers.board_vendor == 'VMware, Inc.') { ret = true; } if (id.identifiers.board_name) { switch (id.identifiers.board_name) { case 'VirtualBox': case 'Virtual Machine': ret = true; break; default: break; } } if (process.platform == 'win32' && !ret) { for(var i in id.identifiers.gpu_name) { if(id.identifiers.gpu_name[i].startsWith('VMware ')) { ret = true; break; } } } if (!ret) { ret = this.isDocker(); } return (ret); }; if (process.platform == 'win32') { module.exports.volumes_promise = windows_volumes; } // bios_date = BIOS->ReleaseDate // bios_vendor = BIOS->Manufacturer // bios_version = BIOS->SMBIOSBIOSVersion // board_name = BASEBOARD->Product = ioreg/board-id // board_serial = BASEBOARD->SerialNumber = ioreg/serial-number | ioreg/IOPlatformSerialNumber // board_vendor = BASEBOARD->Manufacturer = ioreg/manufacturer // board_version = BASEBOARD->Version