| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | const dnsPlugins = require('../global/certbot-dns-plugins.json');const utils      = require('./utils');const error      = require('./error');const logger     = require('../logger').certbot;const batchflow  = require('batchflow');const CERTBOT_VERSION_REPLACEMENT = '$(certbot --version | grep -Eo \'[0-9](\\.[0-9]+)+\')';const certbot = {	/**	 * @param {array} pluginKeys	 */	installPlugins: async (pluginKeys) => {		let hasErrors = false;		return new Promise((resolve, reject) => {			if (pluginKeys.length === 0) {				resolve();				return;			}			batchflow(pluginKeys).sequential()				.each((_i, pluginKey, next) => {					certbot.installPlugin(pluginKey)						.then(() => {							next();						})						.catch((err) => {							hasErrors = true;							next(err);						});				})				.error((err) => {					logger.error(err.message);				})				.end(() => {					if (hasErrors) {						reject(new error.CommandError('Some plugins failed to install. Please check the logs above', 1));					} else {						resolve();					}				});		});	},	/**	 * Installs a cerbot plugin given the key for the object from	 * ../global/certbot-dns-plugins.json	 *	 * @param   {string}  pluginKey	 * @returns {Object}	 */	installPlugin: async (pluginKey) => {		if (typeof dnsPlugins[pluginKey] === 'undefined') {			// throw Error(`Certbot plugin ${pluginKey} not found`);			throw new error.ItemNotFoundError(pluginKey);		}		const plugin = dnsPlugins[pluginKey];		logger.start(`Installing ${pluginKey}...`);		plugin.version      = plugin.version.replace(/{{certbot-version}}/g, CERTBOT_VERSION_REPLACEMENT);		plugin.dependencies = plugin.dependencies.replace(/{{certbot-version}}/g, CERTBOT_VERSION_REPLACEMENT);		// SETUPTOOLS_USE_DISTUTILS is required for certbot plugins to install correctly		// in new versions of Python		let env = Object.assign({}, process.env, {SETUPTOOLS_USE_DISTUTILS: 'stdlib'});		if (typeof plugin.env === 'object') {			env = Object.assign(env, plugin.env);		}		const cmd = `. /opt/certbot/bin/activate && pip install --no-cache-dir ${plugin.dependencies} ${plugin.package_name}${plugin.version}  && deactivate`;		return utils.exec(cmd, {env})			.then((result) => {				logger.complete(`Installed ${pluginKey}`);				return result;			})			.catch((err) => {				throw err;			});	},};module.exports = certbot;
 |