const logger = require('./logger.js'); const util = require('./util.js'); const { spawn } = require('child_process'); function execute(cmd, args, await) { return new Promise((resolve, reject) => { let result = ''; let error = ''; const spawned = spawn(cmd, args); spawned.timestamp = new Date(); spawned.on('spawn', () => { logger.info('spawned command \'' + cmd + '\' with args \'' + args + '\''); if (await !== true) { resolve(); } }); spawned.stdout.on('data', (data) => { result += data; }); spawned.stderr.on('data', (data) => { if (data.toString().toLowerCase().startsWith('warning')) { result += data; return; } error += data; }); spawned.on('error', (err) => { reject('command \'' + cmd + '\' with args \'' + args + '\' encountered an error after ' + util.timeDiff(spawned.timestamp) + 'ms >>> ' + err); }); spawned.on('exit', (code) => { let msg = 'command \'' + cmd + '\' with args \'' + args + '\' finished with exit code ' + code + ' after ' + util.timeDiff(spawned.timestamp) + 'ms'; if (error !== undefined && error.length > 0) { error = error.trim(); msg += ' > error: ' + error; logger.error(error); return reject(error); } if (result !== undefined && result.length > 0) { result = result.trim(); msg += ' > data: ' + result; } logger.info(msg); resolve(result); }); }); } module.exports = { execute }