| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | const _          = require('lodash');const exec       = require('child_process').exec;const execFile   = require('child_process').execFile;const { Liquid } = require('liquidjs');const logger     = require('../logger').global;const error      = require('./error');module.exports = {	exec: async function(cmd, options = {}) {		logger.debug('CMD:', cmd);		const { stdout, stderr } = await new Promise((resolve, reject) => {			const child = exec(cmd, options, (isError, stdout, stderr) => {				if (isError) {					reject(new error.CommandError(stderr, isError));				} else {					resolve({ stdout, stderr });				}			});			child.on('error', (e) => {				reject(new error.CommandError(stderr, 1, e));			});		});		return stdout;	},	/**	 * @param   {String} cmd	 * @param   {Array}  args	 * @returns {Promise}	 */	execFile: function (cmd, args) {		// logger.debug('CMD: ' + cmd + ' ' + (args ? args.join(' ') : ''));		return new Promise((resolve, reject) => {			execFile(cmd, args, function (err, stdout, /*stderr*/) {				if (err && typeof err === 'object') {					reject(err);				} else {					resolve(stdout.trim());				}			});		});	},	/**	 * Used in objection query builder	 *	 * @param   {Array}  omissions	 * @returns {Function}	 */	omitRow: function (omissions) {		/**		 * @param   {Object} row		 * @returns {Object}		 */		return (row) => {			return _.omit(row, omissions);		};	},	/**	 * Used in objection query builder	 *	 * @param   {Array}  omissions	 * @returns {Function}	 */	omitRows: function (omissions) {		/**		 * @param   {Array} rows		 * @returns {Object}		 */		return (rows) => {			rows.forEach((row, idx) => {				rows[idx] = _.omit(row, omissions);			});			return rows;		};	},	/**	 * @returns {Object} Liquid render engine	 */	getRenderEngine: function () {		const renderEngine = new Liquid({			root: __dirname + '/../templates/'		});		/**		 * nginxAccessRule expects the object given to have 2 properties:		 *		 * directive  string		 * address    string		 */		renderEngine.registerFilter('nginxAccessRule', (v) => {			if (typeof v.directive !== 'undefined' && typeof v.address !== 'undefined' && v.directive && v.address) {				return `${v.directive} ${v.address};`;			}			return '';		});		return renderEngine;	}};
 |