'use strict'; // @ts-check // ================================================================================== // virtualbox.js // ---------------------------------------------------------------------------------- // Description: System Information - library // for Node.js // Copyright: (c) 2014 - 2020 // Author: Sebastian Hildebrandt // ---------------------------------------------------------------------------------- // License: MIT // ================================================================================== // 14. Docker // ---------------------------------------------------------------------------------- const os = require('os'); const exec = require('child_process').exec; const util = require('./util'); function vboxInfo(callback) { // fallback - if only callback is given let result = []; return new Promise((resolve) => { process.nextTick(() => { try { exec(util.getVboxmanage() + ' list vms --long', function (error, stdout) { let parts = (os.EOL + stdout.toString()).split(os.EOL + 'Name:'); parts.shift(); parts.forEach(part => { const lines = ('Name:' + part).split(os.EOL); const state = util.getValue(lines, 'State'); const running = state.startsWith('running'); const runningSinceString = running ? state.replace('running (since ', '').replace(')', '').trim() : ''; let runningSince = 0; try { if (running) { const sinceDateObj = new Date(runningSinceString); const offset = sinceDateObj.getTimezoneOffset(); runningSince = Math.round((Date.now() - Date.parse(sinceDateObj)) / 1000) + offset * 60; } } catch (e) { util.noop(); } const stoppedSinceString = !running ? state.replace('powered off (since', '').replace(')', '').trim() : ''; let stoppedSince = 0; try { if (!running) { const sinceDateObj = new Date(stoppedSinceString); const offset = sinceDateObj.getTimezoneOffset(); stoppedSince = Math.round((Date.now() - Date.parse(sinceDateObj)) / 1000) + offset * 60; } } catch (e) { util.noop(); } result.push({ id: util.getValue(lines, 'UUID'), name: util.getValue(lines, 'Name'), running, started: runningSinceString, runningSince, stopped: stoppedSinceString, stoppedSince, guestOS: util.getValue(lines, 'Guest OS'), hardwareUUID: util.getValue(lines, 'Hardware UUID'), memory: parseInt(util.getValue(lines, 'Memory size', ' '), 10), vram: parseInt(util.getValue(lines, 'VRAM size'), 10), cpus: parseInt(util.getValue(lines, 'Number of CPUs'), 10), cpuExepCap: util.getValue(lines, 'CPU exec cap'), cpuProfile: util.getValue(lines, 'CPUProfile'), chipset: util.getValue(lines, 'Chipset'), firmware: util.getValue(lines, 'Firmware'), pageFusion: util.getValue(lines, 'Page Fusion') === 'enabled', configFile: util.getValue(lines, 'Config file'), snapshotFolder: util.getValue(lines, 'Snapshot folder'), logFolder: util.getValue(lines, 'Log folder'), HPET: util.getValue(lines, 'HPET') === 'enabled', PAE: util.getValue(lines, 'PAE') === 'enabled', longMode: util.getValue(lines, 'Long Mode') === 'enabled', tripleFaultReset: util.getValue(lines, 'Triple Fault Reset') === 'enabled', APIC: util.getValue(lines, 'APIC') === 'enabled', X2APIC: util.getValue(lines, 'X2APIC') === 'enabled', ACPI: util.getValue(lines, 'ACPI') === 'enabled', IOAPIC: util.getValue(lines, 'IOAPIC') === 'enabled', biosAPICmode: util.getValue(lines, 'BIOS APIC mode'), bootMenuMode: util.getValue(lines, 'Boot menu mode'), bootDevice1: util.getValue(lines, 'Boot Device 1'), bootDevice2: util.getValue(lines, 'Boot Device 2'), bootDevice3: util.getValue(lines, 'Boot Device 3'), bootDevice4: util.getValue(lines, 'Boot Device 4'), timeOffset: util.getValue(lines, 'Time offset'), RTC: util.getValue(lines, 'RTC'), }); }); if (callback) { callback(result); } resolve(result); }); } catch (e) { if (callback) { callback(result); } resolve(result); } }); }); } exports.vboxInfo = vboxInfo;