diff --git a/backend/lib/certbot.js b/backend/lib/certbot.js index c9d6c488..3b15f007 100644 --- a/backend/lib/certbot.js +++ b/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 diff --git a/backend/setup.js b/backend/setup.js index 403c14e7..7e550999 100644 --- a/backend/setup.js +++ b/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(', ')); + }); + } + }); } }); };