mirror of
				https://github.com/NginxProxyManager/nginx-proxy-manager.git
				synced 2025-10-31 15:53:33 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { exec as nodeExec, execFile as nodeExecFile } from "node:child_process";
 | |
| import { dirname } from "node:path";
 | |
| import { fileURLToPath } from "node:url";
 | |
| import { Liquid } from "liquidjs";
 | |
| import _ from "lodash";
 | |
| import { global as logger } from "../logger.js";
 | |
| import errs from "./error.js";
 | |
| 
 | |
| const __filename = fileURLToPath(import.meta.url);
 | |
| const __dirname = dirname(__filename);
 | |
| 
 | |
| const exec = async (cmd, options = {}) => {
 | |
| 	logger.debug("CMD:", cmd);
 | |
| 	const { stdout, stderr } = await new Promise((resolve, reject) => {
 | |
| 		const child = nodeExec(cmd, options, (isError, stdout, stderr) => {
 | |
| 			if (isError) {
 | |
| 				reject(new errs.CommandError(stderr, isError));
 | |
| 			} else {
 | |
| 				resolve({ stdout, stderr });
 | |
| 			}
 | |
| 		});
 | |
| 
 | |
| 		child.on("error", (e) => {
 | |
| 			reject(new errs.CommandError(stderr, 1, e));
 | |
| 		});
 | |
| 	});
 | |
| 	return stdout;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @param   {String} cmd
 | |
|  * @param   {Array}  args
 | |
|  * @param   {Object|undefined}  options
 | |
|  * @returns {Promise}
 | |
|  */
 | |
| const execFile = (cmd, args, options) => {
 | |
| 	logger.debug(`CMD: ${cmd} ${args ? args.join(" ") : ""}`);
 | |
| 	const opts = options || {};
 | |
| 
 | |
| 	return new Promise((resolve, reject) => {
 | |
| 		nodeExecFile(cmd, args, opts, (err, stdout, stderr) => {
 | |
| 			if (err && typeof err === "object") {
 | |
| 				reject(new errs.CommandError(stderr, 1, err));
 | |
| 			} else {
 | |
| 				resolve(stdout.trim());
 | |
| 			}
 | |
| 		});
 | |
| 	});
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Used in objection query builder
 | |
|  *
 | |
|  * @param   {Array}  omissions
 | |
|  * @returns {Function}
 | |
|  */
 | |
| const omitRow = (omissions) => {
 | |
| 	/**
 | |
| 	 * @param   {Object} row
 | |
| 	 * @returns {Object}
 | |
| 	 */
 | |
| 	return (row) => {
 | |
| 		return _.omit(row, omissions);
 | |
| 	};
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Used in objection query builder
 | |
|  *
 | |
|  * @param   {Array}  omissions
 | |
|  * @returns {Function}
 | |
|  */
 | |
| const omitRows = (omissions) => {
 | |
| 	/**
 | |
| 	 * @param   {Array} rows
 | |
| 	 * @returns {Object}
 | |
| 	 */
 | |
| 	return (rows) => {
 | |
| 		rows.forEach((row, idx) => {
 | |
| 			rows[idx] = _.omit(row, omissions);
 | |
| 		});
 | |
| 		return rows;
 | |
| 	};
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @returns {Object} Liquid render engine
 | |
|  */
 | |
| const getRenderEngine = () => {
 | |
| 	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;
 | |
| };
 | |
| 
 | |
| export default { exec, execFile, omitRow, omitRows, getRenderEngine };
 |