diff --git a/microscript/ILibDuktape_Commit.h b/microscript/ILibDuktape_Commit.h index 9067faeb..bac47f29 100644 --- a/microscript/ILibDuktape_Commit.h +++ b/microscript/ILibDuktape_Commit.h @@ -1,3 +1,3 @@ -// This file is auto-generated, any edits may be overwritten -#define SOURCE_COMMIT_DATE "2024-Nov-3 15:40:18+0000" -#define SOURCE_COMMIT_HASH "435bccd1eb335b2d54ad2057d8c40a477201df51" +// This file is auto-generated, any edits may be overwritten +#define SOURCE_COMMIT_DATE "2024-Nov-4 15:23:54+0000" +#define SOURCE_COMMIT_HASH "105da7dbfae9b32d5be67bbe12b1dee5fda400c9" diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index 0167c2e8..28963a0b 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -2658,7 +2658,7 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) duk_peval_string_noresult(ctx, "addCompressedModule('file-search', Buffer.from('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', 'base64'));"); // identifer: Refer to modules/identifers.js - duk_peval_string_noresult(ctx, "addCompressedModule('identifiers', Buffer.from('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', 'base64'), '2022-10-27T08:44:49.000+01:00');"); + duk_peval_string_noresult(ctx, "addCompressedModule('identifiers', Buffer.from('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', 'base64'), '2022-10-27T08:44:49.000+01:00');"); // zip-reader, refer to modules/zip-reader.js duk_peval_string_noresult(ctx, "addCompressedModule('zip-reader', Buffer.from('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', 'base64'), '2022-02-01T20:15:31.000-08:00');"); diff --git a/modules/identifiers.js b/modules/identifiers.js index d7b0a5e2..8c6a838c 100644 --- a/modules/identifiers.js +++ b/modules/identifiers.js @@ -69,34 +69,54 @@ function linux_identifiers() var ret = {}; var values = {}; - if (!require('fs').existsSync('/sys/class/dmi/id')) { throw ('this platform does not have DMI statistics'); } - - 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(); + 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(); + const memorySlots = []; + var child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', dataHandler); + child.stdin.write('vcgencmd get_mem arm && vcgencmd get_mem gpu\nexit\n'); + child.waitExit(); + try { + const lines = child.stdout.str.trim().split('\n'); + if (lines.length == 2) { + memorySlots.push({ Locator: "ARM Memory", Size: lines[0].split('=')[1].trim() }) + memorySlots.push({ Locator: "GPU Memory", Size: lines[1].split('=')[1].trim() }) + ret.memory = { Memory_Device: memorySlots }; + } + } catch (xx) { } + } else { + throw('Unknown board'); } - catch(z) - { + } 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]]; } } - 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']; } - 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']; try { identifiers['bios_mode'] = (require('fs').statSync('/sys/firmware/efi').isDirectory() ? 'UEFI': 'Legacy'); @@ -104,9 +124,16 @@ function linux_identifiers() var child = require('child_process').execFile('/bin/sh', ['sh']); child.stdout.str = ''; child.stdout.on('data', dataHandler); - child.stdin.write('cat /proc/cpuinfo | grep "model name" | ' + "tr '\\n' ':' | awk -F: '{ print $2 }'\nexit\n"); + 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; @@ -124,12 +151,19 @@ function linux_identifiers() child.stdin.write("lshw -class disk | tr '\\n' '`' | awk '" + '{ len=split($0,lines,"*"); printf "["; for(i=2;i<=len;++i) { model=""; caption=""; size=""; clen=split(lines[i],item,"`"); for(j=2;j1 {printf "{\\"size\\":\\"%s\\",\\"used\\":\\"%s\\",\\"available\\":\\"%s\\",\\"mount_point\\":\\"%s\\",\\"type\\":\\"%s\\"},", $1, $2, $3, $4, $5}\' | sed \'$ s/,$//\' | awk \'BEGIN {printf "["} {printf "%s", $0} END {printf "]"}\'\nexit\n'); + child.waitExit(); + try { ret.volumes = JSON.parse(child.stdout.str.trim()); } catch (xx) { } + child = null; values.identifiers = identifiers; values.linux = ret; trimIdentifiers(values.identifiers); - child = null; - var dmidecode = require('lib-finder').findBinary('dmidecode'); if (dmidecode != null) @@ -191,16 +225,18 @@ function linux_identifiers() } } - var mem = {}; - for (i = 0; i < j.length; ++i) - { - for (key in j[i]) + if(j.length > 0){ + var mem = {}; + for (i = 0; i < j.length; ++i) { - if (mem[key] == null) { mem[key] = []; } - mem[key].push(j[i][key]); + for (key in j[i]) + { + if (mem[key] == null) { mem[key] = []; } + mem[key].push(j[i][key]); + } } + values.linux.memory = mem; } - values.linux.memory = mem; } catch (e) { } @@ -322,6 +358,36 @@ function linux_identifiers() child = null; } + // Linux Last Boot Up Time + try { + child = require('child_process').execFile('/usr/bin/uptime', ['', '-s']); // must include blank value at begining for some reason? + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.stderr.on('data', function () { }); + child.waitExit(); + var regex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/; + if (regex.test(child.stdout.str.trim())) { + values.linux.LastBootUpTime = child.stdout.str.trim(); + } else { + child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.stdin.write('date -d "@$(( $(date +%s) - $(awk \'{print int($1)}\' /proc/uptime) ))" "+%Y-%m-%d %H:%M:%S"\nexit\n'); + child.waitExit(); + if (regex.test(child.stdout.str.trim())) { + values.linux.LastBootUpTime = child.stdout.str.trim(); + } + } + child = null; + } catch (ex) { } + + // Linux TPM + try { + if (require('fs').statSync('/sys/class/tpm/tpm0').isDirectory()){ + values.tpm = { + SpecVersion: require('fs').readFileSync('/sys/class/tpm/tpm0/tpm_version_major').toString().trim() + } + } + } catch (ex) { } + return (values); } @@ -365,11 +431,12 @@ function windows_volumes() p1._p2 = p2; p2._p1 = p1; - var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', '-']); + var cmd = '"Get-Volume | Select-Object -Property DriveLetter,FileSystemLabel,FileSystemType,Size,SizeRemaining,DriveType | ConvertTo-Csv -NoTypeInformation"'; + var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', cmd]); p1.child = child; child.promise = p1; child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); - child.stdin.write('Get-Volume | Select-Object -Property DriveLetter,FileSystemLabel,FileSystemType,Size,DriveType | ConvertTo-Csv -NoTypeInformation\nexit\n'); + child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); }); child.on('exit', function (c) { var a, i, tokens, key; @@ -379,14 +446,16 @@ function windows_volumes() for (i = 1; i < a.length; ++i) { tokens = a[i].split(','); - if (tokens[0] != '') + if (tokens[0] != '' && tokens[1] != undefined) { ret[tokens[0].split('"')[1]] = { name: tokens[1].split('"')[1], type: tokens[2].split('"')[1], size: tokens[3].split('"')[1], - removable: tokens[4].split('"')[1] == 'Removable' + sizeremaining: tokens[4].split('"')[1], + removable: tokens[5].split('"')[1] == 'Removable', + cdrom: tokens[5].split('"')[1] == 'CD-ROM' }; } } @@ -398,12 +467,13 @@ function windows_volumes() var ret = j.r; var tokens = j.t; - var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', '-']); + var cmd = '"Get-BitLockerVolume | Select-Object -Property MountPoint,VolumeStatus,ProtectionStatus | ConvertTo-Csv -NoTypeInformation"'; + var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', cmd]); p2.child = child; child.promise = p2; child.tokens = tokens; child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); - child.stdin.write('Get-BitLockerVolume | Select-Object -Property MountPoint,VolumeStatus,ProtectionStatus | ConvertTo-Csv -NoTypeInformation\nexit\n'); + child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); }); child.on('exit', function () { var i; @@ -416,6 +486,34 @@ function windows_volumes() { ret[key].volumeStatus = tokens[1].split('"')[1]; ret[key].protectionStatus = tokens[2].split('"')[1]; + try { + var foundIDMarkedLine = false, foundMarkedLine = false, identifier = '', password = ''; + var keychild = require('child_process').execFile(process.env['windir'] + '\\system32\\cmd.exe', ['cmd', '/c', 'manage-bde -protectors -get ', tokens[0].split('"')[1], ' -Type recoverypassword'], {}); + keychild.stdout.str = ''; keychild.stdout.on('data', function (c) { this.str += c.toString(); }); + keychild.waitExit(); + var lines = keychild.stdout.str.trim().split('\r\n'); + for (var x = 0; x < lines.length; x++) { // Loop each line + var abc = lines[x].trim(); + var englishidpass = (abc !== '' && abc.includes('Numerical Password:')); // English ID + var germanidpass = (abc !== '' && abc.includes('Numerisches Kennwort:')); // German ID + var frenchidpass = (abc !== '' && abc.includes('Mot de passe num')); // French ID + var englishpass = (abc !== '' && abc.includes('Password:') && !abc.includes('Numerical Password:')); // English Password + var germanpass = (abc !== '' && abc.includes('Kennwort:') && !abc.includes('Numerisches Kennwort:')); // German Password + var frenchpass = (abc !== '' && abc.includes('Mot de passe :') && !abc.includes('Mot de passe num')); // French Password + if (englishidpass || germanidpass || frenchidpass|| englishpass || germanpass || frenchpass) { + var nextline = lines[x + 1].trim(); + if (x + 1 < lines.length && (nextline !== '' && (nextline.startsWith('ID:') || nextline.startsWith('ID :')) )) { + identifier = nextline.replace('ID:','').replace('ID :', '').trim(); + foundIDMarkedLine = true; + }else if (x + 1 < lines.length && nextline !== '') { + password = nextline; + foundMarkedLine = true; + } + } + } + ret[key].identifier = (foundIDMarkedLine ? identifier : ''); // Set Bitlocker Identifier + ret[key].recoveryPassword = (foundMarkedLine ? password : ''); // Set Bitlocker Password + } catch(ex) { } } } this.promise._res(ret); @@ -448,9 +546,10 @@ function windows_identifiers() ret['identifiers']['board_version'] = values[0]['Version']; } - values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_ComputerSystemProduct", ['UUID']); + values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_ComputerSystemProduct", ['UUID', 'Name']); if(values[0]){ ret['identifiers']['product_uuid'] = values[0]['UUID']; + ret['identifiers']['product_name'] = values[0]['Name']; trimIdentifiers(ret.identifiers); } @@ -487,7 +586,7 @@ function windows_identifiers() ret.windows.gpu = values; } - values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_DiskDrive", ['Caption', 'DeviceID', 'Model', 'Partitions', 'Size']); + values = require('win-wmi').query('ROOT\\CIMV2', "SELECT * FROM Win32_DiskDrive", ['Caption', 'DeviceID', 'Model', 'Partitions', 'Size', 'Status']); if(values[0]){ ret.windows.drives = values; } @@ -507,11 +606,28 @@ function windows_identifiers() } try { ret.identifiers.cpu_name = ret.windows.cpu[0].Name; } catch (x) { } + + // Windows TPM + IntToStr = function (v) { return String.fromCharCode((v >> 24) & 0xFF, (v >> 16) & 0xFF, (v >> 8) & 0xFF, v & 0xFF); }; + try { + values = require('win-wmi').query('ROOT\\CIMV2\\Security\\MicrosoftTpm', "SELECT * FROM Win32_Tpm", ['IsActivated_InitialValue','IsEnabled_InitialValue','IsOwned_InitialValue','ManufacturerId','ManufacturerVersion','SpecVersion']); + if(values[0]) { + ret.tpm = { + SpecVersion: values[0].SpecVersion.split(",")[0], + ManufacturerId: IntToStr(values[0].ManufacturerId).replace(/[^\x00-\x7F]/g, ""), + ManufacturerVersion: values[0].ManufacturerVersion, + IsActivated: values[0].IsActivated_InitialValue, + IsEnabled: values[0].IsEnabled_InitialValue, + IsOwned: values[0].IsOwned_InitialValue, + } + } + } catch (ex) { } + return (ret); } function macos_identifiers() { - var ret = { identifiers: {} }; + var ret = { identifiers: {}, darwin: {} }; var child; child = require('child_process').execFile('/bin/sh', ['sh']); @@ -550,27 +666,152 @@ function macos_identifiers() child.waitExit(); ret.identifiers.cpu_name = child.stdout.str.trim(); + child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.stdin.write('system_profiler SPMemoryDataType\nexit\n'); + child.waitExit(); + var lines = child.stdout.str.trim().split('\n'); + if(lines.length > 0) { + const memorySlots = []; + if(lines[2].trim().includes('Memory Slots:')) { // OLD MACS WITH SLOTS + var memorySlots1 = child.stdout.str.split(/\n{2,}/).slice(3); + memorySlots1.forEach(function(slot,index) { + var lines = slot.split('\n'); + if(lines.length == 1){ // start here + if(lines[0].trim()!=''){ + var slotObj = { DeviceLocator: lines[0].trim().replace(/:$/, '') }; // Initialize name as an empty string + var nextline = memorySlots1[index+1].split('\n'); + nextline.forEach(function(line) { + if (line.trim() !== '') { + var parts = line.split(':'); + var key = parts[0].trim(); + var value = parts[1].trim(); + value = (key == 'Part Number' || key == 'Manufacturer') ? hexToAscii(parts[1].trim()) : parts[1].trim(); + slotObj[key.replace(' ','')] = value; // Store attribute in the slot object + } + }); + memorySlots.push(slotObj); + } + } + }); + } else { // NEW MACS WITHOUT SLOTS + memorySlots.push({ DeviceLocator: "Onboard Memory", Size: lines[2].split(":")[1].trim(), PartNumber: lines[3].split(":")[1].trim(), Manufacturer: lines[4].split(":")[1].trim() }) + } + ret.darwin.memory = memorySlots; + } - trimIdentifiers(ret.identifiers); + child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.stdin.write('diskutil info -all\nexit\n'); + child.waitExit(); + var sections = child.stdout.str.split('**********\n'); + if(sections.length > 0){ + var devices = []; + for (var i = 0; i < sections.length; i++) { + var lines = sections[i].split('\n'); + var deviceInfo = {}; + var wholeYes = false; + var physicalYes = false; + var oldmac = false; + for (var j = 0; j < lines.length; j++) { + var keyValue = lines[j].split(':'); + var key = keyValue[0].trim(); + var value = keyValue[1] ? keyValue[1].trim() : ''; + if (key === 'Virtual') oldmac = true; + if (key === 'Whole' && value === 'Yes') wholeYes = true; + if (key === 'Virtual' && value === 'No') physicalYes = true; + if(value && key === 'Device / Media Name'){ + deviceInfo['Caption'] = value; + } + if(value && key === 'Disk Size'){ + deviceInfo['Size'] = value.split(' ')[0] + ' ' + value.split(' ')[1]; + } + } + if (wholeYes) { + if (oldmac) { + if (physicalYes) devices.push(deviceInfo); + } else { + devices.push(deviceInfo); + } + } + } + ret.identifiers.storage_devices = devices; + } + // Fetch storage volumes using df + child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', dataHandler); + child.stdin.write('df -aHY | awk \'NR>1 {printf "{\\"size\\":\\"%s\\",\\"used\\":\\"%s\\",\\"available\\":\\"%s\\",\\"mount_point\\":\\"%s\\",\\"type\\":\\"%s\\"},", $3, $4, $5, $10, $2}\' | sed \'$ s/,$//\' | awk \'BEGIN {printf "["} {printf "%s", $0} END {printf "]"}\'\nexit\n'); + child.waitExit(); + try { + ret.darwin.volumes = JSON.parse(child.stdout.str.trim()); + for (var index = 0; index < ret.darwin.volumes.length; index++) { + if (ret.darwin.volumes[index].type == 'auto_home'){ + ret.darwin.volumes.splice(index,1); + } + } + if (ret.darwin.volumes.length == 0) { // not sonima OS so dont show type for now + child = require('child_process').execFile('/bin/sh', ['sh']); + child.stdout.str = ''; child.stdout.on('data', dataHandler); + child.stdin.write('df -aH | awk \'NR>1 {printf "{\\"size\\":\\"%s\\",\\"used\\":\\"%s\\",\\"available\\":\\"%s\\",\\"mount_point\\":\\"%s\\"},", $2, $3, $4, $9}\' | sed \'$ s/,$//\' | awk \'BEGIN {printf "["} {printf "%s", $0} END {printf "]"}\'\nexit\n'); + child.waitExit(); + try { + ret.darwin.volumes = JSON.parse(child.stdout.str.trim()); + for (var index = 0; index < ret.darwin.volumes.length; index++) { + if (ret.darwin.volumes[index].size == 'auto_home'){ + ret.darwin.volumes.splice(index,1); + } + } + } catch (xx) { } + } + } catch (xx) { } + child = null; + + // MacOS Last Boot Up Time + try { + child = require('child_process').execFile('/usr/sbin/sysctl', ['', 'kern.boottime']); // must include blank value at begining for some reason? + child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); + child.stderr.on('data', function () { }); + child.waitExit(); + const timestampMatch = /\{ sec = (\d+), usec = \d+ \}/.exec(child.stdout.str.trim()); + if (!ret.darwin) { + ret.darwin = { LastBootUpTime: parseInt(timestampMatch[1]) }; + } else { + ret.darwin.LastBootUpTime = parseInt(timestampMatch[1]); + } + child = null; + } catch (ex) { } + + trimIdentifiers(ret.identifiers); child = null; return (ret); } +function hexToAscii(hexString) { + if(!hexString.startsWith('0x')) return hexString.trim(); + hexString = hexString.startsWith('0x') ? hexString.slice(2) : hexString; + var str = ''; + for (var i = 0; i < hexString.length; i += 2) { + var hexPair = hexString.substr(i, 2); + str += String.fromCharCode(parseInt(hexPair, 16)); + } + str = str.replace(/[\u007F-\uFFFF]/g, ''); // Remove characters from 0x0080 to 0xFFFF + return str.trim(); +} + function win_chassisType() { // needs to be replaced with win-wmi but due to bug in win-wmi it doesnt handle arrays correctly - var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', '-'], {}); + var cmd = '"Get-CimInstance Win32_SystemEnclosure | Select-Object -ExpandProperty ChassisTypes"'; + var child = require('child_process').execFile(process.env['windir'] + '\\System32\\WindowsPowerShell\\v1.0\\powershell.exe', ['powershell', '-noprofile', '-nologo', '-command', cmd], {}); if (child == null) { return ([]); } child.descriptorMetadata = 'process-manager'; child.stdout.str = ''; child.stdout.on('data', function (c) { this.str += c.toString(); }); child.stderr.str = ''; child.stderr.on('data', function (c) { this.str += c.toString(); }); - child.stdin.write('Get-CimInstance Win32_SystemEnclosure| Select-Object -ExpandProperty ChassisTypes\r\n'); - child.stdin.write('exit\r\n'); child.waitExit(); try { - return (parseInt(child.stdout.str)); + return (parseInt(child.stdout.str)); } catch (e) { return (2); // unknown } @@ -711,6 +952,8 @@ module.exports.isVM = function isVM() case 'VMware, Inc.': case 'Xen': case 'SeaBIOS': + case 'EFI Development Kit II / OVMF': + case 'Proxmox distribution of EDK II': ret = true; break; default: