Преглед изворни кода

Refactor certbot plugin install for setup

Jamie Curnow пре 1 година
родитељ
комит
10d9760242
2 измењених фајлова са 47 додато и 21 уклоњено
  1. 36 5
      backend/lib/certbot.js
  2. 11 16
      backend/setup.js

+ 36 - 5
backend/lib/certbot.js

@@ -2,16 +2,47 @@ 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 letsencryptStaging = config.useLetsencryptStaging();
-// const letsencryptConfig  = '/etc/letsencrypt.ini';
-// const certbotCommand     = 'certbot';
-
-// const acmeVersion  = '1.32.0';
 const CERTBOT_VERSION_REPLACEMENT = '$(certbot --version | grep -Eo \'[0-9](\\.[0-9]+)+\')';
 
 const certbot = {
 
+	/**
+	 * @param {array} pluginKeys
+	 */
+	installPlugins: async function (pluginKeys) {
+		let hasErrors = false;
+
+		return new Promise((resolve, reject) => {
+			if (pluginKeys.length === 0) {
+				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

+ 11 - 16
backend/setup.js

@@ -7,7 +7,7 @@ const utils               = require('./lib/utils');
 const authModel           = require('./models/auth');
 const settingModel        = require('./models/setting');
 const dns_plugins         = require('./global/certbot-dns-plugins');
-
+const certbot             = require('./lib/certbot');
 /**
  * Creates a default admin users if one doesn't already exist in the database
  *
@@ -116,10 +116,7 @@ const setupCertbotPlugins = () => {
 
 				certificates.map(function (certificate) {
 					if (certificate.meta && certificate.meta.dns_challenge === true) {
-						const dns_plugin = dns_plugins[certificate.meta.dns_provider];
-
-						const packages_to_install = `${dns_plugin.package_name}${dns_plugin.version_requirement || ''} ${dns_plugin.dependencies}`;
-						if (plugins.indexOf(packages_to_install) === -1) plugins.push(packages_to_install);
+						plugins.push(certificate.meta.dns_provider);
 
 						// Make sure credentials file exists
 						const credentials_loc = '/etc/letsencrypt/credentials/credentials-' + certificate.id;
@@ -130,17 +127,15 @@ const setupCertbotPlugins = () => {
 					}
 				});
 
-				if (plugins.length) {
-					const install_cmd = '. /opt/certbot/bin/activate && pip install --no-cache-dir ' + plugins.join(' ') + ' && deactivate';
-					promises.push(utils.exec(install_cmd));
-				}
-
-				if (promises.length) {
-					return Promise.all(promises)
-						.then(() => {
-							logger.info('Added Certbot plugins ' + plugins.join(', '));
-						});
-				}
+				return certbot.installPlugins(plugins)
+					.then(() => {
+						if (promises.length) {
+							return Promise.all(promises)
+								.then(() => {
+									logger.info('Added Certbot plugins ' + plugins.join(', '));
+								});
+						}
+					});
 			}
 		});
 };