diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml deleted file mode 100644 index f859b127..00000000 --- a/.github/workflows/stale.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: 'Close stale issues and PRs' -on: - schedule: - - cron: '30 1 * * *' - workflow_dispatch: - -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v9 - with: - stale-issue-label: 'stale' - stale-pr-label: 'stale' - stale-issue-message: 'Issue is now considered stale. If you want to keep it open, please comment :+1:' - stale-pr-message: 'PR is now considered stale. If you want to keep it open, please comment :+1:' - close-issue-message: 'Issue was closed due to inactivity.' - close-pr-message: 'PR was closed due to inactivity.' - days-before-stale: 182 - days-before-close: 365 - operations-per-run: 50 diff --git a/Dockerfile b/Dockerfile index 11f147f9..469c8879 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM --platform="$BUILDPLATFORM" alpine:3.19.0 as frontend COPY frontend /build/frontend -COPY global/certbot-dns-plugins.js /build/frontend/certbot-dns-plugins.js +COPY global/certbot-dns-plugins.json /build/frontend/certbot-dns-plugins.json ARG NODE_ENV=production \ NODE_OPTIONS=--openssl-legacy-provider WORKDIR /build/frontend @@ -14,8 +14,8 @@ COPY security.txt /build/frontend/dist/.well-known/security.txt FROM --platform="$BUILDPLATFORM" alpine:3.19.0 as backend SHELL ["/bin/ash", "-eo", "pipefail", "-c"] -COPY backend /build/backend -COPY global/certbot-dns-plugins.js /build/backend/certbot-dns-plugins.js +COPY backend /build/backend +COPY global/certbot-dns-plugins.json /build/backend/certbot-dns-plugins.json ARG NODE_ENV=production \ TARGETARCH WORKDIR /build/backend diff --git a/backend/lib/certbot.js b/backend/lib/certbot.js index 3b15f007..8bff3963 100644 --- a/backend/lib/certbot.js +++ b/backend/lib/certbot.js @@ -1,11 +1,9 @@ -const dnsPlugins = require('../global/certbot-dns-plugins.json'); +const dnsPlugins = require('../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 = { /** @@ -59,10 +57,7 @@ const certbot = { 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); - - const cmd = '. /opt/certbot/bin/activate && pip install --no-cache-dir ' + plugin.dependencies + ' ' + plugin.package_name + plugin.version + ' ' + ' && deactivate'; + const cmd = 'pip install --no-cache-dir ' + plugin.package_name; return utils.exec(cmd) .then((result) => { logger.complete(`Installed ${pluginKey}`); diff --git a/backend/lib/utils.js b/backend/lib/utils.js index 56b1dd3e..34e6ab5b 100644 --- a/backend/lib/utils.js +++ b/backend/lib/utils.js @@ -8,6 +8,10 @@ const error = require('./error'); module.exports = { + + /** + * @param {String} cmd + */ exec: async function(cmd, options = {}) { logger.debug('CMD:', cmd); @@ -29,7 +33,29 @@ module.exports = { /** * @param {String} cmd - * @returns {Promise} + * @param {Array} args + */ + execFile: async function (cmd, args, options = {}) { + logger.debug('CMD: ' + cmd + ' ' + (args ? args.join(' ') : '')); + + const { stdout, stderr } = await new Promise((resolve, reject) => { + const child = execFile(cmd, args, 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 */ execfg: function (cmd) { return new Promise((resolve, reject) => { @@ -53,26 +79,6 @@ module.exports = { }); }, - - /** - * @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 * diff --git a/backend/scripts/install-certbot-plugins b/backend/scripts/install-certbot-plugins deleted file mode 100755 index bf995410..00000000 --- a/backend/scripts/install-certbot-plugins +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/node - -// Usage: -// Install all plugins defined in `certbot-dns-plugins.json`: -// ./install-certbot-plugins -// Install one or more specific plugins: -// ./install-certbot-plugins route53 cloudflare -// -// Usage with a running docker container: -// docker exec npm_core /command/s6-setuidgid 1000:1000 bash -c "/app/scripts/install-certbot-plugins" -// - -const dnsPlugins = require('../global/certbot-dns-plugins.json'); -const certbot = require('../lib/certbot'); -const logger = require('../logger').certbot; -const batchflow = require('batchflow'); - -let hasErrors = false; -let failingPlugins = []; - -let pluginKeys = Object.keys(dnsPlugins); -if (process.argv.length > 2) { - pluginKeys = process.argv.slice(2); -} - -batchflow(pluginKeys).sequential() - .each((i, pluginKey, next) => { - certbot.installPlugin(pluginKey) - .then(() => { - next(); - }) - .catch((err) => { - hasErrors = true; - failingPlugins.push(pluginKey); - next(err); - }); - }) - .error((err) => { - logger.error(err.message); - }) - .end(() => { - if (hasErrors) { - logger.error('Some plugins failed to install. Please check the logs above. Failing plugins: ' + '\n - ' + failingPlugins.join('\n - ')); - process.exit(1); - } else { - logger.complete('Plugins installed successfully'); - process.exit(0); - } - }); diff --git a/global/README.md b/global/README.md index 83e6c8c5..0e4d6a13 100644 --- a/global/README.md +++ b/global/README.md @@ -11,8 +11,6 @@ File Structure: "cloudflare": { "display_name": "Name displayed to the user", "package_name": "Package name in PyPi repo", - "version_requirement": "Optional package version requirements (e.g. ==1.3 or >=1.2,<2.0, see https://www.python.org/dev/peps/pep-0440/#version-specifiers)", - "dependencies": "Additional dependencies, space separated (as you would pass it to pip install)", "credentials": "Template of the credentials file", "full_plugin_name": "The full plugin name as used in the commandline with certbot, e.g. 'dns-njalla'" }, diff --git a/global/certbot-dns-plugins.json b/global/certbot-dns-plugins.json index a86d0719..818f405c 100644 --- a/global/certbot-dns-plugins.json +++ b/global/certbot-dns-plugins.json @@ -1,426 +1,320 @@ { - "acmedns": { - "name": "ACME-DNS", - "package_name": "certbot-dns-acmedns", - "version": "~=0.1.0", - "dependencies": "", - "credentials": "dns_acmedns_api_url = http://acmedns-server/\ndns_acmedns_registration_file = /data/acme-registration.json", - "full_plugin_name": "dns-acmedns" - }, - "aliyun": { - "name": "Aliyun", - "package_name": "certbot-dns-aliyun", - "version": "~=0.38.1", - "dependencies": "", - "credentials": "dns_aliyun_access_key = 12345678\ndns_aliyun_access_key_secret = 1234567890abcdef1234567890abcdef", - "full_plugin_name": "dns-aliyun" - }, - "azure": { - "name": "Azure", - "package_name": "certbot-dns-azure", - "version": "~=1.2.0", - "dependencies": "", - "credentials": "# This plugin supported API authentication using either Service Principals or utilizing a Managed Identity assigned to the virtual machine.\n# Regardless which authentication method used, the identity will need the “DNS Zone Contributor” role assigned to it.\n# As multiple Azure DNS Zones in multiple resource groups can exist, the config file needs a mapping of zone to resource group ID. Multiple zones -> ID mappings can be listed by using the key dns_azure_zoneX where X is a unique number. At least 1 zone mapping is required.\n\n# Using a service principal (option 1)\ndns_azure_sp_client_id = 912ce44a-0156-4669-ae22-c16a17d34ca5\ndns_azure_sp_client_secret = E-xqXU83Y-jzTI6xe9fs2YC~mck3ZzUih9\ndns_azure_tenant_id = ed1090f3-ab18-4b12-816c-599af8a88cf7\n\n# Using used assigned MSI (option 2)\n# dns_azure_msi_client_id = 912ce44a-0156-4669-ae22-c16a17d34ca5\n\n# Using system assigned MSI (option 3)\n# dns_azure_msi_system_assigned = true\n\n# Zones (at least one always required)\ndns_azure_zone1 = example.com:/subscriptions/c135abce-d87d-48df-936c-15596c6968a5/resourceGroups/dns1\ndns_azure_zone2 = example.org:/subscriptions/99800903-fb14-4992-9aff-12eaf2744622/resourceGroups/dns2", - "full_plugin_name": "dns-azure" - }, - "bunny": { - "name": "bunny.net", - "package_name": "certbot-dns-bunny", - "version": "~=0.0.9", - "dependencies": "", - "credentials": "# Bunny API token used by Certbot (see https://dash.bunny.net/account/settings)\ndns_bunny_api_key = xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx", - "full_plugin_name": "dns-bunny" - }, - "cloudflare": { - "name": "Cloudflare", - "package_name": "certbot-dns-cloudflare", - "version": "=={{certbot-version}}", - "dependencies": "cloudflare acme=={{certbot-version}}", - "credentials": "# Cloudflare API token\ndns_cloudflare_api_token = 0123456789abcdef0123456789abcdef01234567", - "full_plugin_name": "dns-cloudflare" - }, - "cloudns": { - "name": "ClouDNS", - "package_name": "certbot-dns-cloudns", - "version": "~=0.6.0", - "dependencies": "", - "credentials": "# Target user ID (see https://www.cloudns.net/api-settings/)\n\tdns_cloudns_auth_id=1234\n\t# Alternatively, one of the following two options can be set:\n\t# dns_cloudns_sub_auth_id=1234\n\t# dns_cloudns_sub_auth_user=foobar\n\n\t# API password\n\tdns_cloudns_auth_password=password1", - "full_plugin_name": "dns-cloudns" - }, - "cloudxns": { - "name": "CloudXNS", - "package_name": "certbot-dns-cloudxns", - "version": "~=1.32.0", - "dependencies": "", - "credentials": "dns_cloudxns_api_key = 1234567890abcdef1234567890abcdef\ndns_cloudxns_secret_key = 1122334455667788", - "full_plugin_name": "dns-cloudxns" - }, - "constellix": { - "name": "Constellix", - "package_name": "certbot-dns-constellix", - "version": "~=0.2.1", - "dependencies": "", - "credentials": "dns_constellix_apikey = 5fb4e76f-ac91-43e5-f982458bc595\ndns_constellix_secretkey = 47d99fd0-32e7-4e07-85b46d08e70b\ndns_constellix_endpoint = https://api.dns.constellix.com/v1", - "full_plugin_name": "dns-constellix" - }, - "corenetworks": { - "name": "Core Networks", - "package_name": "certbot-dns-corenetworks", - "version": "~=0.1.4", - "dependencies": "", - "credentials": "dns_corenetworks_username = asaHB12r\ndns_corenetworks_password = secure_password", - "full_plugin_name": "dns-corenetworks" - }, - "cpanel": { - "name": "cPanel", - "package_name": "certbot-dns-cpanel", - "version": "~=0.2.2", - "dependencies": "", - "credentials": "cpanel_url = https://cpanel.example.com:2083\ncpanel_username = user\ncpanel_password = hunter2", - "full_plugin_name": "cpanel" - }, - "desec": { - "name": "deSEC", - "package_name": "certbot-dns-desec", - "version": "~=1.2.1", - "dependencies": "", - "credentials": "dns_desec_token = YOUR_DESEC_API_TOKEN\ndns_desec_endpoint = https://desec.io/api/v1/", - "full_plugin_name": "dns-desec" - }, - "duckdns": { - "name": "DuckDNS", - "package_name": "certbot-dns-duckdns", - "version": "~=0.9", - "dependencies": "", - "credentials": "dns_duckdns_token=your-duckdns-token", - "full_plugin_name": "dns-duckdns" - }, - "digitalocean": { - "name": "DigitalOcean", - "package_name": "certbot-dns-digitalocean", - "version": "=={{certbot-version}}", - "dependencies": "acme=={{certbot-version}}", - "credentials": "dns_digitalocean_token = 0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff", - "full_plugin_name": "dns-digitalocean" - }, - "directadmin": { - "name": "DirectAdmin", - "package_name": "certbot-dns-directadmin", - "version": "~=0.0.23", - "dependencies": "", - "credentials": "directadmin_url = https://my.directadminserver.com:2222\ndirectadmin_username = username\ndirectadmin_password = aSuperStrongPassword", - "full_plugin_name": "directadmin" - }, - "dnsimple": { - "name": "DNSimple", - "package_name": "certbot-dns-dnsimple", - "version": "=={{certbot-version}}", - "dependencies": "acme=={{certbot-version}}", - "credentials": "dns_dnsimple_token = MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw", - "full_plugin_name": "dns-dnsimple" - }, - "dnsmadeeasy": { - "name": "DNS Made Easy", - "package_name": "certbot-dns-dnsmadeeasy", - "version": "=={{certbot-version}}", - "dependencies": "acme=={{certbot-version}}", - "credentials": "dns_dnsmadeeasy_api_key = 1c1a3c91-4770-4ce7-96f4-54c0eb0e457a\ndns_dnsmadeeasy_secret_key = c9b5625f-9834-4ff8-baba-4ed5f32cae55", - "full_plugin_name": "dns-dnsmadeeasy" - }, - "dnspod": { - "name": "DNSPod", - "package_name": "certbot-dns-dnspod", - "version": "~=0.1.0", - "dependencies": "", - "credentials": "dns_dnspod_email = \"email@example.com\"\ndns_dnspod_api_token = \"id,key\"", - "full_plugin_name": "dns-dnspod" - }, - "domainoffensive": { - "name": "DomainOffensive (do.de)", - "package_name": "certbot-dns-do", - "version": "~=0.31.0", - "dependencies": "", - "credentials": "dns_do_api_token = YOUR_DO_DE_AUTH_TOKEN", - "full_plugin_name": "dns-do" - }, - "domeneshop": { - "name": "Domeneshop", - "package_name": "certbot-dns-domeneshop", - "version": "~=0.2.8", - "dependencies": "", - "credentials": "dns_domeneshop_client_token=YOUR_DOMENESHOP_CLIENT_TOKEN\ndns_domeneshop_client_secret=YOUR_DOMENESHOP_CLIENT_SECRET", - "full_plugin_name": "dns-domeneshop" - }, - "dynu": { - "name": "Dynu", - "package_name": "certbot-dns-dynu", - "version": "~=0.0.1", - "dependencies": "", - "credentials": "dns_dynu_auth_token = YOUR_DYNU_AUTH_TOKEN", - "full_plugin_name": "dns-dynu" - }, - "eurodns": { - "name": "EuroDNS", - "package_name": "certbot-dns-eurodns", - "version": "~=0.0.4", - "dependencies": "", - "credentials": "dns_eurodns_applicationId = myuser\ndns_eurodns_apiKey = mysecretpassword\ndns_eurodns_endpoint = https://rest-api.eurodns.com/user-api-gateway/proxy", - "full_plugin_name": "dns-eurodns" - }, - "gandi": { - "name": "Gandi Live DNS", - "package_name": "certbot_plugin_gandi", - "version": "~=1.5.0", - "dependencies": "", - "credentials": "# Gandi personal access token\ndns_gandi_token=PERSONAL_ACCESS_TOKEN", - "full_plugin_name": "dns-gandi" - }, - "godaddy": { - "name": "GoDaddy", - "package_name": "certbot-dns-godaddy", - "version": "=={{certbot-version}}", - "dependencies": "", - "credentials": "dns_godaddy_secret = 0123456789abcdef0123456789abcdef01234567\ndns_godaddy_key = abcdef0123456789abcdef01234567abcdef0123", - "full_plugin_name": "dns-godaddy" - }, - "google": { - "name": "Google", - "package_name": "certbot-dns-google", - "version": "=={{certbot-version}}", - "dependencies": "", - "credentials": "{\n\"type\": \"service_account\",\n...\n}", - "full_plugin_name": "dns-google" - }, - "googledomains": { - "name": "GoogleDomainsDNS", - "package_name": "certbot-dns-google-domains", - "version": "~=0.1.5", - "dependencies": "", - "credentials": "dns_google_domains_access_token = 0123456789abcdef0123456789abcdef01234567\ndns_google_domains_zone = \"example.com\"", - "full_plugin_name": "dns-google-domains" - }, - "he": { - "name": "Hurricane Electric", - "package_name": "certbot-dns-he", - "version": "~=1.0.0", - "dependencies": "", - "credentials": "dns_he_user = Me\ndns_he_pass = my HE password", - "full_plugin_name": "dns-he" - }, - "hetzner": { - "name": "Hetzner", - "package_name": "certbot-dns-hetzner", - "version": "~=1.0.4", - "dependencies": "", - "credentials": "dns_hetzner_api_token = 0123456789abcdef0123456789abcdef", - "full_plugin_name": "dns-hetzner" - }, - "infomaniak": { - "name": "Infomaniak", - "package_name": "certbot-dns-infomaniak", - "version": "~=0.1.12", - "dependencies": "", - "credentials": "dns_infomaniak_token = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", - "full_plugin_name": "dns-infomaniak" - }, - "inwx": { - "name": "INWX", - "package_name": "certbot-dns-inwx", - "version": "~=2.1.2", - "dependencies": "", - "credentials": "dns_inwx_url = https://api.domrobot.com/xmlrpc/\ndns_inwx_username = your_username\ndns_inwx_password = your_password\ndns_inwx_shared_secret = your_shared_secret optional", - "full_plugin_name": "dns-inwx" - }, - "ionos": { - "name": "IONOS", - "package_name": "certbot-dns-ionos", - "version": "==2022.11.24", - "dependencies": "", - "credentials": "dns_ionos_prefix = myapikeyprefix\ndns_ionos_secret = verysecureapikeysecret\ndns_ionos_endpoint = https://api.hosting.ionos.com", - "full_plugin_name": "dns-ionos" - }, - "ispconfig": { - "name": "ISPConfig", - "package_name": "certbot-dns-ispconfig", - "version": "~=0.2.0", - "dependencies": "", - "credentials": "dns_ispconfig_username = myremoteuser\ndns_ispconfig_password = verysecureremoteuserpassword\ndns_ispconfig_endpoint = https://localhost:8080", - "full_plugin_name": "dns-ispconfig" - }, - "isset": { - "name": "Isset", - "package_name": "certbot-dns-isset", - "version": "~=0.0.3", - "dependencies": "", - "credentials": "dns_isset_endpoint=\"https://customer.isset.net/api\"\ndns_isset_token=\"\"", - "full_plugin_name": "dns-isset" - }, - "joker": { - "name": "Joker", - "package_name": "certbot-dns-joker", - "version": "~=1.1.0", - "dependencies": "", - "credentials": "dns_joker_username = \ndns_joker_password = \ndns_joker_domain = ", - "full_plugin_name": "dns-joker" - }, - "linode": { - "name": "Linode", - "package_name": "certbot-dns-linode", - "version": "=={{certbot-version}}", - "dependencies": "acme=={{certbot-version}}", - "credentials": "dns_linode_key = 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ64\ndns_linode_version = [|3|4]", - "full_plugin_name": "dns-linode" - }, - "loopia": { - "name": "Loopia", - "package_name": "certbot-dns-loopia", - "version": "~=1.0.0", - "dependencies": "", - "credentials": "dns_loopia_user = user@loopiaapi\ndns_loopia_password = abcdef0123456789abcdef01234567abcdef0123", - "full_plugin_name": "dns-loopia" - }, - "luadns": { - "name": "LuaDNS", - "package_name": "certbot-dns-luadns", - "version": "=={{certbot-version}}", - "dependencies": "acme=={{certbot-version}}", - "credentials": "dns_luadns_email = user@example.com\ndns_luadns_token = 0123456789abcdef0123456789abcdef", - "full_plugin_name": "dns-luadns" - }, - "namecheap": { - "name": "Namecheap", - "package_name": "certbot-dns-namecheap", - "version": "~=1.0.0", - "dependencies": "", - "credentials": "dns_namecheap_username = 123456\ndns_namecheap_api_key = 0123456789abcdef0123456789abcdef01234567", - "full_plugin_name": "dns-namecheap" - }, - "netcup": { - "name": "netcup", - "package_name": "certbot-dns-netcup", - "version": "~=1.0.0", - "dependencies": "", - "credentials": "dns_netcup_customer_id = 123456\ndns_netcup_api_key = 0123456789abcdef0123456789abcdef01234567\ndns_netcup_api_password = abcdef0123456789abcdef01234567abcdef0123", - "full_plugin_name": "dns-netcup" - }, - "njalla": { - "name": "Njalla", - "package_name": "certbot-dns-njalla", - "version": "~=1.0.0", - "dependencies": "", - "credentials": "dns_njalla_token = 0123456789abcdef0123456789abcdef01234567", - "full_plugin_name": "dns-njalla" - }, - "nsone": { - "name": "NS1", - "package_name": "certbot-dns-nsone", - "version": "=={{certbot-version}}", - "dependencies": "acme=={{certbot-version}}", - "credentials": "dns_nsone_api_key = MDAwMDAwMDAwMDAwMDAw", - "full_plugin_name": "dns-nsone" - }, - "oci": { - "name": "Oracle Cloud Infrastructure DNS", - "package_name": "certbot-dns-oci", - "version": "~=0.3.6", - "dependencies": "oci", - "credentials": "[DEFAULT]\nuser = ocid1.user.oc1...\nfingerprint = xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx\ntenancy = ocid1.tenancy.oc1...\nregion = us-ashburn-1\nkey_file = ~/.oci/oci_api_key.pem", - "full_plugin_name": "dns-oci" - }, - "ovh": { - "name": "OVH", - "package_name": "certbot-dns-ovh", - "version": "=={{certbot-version}}", - "dependencies": "acme=={{certbot-version}}", - "credentials": "dns_ovh_endpoint = ovh-eu\ndns_ovh_application_key = MDAwMDAwMDAwMDAw\ndns_ovh_application_secret = MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw\ndns_ovh_consumer_key = MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw", - "full_plugin_name": "dns-ovh" - }, - "plesk": { - "name": "Plesk", - "package_name": "certbot-dns-plesk", - "version": "~=0.3.0", - "dependencies": "", - "credentials": "dns_plesk_username = your-username\ndns_plesk_password = secret\ndns_plesk_api_url = https://plesk-api-host:8443", - "full_plugin_name": "dns-plesk" - }, - "porkbun": { - "name": "Porkbun", - "package_name": "certbot-dns-porkbun", - "version": "~=0.2", - "dependencies": "", - "credentials": "dns_porkbun_key=your-porkbun-api-key\ndns_porkbun_secret=your-porkbun-api-secret", - "full_plugin_name": "dns-porkbun" - }, - "powerdns": { - "name": "PowerDNS", - "package_name": "certbot-dns-powerdns", - "version": "~=0.2.1", - "dependencies": "PyYAML==5.3.1", - "credentials": "dns_powerdns_api_url = https://api.mypowerdns.example.org\ndns_powerdns_api_key = AbCbASsd!@34", - "full_plugin_name": "dns-powerdns" - }, - "regru": { - "name": "reg.ru", - "package_name": "certbot-regru", - "version": "~=1.0.2", - "dependencies": "", - "credentials": "dns_username=username\ndns_password=password", - "full_plugin_name": "dns" - }, - "rfc2136": { - "name": "RFC 2136", - "package_name": "certbot-dns-rfc2136", - "version": "=={{certbot-version}}", - "dependencies": "acme=={{certbot-version}}", - "credentials": "# Target DNS server\ndns_rfc2136_server = 192.0.2.1\n# Target DNS port\ndns_rfc2136_port = 53\n# TSIG key name\ndns_rfc2136_name = keyname.\n# TSIG key secret\ndns_rfc2136_secret = 4q4wM/2I180UXoMyN4INVhJNi8V9BCV+jMw2mXgZw/CSuxUT8C7NKKFs AmKd7ak51vWKgSl12ib86oQRPkpDjg==\n# TSIG key algorithm\ndns_rfc2136_algorithm = HMAC-SHA512", - "full_plugin_name": "dns-rfc2136" - }, - "route53": { - "name": "Route 53 (Amazon)", - "package_name": "certbot-dns-route53", - "version": "=={{certbot-version}}", - "dependencies": "acme=={{certbot-version}}", - "credentials": "[default]\naws_access_key_id=AKIAIOSFODNN7EXAMPLE\naws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", - "full_plugin_name": "dns-route53" - }, - "strato": { - "name": "Strato", - "package_name": "certbot-dns-strato", - "version": "~=0.1.1", - "dependencies": "", - "credentials": "dns_strato_username = user\ndns_strato_password = pass\n# uncomment if youre using two factor authentication:\n# dns_strato_totp_devicename = 2fa_device\n# dns_strato_totp_secret = 2fa_secret\n#\n# uncomment if domain name contains special characters\n# insert domain display name as seen on your account page here\n# dns_strato_domain_display_name = my-punicode-url.de\n#\n# if youre not using strato.de or another special endpoint you can customise it below\n# you will probably only need to adjust the host, but you can also change the complete endpoint url\n# dns_strato_custom_api_scheme = https\n# dns_strato_custom_api_host = www.strato.de\n# dns_strato_custom_api_port = 443\n# dns_strato_custom_api_path = \"/apps/CustomerService\"", - "full_plugin_name": "dns-strato" - }, - "transip": { - "name": "TransIP", - "package_name": "certbot-dns-transip", - "version": "~=0.4.3", - "dependencies": "", - "credentials": "dns_transip_username = my_username\ndns_transip_key_file = /etc/letsencrypt/transip-rsa.key", - "full_plugin_name": "dns-transip" - }, - "tencentcloud": { - "name": "Tencent Cloud", - "package_name": "certbot-dns-tencentcloud", - "version": "~=2.0.2", - "dependencies": "", - "credentials": "dns_tencentcloud_secret_id = TENCENT_CLOUD_SECRET_ID\ndns_tencentcloud_secret_key = TENCENT_CLOUD_SECRET_KEY", - "full_plugin_name": "dns-tencentcloud" - }, - "vultr": { - "name": "Vultr", - "package_name": "certbot-dns-vultr", - "version": "~=1.1.0", - "dependencies": "", - "credentials": "dns_vultr_key = YOUR_VULTR_API_KEY", - "full_plugin_name": "dns-vultr" - }, - "websupportsk": { - "name": "Websupport.sk", - "package_name": "certbot-dns-websupportsk", - "version": "~=0.1.6", - "dependencies": "", - "credentials": "dns_websupportsk_api_key = \ndns_websupportsk_secret = \ndns_websupportsk_domain = example.com", - "full_plugin_name": "dns-websupportsk" - } + "acmedns": { + "display_name": "ACME-DNS", + "package_name": "certbot-dns-acmedns", + "credentials": "dns_acmedns_api_url = http://acmedns-server/\ndns_acmedns_registration_file = /data/tls/certbot/acme-registration.json", + "full_plugin_name": "dns-acmedns" + }, + "aliyun": { + "display_name": "Aliyun", + "package_name": "certbot-dns-aliyun", + "credentials": "dns_aliyun_access_key = 12345678\ndns_aliyun_access_key_secret = 1234567890abcdef1234567890abcdef", + "full_plugin_name": "dns-aliyun" + }, + "azure": { + "display_name": "Azure", + "package_name": "certbot-dns-azure", + "credentials": "# This plugin supported API authentication using either Service Principals or utilizing a Managed Identity assigned to the virtual machine.\n# Regardless which authentication method used, the identity will need the “DNS Zone Contributor” role assigned to it.\n# As multiple Azure DNS Zones in multiple resource groups can exist, the config file needs a mapping of zone to resource group ID. Multiple zones -> ID mappings can be listed by using the key dns_azure_zoneX where X is a unique number. At least 1 zone mapping is required.\n\n# Using a service principal (option 1)\ndns_azure_sp_client_id = 912ce44a-0156-4669-ae22-c16a17d34ca5\ndns_azure_sp_client_secret = E-xqXU83Y-jzTI6xe9fs2YC~mck3ZzUih9\ndns_azure_tenant_id = ed1090f3-ab18-4b12-816c-599af8a88cf7\n\n# Using used assigned MSI (option 2)\n# dns_azure_msi_client_id = 912ce44a-0156-4669-ae22-c16a17d34ca5\n\n# Using system assigned MSI (option 3)\n# dns_azure_msi_system_assigned = true\n\n# Zones (at least one always required)\ndns_azure_zone1 = example.com:/subscriptions/c135abce-d87d-48df-936c-15596c6968a5/resourceGroups/dns1\ndns_azure_zone2 = example.org:/subscriptions/99800903-fb14-4992-9aff-12eaf2744622/resourceGroups/dns2", + "full_plugin_name": "dns-azure" + }, + "bunny": { + "display_name": "bunny.net", + "package_name": "certbot-dns-bunny", + "credentials": "# Bunny API token used by Certbot (see https://dash.bunny.net/account/settings)\ndns_bunny_api_key = xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx", + "full_plugin_name": "dns-bunny" + }, + "cloudflare": { + "display_name": "Cloudflare", + "package_name": "certbot-dns-cloudflare", + "credentials": "# Cloudflare API token\ndns_cloudflare_api_token = 0123456789abcdef0123456789abcdef01234567\n# OR Cloudflare API credentials\n#dns_cloudflare_email = cloudflare@example.com\n#dns_cloudflare_api_key = 0123456789abcdef0123456789abcdef01234", + "full_plugin_name": "dns-cloudflare" + }, + "cloudns": { + "display_name": "ClouDNS", + "package_name": "certbot-dns-cloudns", + "credentials": "# Target user ID (see https://www.cloudns.net/api-settings/)\n\tdns_cloudns_auth_id=1234\n\t# Alternatively, one of the following two options can be set:\n\t# dns_cloudns_sub_auth_id=1234\n\t# dns_cloudns_sub_auth_user=foobar\n\n\t# API password\n\tdns_cloudns_auth_password=password1", + "full_plugin_name": "dns-cloudns" + }, + "cloudxns": { + "display_name": "CloudXNS", + "package_name": "certbot-dns-cloudxns", + "credentials": "dns_cloudxns_api_key = 1234567890abcdef1234567890abcdef\ndns_cloudxns_secret_key = 1122334455667788", + "full_plugin_name": "dns-cloudxns" + }, + "constellix": { + "display_name": "Constellix", + "package_name": "certbot-dns-constellix", + "credentials": "dns_constellix_apikey = 5fb4e76f-ac91-43e5-f982458bc595\ndns_constellix_secretkey = 47d99fd0-32e7-4e07-85b46d08e70b\ndns_constellix_endpoint = https://api.dns.constellix.com/v1", + "full_plugin_name": "dns-constellix" + }, + "corenetworks": { + "display_name": "Core Networks", + "package_name": "certbot-dns-corenetworks", + "credentials": "dns_corenetworks_username = asaHB12r\ndns_corenetworks_password = secure_password", + "full_plugin_name": "dns-corenetworks" + }, + "cpanel": { + "display_name": "cPanel", + "package_name": "certbot-dns-cpanel", + "credentials": "cpanel_url = https://cpanel.example.com:2083\ncpanel_username = user\ncpanel_password = hunter2", + "full_plugin_name": "cpanel" + }, + "desec": { + "display_name": "deSEC", + "package_name": "certbot-dns-desec", + "credentials": "dns_desec_token = YOUR_DESEC_API_TOKEN\ndns_desec_endpoint = https://desec.io/api/v1/", + "full_plugin_name": "dns-desec" + }, + "duckdns": { + "display_name": "DuckDNS", + "package_name": "certbot-dns-duckdns", + "credentials": "dns_duckdns_token=your-duckdns-token", + "full_plugin_name": "dns-duckdns" + }, + "digitalocean": { + "display_name": "DigitalOcean", + "package_name": "certbot-dns-digitalocean", + "credentials": "dns_digitalocean_token = 0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff", + "full_plugin_name": "dns-digitalocean" + }, + "directadmin": { + "display_name": "DirectAdmin", + "package_name": "certbot-dns-directadmin", + "credentials": "directadmin_url = https://my.directadminserver.com:2222\ndirectadmin_username = username\ndirectadmin_password = aSuperStrongPassword", + "full_plugin_name": "directadmin" + }, + "dnsimple": { + "display_name": "DNSimple", + "package_name": "certbot-dns-dnsimple", + "credentials": "dns_dnsimple_token = MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw", + "full_plugin_name": "dns-dnsimple" + }, + "dnsmadeeasy": { + "display_name": "DNS Made Easy", + "package_name": "certbot-dns-dnsmadeeasy", + "credentials": "dns_dnsmadeeasy_api_key = 1c1a3c91-4770-4ce7-96f4-54c0eb0e457a\ndns_dnsmadeeasy_secret_key = c9b5625f-9834-4ff8-baba-4ed5f32cae55", + "full_plugin_name": "dns-dnsmadeeasy" + }, + "dnspod": { + "display_name": "DNSPod", + "package_name": "certbot-dnspod", + "credentials": "certbot_dnspod_token = \ncertbot_dnspod_token_id = ", + "full_plugin_name": "certbot-dnspod" + }, + "domainoffensive": { + "display_name": "DomainOffensive (do.de)", + "package_name": "certbot-dns-do", + "credentials": "dns_do_api_token = YOUR_DO_DE_AUTH_TOKEN", + "full_plugin_name": "dns-do" + }, + "domeneshop": { + "display_name": "Domeneshop", + "package_name": "certbot-dns-domeneshop", + "credentials": "dns_domeneshop_client_token=YOUR_DOMENESHOP_CLIENT_TOKEN\ndns_domeneshop_client_secret=YOUR_DOMENESHOP_CLIENT_SECRET", + "full_plugin_name": "dns-domeneshop" + }, + "dynu": { + "display_name": "Dynu", + "package_name": "certbot-dns-dynu", + "credentials": "dns_dynu_auth_token = YOUR_DYNU_AUTH_TOKEN", + "full_plugin_name": "dns-dynu" + }, + "eurodns": { + "display_name": "EuroDNS", + "package_name": "certbot-dns-eurodns", + "credentials": "dns_eurodns_applicationId = myuser\ndns_eurodns_apiKey = mysecretpassword\ndns_eurodns_endpoint = https://rest-api.eurodns.com/user-api-gateway/proxy", + "full_plugin_name": "dns-eurodns" + }, + "gandi": { + "display_name": "Gandi Live DNS", + "package_name": "certbot_plugin_gandi", + "credentials": "# Gandi personal access token\ndns_gandi_token=PERSONAL_ACCESS_TOKEN", + "full_plugin_name": "dns-gandi" + }, + "godaddy": { + "display_name": "GoDaddy", + "package_name": "certbot-dns-godaddy", + "credentials": "dns_godaddy_secret = 0123456789abcdef0123456789abcdef01234567\ndns_godaddy_key = abcdef0123456789abcdef01234567abcdef0123", + "full_plugin_name": "dns-godaddy" + }, + "google": { + "display_name": "Google", + "package_name": "certbot-dns-google", + "credentials": "{\n\"type\": \"service_account\",\n...\n}", + "full_plugin_name": "dns-google" + }, + "googledomains": { + "display_name": "GoogleDomainsDNS", + "package_name": "certbot-dns-google-domains", + "credentials": "dns_google_domains_access_token = 0123456789abcdef0123456789abcdef01234567\ndns_google_domains_zone = \"example.com\"", + "full_plugin_name": "dns-google-domains" + }, + "he": { + "display_name": "Hurricane Electric", + "package_name": "certbot-dns-he", + "credentials": "dns_he_user = Me\ndns_he_pass = my HE password", + "full_plugin_name": "dns-he" + }, + "hetzner": { + "display_name": "Hetzner", + "package_name": "certbot-dns-hetzner", + "credentials": "dns_hetzner_api_token = 0123456789abcdef0123456789abcdef", + "full_plugin_name": "dns-hetzner" + }, + "infomaniak": { + "display_name": "Infomaniak", + "package_name": "certbot-dns-infomaniak", + "credentials": "dns_infomaniak_token = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "full_plugin_name": "dns-infomaniak" + }, + "inwx": { + "display_name": "INWX", + "package_name": "certbot-dns-inwx", + "credentials": "dns_inwx_url = https://api.domrobot.com/xmlrpc/\ndns_inwx_username = your_username\ndns_inwx_password = your_password\ndns_inwx_shared_secret = your_shared_secret optional", + "full_plugin_name": "dns-inwx" + }, + "ionos": { + "display_name": "IONOS", + "package_name": "certbot-dns-ionos", + "credentials": "dns_ionos_prefix = myapikeyprefix\ndns_ionos_secret = verysecureapikeysecret\ndns_ionos_endpoint = https://api.hosting.ionos.com", + "full_plugin_name": "dns-ionos" + }, + "ispconfig": { + "display_name": "ISPConfig", + "package_name": "certbot-dns-ispconfig", + "credentials": "dns_ispconfig_username = myremoteuser\ndns_ispconfig_password = verysecureremoteuserpassword\ndns_ispconfig_endpoint = https://localhost:8080", + "full_plugin_name": "dns-ispconfig" + }, + "isset": { + "display_name": "Isset", + "package_name": "certbot-dns-isset", + "credentials": "dns_isset_endpoint=\"https://customer.isset.net/api\"\ndns_isset_token=\"\"", + "full_plugin_name": "dns-isset" + }, + "joker": { + "display_name": "Joker", + "package_name": "certbot-dns-joker", + "credentials": "dns_joker_username = \ndns_joker_password = \ndns_joker_domain = ", + "full_plugin_name": "dns-joker" + }, + "linode": { + "display_name": "Linode", + "package_name": "certbot-dns-linode", + "credentials": "dns_linode_key = 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ64\ndns_linode_version = [|3|4]", + "full_plugin_name": "dns-linode" + }, + "loopia": { + "display_name": "Loopia", + "package_name": "certbot-dns-loopia", + "credentials": "dns_loopia_user = user@loopiaapi\ndns_loopia_password = abcdef0123456789abcdef01234567abcdef0123", + "full_plugin_name": "dns-loopia" + }, + "luadns": { + "display_name": "LuaDNS", + "package_name": "certbot-dns-luadns", + "credentials": "dns_luadns_email = user@example.com\ndns_luadns_token = 0123456789abcdef0123456789abcdef", + "full_plugin_name": "dns-luadns" + }, + "namecheap": { + "display_name": "Namecheap", + "package_name": "certbot-dns-namecheap", + "credentials": "dns_namecheap_username = 123456\ndns_namecheap_api_key = 0123456789abcdef0123456789abcdef01234567", + "full_plugin_name": "dns-namecheap" + }, + "netcup": { + "display_name": "netcup", + "package_name": "certbot-dns-netcup", + "credentials": "dns_netcup_customer_id = 123456\ndns_netcup_api_key = 0123456789abcdef0123456789abcdef01234567\ndns_netcup_api_password = abcdef0123456789abcdef01234567abcdef0123", + "full_plugin_name": "dns-netcup" + }, + "njalla": { + "display_name": "Njalla", + "package_name": "certbot-dns-njalla", + "credentials": "dns_njalla_token = 0123456789abcdef0123456789abcdef01234567", + "full_plugin_name": "dns-njalla" + }, + "nsone": { + "display_name": "NS1", + "package_name": "certbot-dns-nsone", + "credentials": "dns_nsone_api_key = MDAwMDAwMDAwMDAwMDAw", + "full_plugin_name": "dns-nsone" + }, + "oci": { + "display_name": "Oracle Cloud Infrastructure DNS", + "package_name": "certbot-dns-oci", + "credentials": "[DEFAULT]\nuser = ocid1.user.oc1...\nfingerprint = xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx\ntenancy = ocid1.tenancy.oc1...\nregion = us-ashburn-1\nkey_file = ~/.oci/oci_api_key.pem", + "full_plugin_name": "dns-oci" + }, + "online": { + "display_name": "Online", + "package_name": "certbot-dns-online", + "credentials": "dns_online_token=0123456789abcdef0123456789abcdef01234567", + "full_plugin_name": "dns-online" + }, + "ovh": { + "display_name": "OVH", + "package_name": "certbot-dns-ovh", + "credentials": "dns_ovh_endpoint = ovh-eu\ndns_ovh_application_key = MDAwMDAwMDAwMDAw\ndns_ovh_application_secret = MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw\ndns_ovh_consumer_key = MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw", + "full_plugin_name": "dns-ovh" + }, + "plesk": { + "display_name": "Plesk", + "package_name": "certbot-dns-plesk", + "credentials": "dns_plesk_username = your-username\ndns_plesk_password = secret\ndns_plesk_api_url = https://plesk-api-host:8443", + "full_plugin_name": "dns-plesk" + }, + "porkbun": { + "display_name": "Porkbun", + "package_name": "certbot-dns-porkbun", + "credentials": "dns_porkbun_key=your-porkbun-api-key\ndns_porkbun_secret=your-porkbun-api-secret", + "full_plugin_name": "dns-porkbun" + }, + "powerdns": { + "display_name": "PowerDNS", + "package_name": "certbot-dns-powerdns", + "credentials": "dns_powerdns_api_url = https://api.mypowerdns.example.org\ndns_powerdns_api_key = AbCbASsd!@34", + "full_plugin_name": "dns-powerdns" + }, + "regru": { + "display_name": "reg.ru", + "package_name": "certbot-regru", + "credentials": "dns_username=username\ndns_password=password", + "full_plugin_name": "dns" + }, + "rfc2136": { + "display_name": "RFC 2136", + "package_name": "certbot-dns-rfc2136", + "credentials": "# Target DNS server\ndns_rfc2136_server = 192.0.2.1\n# Target DNS port\ndns_rfc2136_port = 53\n# TSIG key name\ndns_rfc2136_name = keyname.\n# TSIG key secret\ndns_rfc2136_secret = 4q4wM/2I180UXoMyN4INVhJNi8V9BCV+jMw2mXgZw/CSuxUT8C7NKKFs AmKd7ak51vWKgSl12ib86oQRPkpDjg==\n# TSIG key algorithm\ndns_rfc2136_algorithm = HMAC-SHA512", + "full_plugin_name": "dns-rfc2136" + }, + "strato": { + "display_name": "Strato", + "package_name": "certbot-dns-strato", + "credentials": "dns_strato_username = user\ndns_strato_password = pass\n# uncomment if you are using two factor authentication:\n# dns_strato_totp_devicename = 2fa_device\n# dns_strato_totp_secret = 2fa_secret\n#\n# uncomment if domain name contains special characters\n# insert domain display name as seen on your account page here\n# dns_strato_domain_display_name = my-punicode-url.de\n#\n# if you are not using strato.de or another special endpoint you can customise it below\n# you will probably only need to adjust the host, but you can also change the complete endpoint url\n# dns_strato_custom_api_scheme = https\n# dns_strato_custom_api_host = www.strato.de\n# dns_strato_custom_api_port = 443\n# dns_strato_custom_api_path = \"/apps/CustomerService\"", + "full_plugin_name": "dns-strato" + }, + "transip": { + "display_name": "TransIP", + "package_name": "certbot-dns-transip", + "credentials": "dns_transip_username = my_username\ndns_transip_key_file = /data/tls/certbot/transip-rsa.key", + "full_plugin_name": "dns-transip" + }, + "tencentcloud": { + "display_name": "Tencent Cloud", + "package_name": "certbot-dns-tencentcloud", + "credentials": "dns_tencentcloud_secret_id = TENCENT_CLOUD_SECRET_ID\ndns_tencentcloud_secret_key = TENCENT_CLOUD_SECRET_KEY", + "full_plugin_name": "dns-tencentcloud" + }, + "vultr": { + "display_name": "Vultr", + "package_name": "certbot-dns-vultr", + "credentials": "dns_vultr_key = YOUR_VULTR_API_KEY", + "full_plugin_name": "dns-vultr" + }, + "websupportsk": { + "display_name": "Websupport.sk", + "package_name": "certbot-dns-websupportsk", + "credentials": "dns_websupportsk_api_key = \ndns_websupportsk_secret = \ndns_websupportsk_domain = example.com", + "full_plugin_name": "dns-websupportsk" + } }