Added backend generated dns providers arch

- Added acmedns
- Added auto dns credential form generator
This commit is contained in:
Toby Chui 2024-05-10 23:34:02 +08:00
parent 55bc939a37
commit 3454a9b975
7 changed files with 5250 additions and 555 deletions

View File

@ -5,6 +5,7 @@ import (
"net/http"
"net/http/pprof"
"imuslab.com/zoraxy/mod/acme/acmedns"
"imuslab.com/zoraxy/mod/acme/acmewizard"
"imuslab.com/zoraxy/mod/auth"
"imuslab.com/zoraxy/mod/netstat"
@ -191,6 +192,7 @@ func initAPIs() {
authRouter.HandleFunc("/api/acme/autoRenew/listDomains", acmeAutoRenewer.HandleLoadAutoRenewDomains)
authRouter.HandleFunc("/api/acme/autoRenew/renewPolicy", acmeAutoRenewer.HandleRenewPolicy)
authRouter.HandleFunc("/api/acme/autoRenew/renewNow", acmeAutoRenewer.HandleRenewNow)
authRouter.HandleFunc("/api/acme/dns/providers", acmedns.HandleServeProvidersJson)
authRouter.HandleFunc("/api/acme/wizard", acmewizard.HandleGuidedStepCheck) //ACME Wizard
//Static Web Server

View File

@ -0,0 +1,982 @@
package acmedns
/*
THIS MODULE IS GENERATED AUTOMATICALLY
DO NOT EDIT THIS FILE
*/
import (
"encoding/json"
"fmt"
"github.com/go-acme/lego/v4/challenge"
"github.com/go-acme/lego/v4/providers/dns/alidns"
"github.com/go-acme/lego/v4/providers/dns/allinkl"
"github.com/go-acme/lego/v4/providers/dns/arvancloud"
"github.com/go-acme/lego/v4/providers/dns/auroradns"
"github.com/go-acme/lego/v4/providers/dns/autodns"
"github.com/go-acme/lego/v4/providers/dns/azure"
"github.com/go-acme/lego/v4/providers/dns/azuredns"
"github.com/go-acme/lego/v4/providers/dns/bindman"
"github.com/go-acme/lego/v4/providers/dns/bluecat"
"github.com/go-acme/lego/v4/providers/dns/brandit"
"github.com/go-acme/lego/v4/providers/dns/bunny"
"github.com/go-acme/lego/v4/providers/dns/checkdomain"
"github.com/go-acme/lego/v4/providers/dns/civo"
"github.com/go-acme/lego/v4/providers/dns/clouddns"
"github.com/go-acme/lego/v4/providers/dns/cloudflare"
"github.com/go-acme/lego/v4/providers/dns/cloudns"
"github.com/go-acme/lego/v4/providers/dns/cloudru"
"github.com/go-acme/lego/v4/providers/dns/cloudxns"
"github.com/go-acme/lego/v4/providers/dns/conoha"
"github.com/go-acme/lego/v4/providers/dns/constellix"
"github.com/go-acme/lego/v4/providers/dns/cpanel"
"github.com/go-acme/lego/v4/providers/dns/derak"
"github.com/go-acme/lego/v4/providers/dns/desec"
"github.com/go-acme/lego/v4/providers/dns/digitalocean"
"github.com/go-acme/lego/v4/providers/dns/dnshomede"
"github.com/go-acme/lego/v4/providers/dns/dnsimple"
"github.com/go-acme/lego/v4/providers/dns/dnsmadeeasy"
"github.com/go-acme/lego/v4/providers/dns/dnspod"
"github.com/go-acme/lego/v4/providers/dns/dode"
"github.com/go-acme/lego/v4/providers/dns/domeneshop"
"github.com/go-acme/lego/v4/providers/dns/dreamhost"
"github.com/go-acme/lego/v4/providers/dns/duckdns"
"github.com/go-acme/lego/v4/providers/dns/dyn"
"github.com/go-acme/lego/v4/providers/dns/dynu"
"github.com/go-acme/lego/v4/providers/dns/easydns"
"github.com/go-acme/lego/v4/providers/dns/efficientip"
"github.com/go-acme/lego/v4/providers/dns/epik"
"github.com/go-acme/lego/v4/providers/dns/exoscale"
"github.com/go-acme/lego/v4/providers/dns/freemyip"
"github.com/go-acme/lego/v4/providers/dns/gandi"
"github.com/go-acme/lego/v4/providers/dns/gandiv5"
"github.com/go-acme/lego/v4/providers/dns/gcore"
"github.com/go-acme/lego/v4/providers/dns/glesys"
"github.com/go-acme/lego/v4/providers/dns/godaddy"
"github.com/go-acme/lego/v4/providers/dns/googledomains"
"github.com/go-acme/lego/v4/providers/dns/hetzner"
"github.com/go-acme/lego/v4/providers/dns/hostingde"
"github.com/go-acme/lego/v4/providers/dns/hosttech"
"github.com/go-acme/lego/v4/providers/dns/httpnet"
"github.com/go-acme/lego/v4/providers/dns/hyperone"
"github.com/go-acme/lego/v4/providers/dns/ibmcloud"
"github.com/go-acme/lego/v4/providers/dns/iij"
"github.com/go-acme/lego/v4/providers/dns/iijdpf"
"github.com/go-acme/lego/v4/providers/dns/infoblox"
"github.com/go-acme/lego/v4/providers/dns/infomaniak"
"github.com/go-acme/lego/v4/providers/dns/internetbs"
"github.com/go-acme/lego/v4/providers/dns/inwx"
"github.com/go-acme/lego/v4/providers/dns/ionos"
"github.com/go-acme/lego/v4/providers/dns/ipv64"
"github.com/go-acme/lego/v4/providers/dns/iwantmyname"
"github.com/go-acme/lego/v4/providers/dns/joker"
"github.com/go-acme/lego/v4/providers/dns/liara"
"github.com/go-acme/lego/v4/providers/dns/lightsail"
"github.com/go-acme/lego/v4/providers/dns/linode"
"github.com/go-acme/lego/v4/providers/dns/liquidweb"
"github.com/go-acme/lego/v4/providers/dns/loopia"
"github.com/go-acme/lego/v4/providers/dns/luadns"
"github.com/go-acme/lego/v4/providers/dns/mailinabox"
"github.com/go-acme/lego/v4/providers/dns/metaname"
"github.com/go-acme/lego/v4/providers/dns/mydnsjp"
"github.com/go-acme/lego/v4/providers/dns/namecheap"
"github.com/go-acme/lego/v4/providers/dns/namedotcom"
"github.com/go-acme/lego/v4/providers/dns/namesilo"
"github.com/go-acme/lego/v4/providers/dns/nearlyfreespeech"
"github.com/go-acme/lego/v4/providers/dns/netcup"
"github.com/go-acme/lego/v4/providers/dns/netlify"
"github.com/go-acme/lego/v4/providers/dns/nicmanager"
"github.com/go-acme/lego/v4/providers/dns/nifcloud"
"github.com/go-acme/lego/v4/providers/dns/njalla"
"github.com/go-acme/lego/v4/providers/dns/nodion"
"github.com/go-acme/lego/v4/providers/dns/ns1"
"github.com/go-acme/lego/v4/providers/dns/otc"
"github.com/go-acme/lego/v4/providers/dns/ovh"
"github.com/go-acme/lego/v4/providers/dns/pdns"
"github.com/go-acme/lego/v4/providers/dns/plesk"
"github.com/go-acme/lego/v4/providers/dns/porkbun"
"github.com/go-acme/lego/v4/providers/dns/rackspace"
"github.com/go-acme/lego/v4/providers/dns/rcodezero"
"github.com/go-acme/lego/v4/providers/dns/regru"
"github.com/go-acme/lego/v4/providers/dns/rfc2136"
"github.com/go-acme/lego/v4/providers/dns/rimuhosting"
"github.com/go-acme/lego/v4/providers/dns/route53"
"github.com/go-acme/lego/v4/providers/dns/safedns"
"github.com/go-acme/lego/v4/providers/dns/sakuracloud"
"github.com/go-acme/lego/v4/providers/dns/scaleway"
"github.com/go-acme/lego/v4/providers/dns/selectel"
"github.com/go-acme/lego/v4/providers/dns/servercow"
"github.com/go-acme/lego/v4/providers/dns/shellrent"
"github.com/go-acme/lego/v4/providers/dns/simply"
"github.com/go-acme/lego/v4/providers/dns/sonic"
"github.com/go-acme/lego/v4/providers/dns/stackpath"
"github.com/go-acme/lego/v4/providers/dns/tencentcloud"
"github.com/go-acme/lego/v4/providers/dns/transip"
"github.com/go-acme/lego/v4/providers/dns/ultradns"
"github.com/go-acme/lego/v4/providers/dns/variomedia"
"github.com/go-acme/lego/v4/providers/dns/vegadns"
"github.com/go-acme/lego/v4/providers/dns/vercel"
"github.com/go-acme/lego/v4/providers/dns/versio"
"github.com/go-acme/lego/v4/providers/dns/vinyldns"
"github.com/go-acme/lego/v4/providers/dns/vkcloud"
"github.com/go-acme/lego/v4/providers/dns/vscale"
"github.com/go-acme/lego/v4/providers/dns/vultr"
"github.com/go-acme/lego/v4/providers/dns/webnames"
"github.com/go-acme/lego/v4/providers/dns/websupport"
"github.com/go-acme/lego/v4/providers/dns/wedos"
"github.com/go-acme/lego/v4/providers/dns/yandex"
"github.com/go-acme/lego/v4/providers/dns/yandex360"
"github.com/go-acme/lego/v4/providers/dns/yandexcloud"
"github.com/go-acme/lego/v4/providers/dns/zoneee"
"github.com/go-acme/lego/v4/providers/dns/zonomi"
)
//name is the DNS provider name, e.g. cloudflare or gandi
//JSON (js) must be in key-value string that match ConfigableFields Title in providers.json, e.g. {"Username":"far","Password":"boo"}
func GetDNSProviderByJsonConfig(name string, js string)(challenge.Provider, error){
switch name {
case "alidns":
cfg := alidns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return alidns.NewDNSProviderConfig(&cfg)
case "allinkl":
cfg := allinkl.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return allinkl.NewDNSProviderConfig(&cfg)
case "arvancloud":
cfg := arvancloud.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return arvancloud.NewDNSProviderConfig(&cfg)
case "auroradns":
cfg := auroradns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return auroradns.NewDNSProviderConfig(&cfg)
case "autodns":
cfg := autodns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return autodns.NewDNSProviderConfig(&cfg)
case "azure":
cfg := azure.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return azure.NewDNSProviderConfig(&cfg)
case "azuredns":
cfg := azuredns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return azuredns.NewDNSProviderConfig(&cfg)
case "bindman":
cfg := bindman.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return bindman.NewDNSProviderConfig(&cfg)
case "bluecat":
cfg := bluecat.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return bluecat.NewDNSProviderConfig(&cfg)
case "brandit":
cfg := brandit.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return brandit.NewDNSProviderConfig(&cfg)
case "bunny":
cfg := bunny.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return bunny.NewDNSProviderConfig(&cfg)
case "checkdomain":
cfg := checkdomain.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return checkdomain.NewDNSProviderConfig(&cfg)
case "civo":
cfg := civo.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return civo.NewDNSProviderConfig(&cfg)
case "clouddns":
cfg := clouddns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return clouddns.NewDNSProviderConfig(&cfg)
case "cloudflare":
cfg := cloudflare.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return cloudflare.NewDNSProviderConfig(&cfg)
case "cloudns":
cfg := cloudns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return cloudns.NewDNSProviderConfig(&cfg)
case "cloudru":
cfg := cloudru.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return cloudru.NewDNSProviderConfig(&cfg)
case "cloudxns":
cfg := cloudxns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return cloudxns.NewDNSProviderConfig(&cfg)
case "conoha":
cfg := conoha.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return conoha.NewDNSProviderConfig(&cfg)
case "constellix":
cfg := constellix.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return constellix.NewDNSProviderConfig(&cfg)
case "cpanel":
cfg := cpanel.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return cpanel.NewDNSProviderConfig(&cfg)
case "derak":
cfg := derak.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return derak.NewDNSProviderConfig(&cfg)
case "desec":
cfg := desec.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return desec.NewDNSProviderConfig(&cfg)
case "digitalocean":
cfg := digitalocean.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return digitalocean.NewDNSProviderConfig(&cfg)
case "dnshomede":
cfg := dnshomede.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return dnshomede.NewDNSProviderConfig(&cfg)
case "dnsimple":
cfg := dnsimple.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return dnsimple.NewDNSProviderConfig(&cfg)
case "dnsmadeeasy":
cfg := dnsmadeeasy.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return dnsmadeeasy.NewDNSProviderConfig(&cfg)
case "dnspod":
cfg := dnspod.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return dnspod.NewDNSProviderConfig(&cfg)
case "dode":
cfg := dode.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return dode.NewDNSProviderConfig(&cfg)
case "domeneshop":
cfg := domeneshop.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return domeneshop.NewDNSProviderConfig(&cfg)
case "dreamhost":
cfg := dreamhost.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return dreamhost.NewDNSProviderConfig(&cfg)
case "duckdns":
cfg := duckdns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return duckdns.NewDNSProviderConfig(&cfg)
case "dyn":
cfg := dyn.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return dyn.NewDNSProviderConfig(&cfg)
case "dynu":
cfg := dynu.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return dynu.NewDNSProviderConfig(&cfg)
case "easydns":
cfg := easydns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return easydns.NewDNSProviderConfig(&cfg)
case "efficientip":
cfg := efficientip.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return efficientip.NewDNSProviderConfig(&cfg)
case "epik":
cfg := epik.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return epik.NewDNSProviderConfig(&cfg)
case "exoscale":
cfg := exoscale.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return exoscale.NewDNSProviderConfig(&cfg)
case "freemyip":
cfg := freemyip.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return freemyip.NewDNSProviderConfig(&cfg)
case "gandi":
cfg := gandi.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return gandi.NewDNSProviderConfig(&cfg)
case "gandiv5":
cfg := gandiv5.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return gandiv5.NewDNSProviderConfig(&cfg)
case "gcore":
cfg := gcore.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return gcore.NewDNSProviderConfig(&cfg)
case "glesys":
cfg := glesys.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return glesys.NewDNSProviderConfig(&cfg)
case "godaddy":
cfg := godaddy.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return godaddy.NewDNSProviderConfig(&cfg)
case "googledomains":
cfg := googledomains.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return googledomains.NewDNSProviderConfig(&cfg)
case "hetzner":
cfg := hetzner.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return hetzner.NewDNSProviderConfig(&cfg)
case "hostingde":
cfg := hostingde.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return hostingde.NewDNSProviderConfig(&cfg)
case "hosttech":
cfg := hosttech.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return hosttech.NewDNSProviderConfig(&cfg)
case "httpnet":
cfg := httpnet.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return httpnet.NewDNSProviderConfig(&cfg)
case "hyperone":
cfg := hyperone.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return hyperone.NewDNSProviderConfig(&cfg)
case "ibmcloud":
cfg := ibmcloud.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return ibmcloud.NewDNSProviderConfig(&cfg)
case "iij":
cfg := iij.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return iij.NewDNSProviderConfig(&cfg)
case "iijdpf":
cfg := iijdpf.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return iijdpf.NewDNSProviderConfig(&cfg)
case "infoblox":
cfg := infoblox.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return infoblox.NewDNSProviderConfig(&cfg)
case "infomaniak":
cfg := infomaniak.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return infomaniak.NewDNSProviderConfig(&cfg)
case "internetbs":
cfg := internetbs.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return internetbs.NewDNSProviderConfig(&cfg)
case "inwx":
cfg := inwx.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return inwx.NewDNSProviderConfig(&cfg)
case "ionos":
cfg := ionos.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return ionos.NewDNSProviderConfig(&cfg)
case "ipv64":
cfg := ipv64.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return ipv64.NewDNSProviderConfig(&cfg)
case "iwantmyname":
cfg := iwantmyname.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return iwantmyname.NewDNSProviderConfig(&cfg)
case "joker":
cfg := joker.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return joker.NewDNSProviderConfig(&cfg)
case "liara":
cfg := liara.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return liara.NewDNSProviderConfig(&cfg)
case "lightsail":
cfg := lightsail.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return lightsail.NewDNSProviderConfig(&cfg)
case "linode":
cfg := linode.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return linode.NewDNSProviderConfig(&cfg)
case "liquidweb":
cfg := liquidweb.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return liquidweb.NewDNSProviderConfig(&cfg)
case "loopia":
cfg := loopia.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return loopia.NewDNSProviderConfig(&cfg)
case "luadns":
cfg := luadns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return luadns.NewDNSProviderConfig(&cfg)
case "mailinabox":
cfg := mailinabox.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return mailinabox.NewDNSProviderConfig(&cfg)
case "metaname":
cfg := metaname.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return metaname.NewDNSProviderConfig(&cfg)
case "mydnsjp":
cfg := mydnsjp.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return mydnsjp.NewDNSProviderConfig(&cfg)
case "namecheap":
cfg := namecheap.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return namecheap.NewDNSProviderConfig(&cfg)
case "namedotcom":
cfg := namedotcom.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return namedotcom.NewDNSProviderConfig(&cfg)
case "namesilo":
cfg := namesilo.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return namesilo.NewDNSProviderConfig(&cfg)
case "nearlyfreespeech":
cfg := nearlyfreespeech.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return nearlyfreespeech.NewDNSProviderConfig(&cfg)
case "netcup":
cfg := netcup.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return netcup.NewDNSProviderConfig(&cfg)
case "netlify":
cfg := netlify.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return netlify.NewDNSProviderConfig(&cfg)
case "nicmanager":
cfg := nicmanager.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return nicmanager.NewDNSProviderConfig(&cfg)
case "nifcloud":
cfg := nifcloud.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return nifcloud.NewDNSProviderConfig(&cfg)
case "njalla":
cfg := njalla.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return njalla.NewDNSProviderConfig(&cfg)
case "nodion":
cfg := nodion.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return nodion.NewDNSProviderConfig(&cfg)
case "ns1":
cfg := ns1.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return ns1.NewDNSProviderConfig(&cfg)
case "otc":
cfg := otc.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return otc.NewDNSProviderConfig(&cfg)
case "ovh":
cfg := ovh.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return ovh.NewDNSProviderConfig(&cfg)
case "pdns":
cfg := pdns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return pdns.NewDNSProviderConfig(&cfg)
case "plesk":
cfg := plesk.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return plesk.NewDNSProviderConfig(&cfg)
case "porkbun":
cfg := porkbun.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return porkbun.NewDNSProviderConfig(&cfg)
case "rackspace":
cfg := rackspace.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return rackspace.NewDNSProviderConfig(&cfg)
case "rcodezero":
cfg := rcodezero.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return rcodezero.NewDNSProviderConfig(&cfg)
case "regru":
cfg := regru.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return regru.NewDNSProviderConfig(&cfg)
case "rfc2136":
cfg := rfc2136.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return rfc2136.NewDNSProviderConfig(&cfg)
case "rimuhosting":
cfg := rimuhosting.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return rimuhosting.NewDNSProviderConfig(&cfg)
case "route53":
cfg := route53.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return route53.NewDNSProviderConfig(&cfg)
case "safedns":
cfg := safedns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return safedns.NewDNSProviderConfig(&cfg)
case "sakuracloud":
cfg := sakuracloud.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return sakuracloud.NewDNSProviderConfig(&cfg)
case "scaleway":
cfg := scaleway.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return scaleway.NewDNSProviderConfig(&cfg)
case "selectel":
cfg := selectel.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return selectel.NewDNSProviderConfig(&cfg)
case "servercow":
cfg := servercow.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return servercow.NewDNSProviderConfig(&cfg)
case "shellrent":
cfg := shellrent.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return shellrent.NewDNSProviderConfig(&cfg)
case "simply":
cfg := simply.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return simply.NewDNSProviderConfig(&cfg)
case "sonic":
cfg := sonic.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return sonic.NewDNSProviderConfig(&cfg)
case "stackpath":
cfg := stackpath.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return stackpath.NewDNSProviderConfig(&cfg)
case "tencentcloud":
cfg := tencentcloud.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return tencentcloud.NewDNSProviderConfig(&cfg)
case "transip":
cfg := transip.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return transip.NewDNSProviderConfig(&cfg)
case "ultradns":
cfg := ultradns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return ultradns.NewDNSProviderConfig(&cfg)
case "variomedia":
cfg := variomedia.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return variomedia.NewDNSProviderConfig(&cfg)
case "vegadns":
cfg := vegadns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return vegadns.NewDNSProviderConfig(&cfg)
case "vercel":
cfg := vercel.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return vercel.NewDNSProviderConfig(&cfg)
case "versio":
cfg := versio.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return versio.NewDNSProviderConfig(&cfg)
case "vinyldns":
cfg := vinyldns.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return vinyldns.NewDNSProviderConfig(&cfg)
case "vkcloud":
cfg := vkcloud.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return vkcloud.NewDNSProviderConfig(&cfg)
case "vscale":
cfg := vscale.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return vscale.NewDNSProviderConfig(&cfg)
case "vultr":
cfg := vultr.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return vultr.NewDNSProviderConfig(&cfg)
case "webnames":
cfg := webnames.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return webnames.NewDNSProviderConfig(&cfg)
case "websupport":
cfg := websupport.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return websupport.NewDNSProviderConfig(&cfg)
case "wedos":
cfg := wedos.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return wedos.NewDNSProviderConfig(&cfg)
case "yandex":
cfg := yandex.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return yandex.NewDNSProviderConfig(&cfg)
case "yandex360":
cfg := yandex360.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return yandex360.NewDNSProviderConfig(&cfg)
case "yandexcloud":
cfg := yandexcloud.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return yandexcloud.NewDNSProviderConfig(&cfg)
case "zoneee":
cfg := zoneee.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return zoneee.NewDNSProviderConfig(&cfg)
case "zonomi":
cfg := zonomi.Config{}
err := json.Unmarshal([]byte(js), &cfg)
if err != nil {
return nil, err
}
return zonomi.NewDNSProviderConfig(&cfg)
default:
return nil, fmt.Errorf("unrecognized DNS provider: %s", name)
}
}

View File

@ -0,0 +1,27 @@
package acmedns_test
import (
"fmt"
"testing"
"imuslab.com/zoraxy/mod/acme/acmedns"
)
// Test if the structure of ACME DNS config can be reflected from lego source code definations
func TestACMEDNSConfigStructureReflector(t *testing.T) {
providers := []string{
"gandi",
"cloudflare",
"azure",
}
for _, provider := range providers {
strcture, err := acmedns.GetProviderConfigStructure(provider)
if err != nil {
panic(err)
}
fmt.Println(strcture)
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,80 @@
package acmedns
import (
_ "embed"
"encoding/json"
"errors"
"net/http"
"imuslab.com/zoraxy/mod/utils"
)
//go:embed providers.json
var providers []byte //A list of providers generated by acmedns code-generator
type ConfigTemplate struct {
Name string `json:"Name"`
ConfigableFields []struct {
Title string `json:"Title"`
Datatype string `json:"Datatype"`
} `json:"ConfigableFields"`
HiddenFields []struct {
Title string `json:"Title"`
Datatype string `json:"Datatype"`
} `json:"HiddenFields"`
}
// Return a map of string => datatype
func GetProviderConfigStructure(providerName string) (map[string]string, error) {
//Load the target config template from embedded providers.json
configTemplateMap := map[string]ConfigTemplate{}
err := json.Unmarshal(providers, &configTemplateMap)
if err != nil {
return map[string]string{}, err
}
targetConfigTemplate, ok := configTemplateMap[providerName]
if !ok {
return map[string]string{}, errors.New("provider not supported")
}
results := map[string]string{}
for _, field := range targetConfigTemplate.ConfigableFields {
results[field.Title] = field.Datatype
}
return results, nil
}
// HandleServeProvidersJson return the list of supported providers as json
func HandleServeProvidersJson(w http.ResponseWriter, r *http.Request) {
providerName, _ := utils.GetPara(r, "name")
if providerName == "" {
//Send the current list of providers
configTemplateMap := map[string]ConfigTemplate{}
err := json.Unmarshal(providers, &configTemplateMap)
if err != nil {
utils.SendErrorResponse(w, "failed to load DNS provider")
return
}
//Parse the provider names into an array
providers := []string{}
for providerName, _ := range configTemplateMap {
providers = append(providers, providerName)
}
js, _ := json.Marshal(providers)
utils.SendJSONResponse(w, string(js))
return
}
//Get the config for that provider
confTemplate, err := GetProviderConfigStructure(providerName)
if err != nil {
utils.SendErrorResponse(w, err.Error())
return
}
js, _ := json.Marshal(confTemplate)
utils.SendJSONResponse(w, string(js))
}

View File

@ -122,153 +122,30 @@
</div>
<div class="field dnsChallengeOnly" style="display:none;">
<label>DNS Provider</label>
<div class="ui selection dropdown" id="dnsProvider">
<input type="hidden" name="dnsProvider">
<div class="ui search selection dropdown" id="dnsProvider">
<input type="hidden" name="dnsProvider" value="">
<i class="dropdown icon"></i>
<div class="default text">Please Choose...</div>
<div class="menu">
<!-- List of supported DNS providers with acme-lego 4.16 -->
<!-- The file proivders-scraper-util.js can be used to generate the list of providers -->
<div class="item" data-value="edgedns">Akamai EdgeDNS</div>
<div class="item" data-value="alidns">Alibaba Cloud DNS</div>
<div class="item" data-value="allinkl">all-inkl</div>
<div class="item" data-value="lightsail">Amazon Lightsail</div>
<div class="item" data-value="route53">Amazon Route 53</div>
<div class="item" data-value="arvancloud">ArvanCloud</div>
<div class="item" data-value="auroradns">Aurora DNS</div>
<div class="item" data-value="autodns">Autodns</div>
<div class="item" data-value="azure">Azure (deprecated)</div>
<div class="item" data-value="azuredns">Azure DNS</div>
<div class="item" data-value="bindman">Bindman</div>
<div class="item" data-value="bluecat">Bluecat</div>
<div class="item" data-value="brandit">Brandit</div>
<div class="item" data-value="bunny">Bunny</div>
<div class="item" data-value="checkdomain">Checkdomain</div>
<div class="item" data-value="civo">Civo</div>
<div class="item" data-value="cloudru">Cloud.ru</div>
<div class="item" data-value="clouddns">CloudDNS</div>
<div class="item" data-value="cloudflare">Cloudflare</div>
<div class="item" data-value="cloudns">ClouDNS</div>
<div class="item" data-value="cloudxns">CloudXNS</div>
<div class="item" data-value="conoha">ConoHa</div>
<div class="item" data-value="constellix">Constellix</div>
<div class="item" data-value="cpanel">CPanel/WHM</div>
<div class="item" data-value="derak">Derak Cloud</div>
<div class="item" data-value="desec">deSEC.io</div>
<div class="item" data-value="designate">Designate DNSaaS for Openstack</div>
<div class="item" data-value="digitalocean">Digital Ocean</div>
<div class="item" data-value="dnsmadeeasy">DNS Made Easy</div>
<div class="item" data-value="dnshomede">dnsHome.de</div>
<div class="item" data-value="dnsimple">DNSimple</div>
<div class="item" data-value="dnspod">DNSPod (deprecated)</div>
<div class="item" data-value="dode">Domain Offensive (do.de)</div>
<div class="item" data-value="domeneshop">Domeneshop</div>
<div class="item" data-value="dreamhost">DreamHost</div>
<div class="item" data-value="duckdns">Duck DNS</div>
<div class="item" data-value="dyn">Dyn</div>
<div class="item" data-value="dynu">Dynu</div>
<div class="item" data-value="easydns">EasyDNS</div>
<div class="item" data-value="efficientip">Efficient IP</div>
<div class="item" data-value="epik">Epik</div>
<div class="item" data-value="exoscale">Exoscale</div>
<div class="item" data-value="exec">External program</div>
<div class="item" data-value="freemyip">freemyip.com</div>
<div class="item" data-value="gcore">G-Core</div>
<div class="item" data-value="gandi">Gandi</div>
<div class="item" data-value="gandiv5">Gandi Live DNS (v5)</div>
<div class="item" data-value="glesys">Glesys</div>
<div class="item" data-value="godaddy">Go Daddy</div>
<div class="item" data-value="gcloud">Google Cloud</div>
<div class="item" data-value="googledomains">Google Domains</div>
<div class="item" data-value="hetzner">Hetzner</div>
<div class="item" data-value="hostingde">Hosting.de</div>
<div class="item" data-value="hosttech">Hosttech</div>
<div class="item" data-value="httpreq">HTTP request</div>
<div class="item" data-value="httpnet">http.net</div>
<div class="item" data-value="hurricane">Hurricane Electric DNS</div>
<div class="item" data-value="hyperone">HyperOne</div>
<div class="item" data-value="ibmcloud">IBM Cloud (SoftLayer)</div>
<div class="item" data-value="iijdpf">IIJ DNS Platform Service</div>
<div class="item" data-value="infoblox">Infoblox</div>
<div class="item" data-value="infomaniak">Infomaniak</div>
<div class="item" data-value="iij">Internet Initiative Japan</div>
<div class="item" data-value="internetbs">Internet.bs</div>
<div class="item" data-value="inwx">INWX</div>
<div class="item" data-value="ionos">Ionos</div>
<div class="item" data-value="ipv64">IPv64</div>
<div class="item" data-value="iwantmyname">iwantmyname</div>
<div class="item" data-value="joker">Joker</div>
<div class="item" data-value="acme-dns">Joohoi's ACME-DNS</div>
<div class="item" data-value="liara">Liara</div>
<div class="item" data-value="linode">Linode (v4)</div>
<div class="item" data-value="liquidweb">Liquid Web</div>
<div class="item" data-value="loopia">Loopia</div>
<div class="item" data-value="luadns">LuaDNS</div>
<div class="item" data-value="mailinabox">Mail-in-a-Box</div>
<div class="item" data-value="metaname">Metaname</div>
<div class="item" data-value="mydnsjp">MyDNS.jp</div>
<div class="item" data-value="mythicbeasts">MythicBeasts</div>
<div class="item" data-value="namedotcom">Name.com</div>
<div class="item" data-value="namecheap">Namecheap</div>
<div class="item" data-value="namesilo">Namesilo</div>
<div class="item" data-value="nearlyfreespeech">NearlyFreeSpeech.NET</div>
<div class="item" data-value="netcup">Netcup</div>
<div class="item" data-value="netlify">Netlify</div>
<div class="item" data-value="nicmanager">Nicmanager</div>
<div class="item" data-value="nifcloud">NIFCloud</div>
<div class="item" data-value="njalla">Njalla</div>
<div class="item" data-value="nodion">Nodion</div>
<div class="item" data-value="ns1">NS1</div>
<div class="item" data-value="otc">Open Telekom Cloud</div>
<div class="item" data-value="oraclecloud">Oracle Cloud</div>
<div class="item" data-value="ovh">OVH</div>
<div class="item" data-value="plesk">plesk.com</div>
<div class="item" data-value="porkbun">Porkbun</div>
<div class="item" data-value="pdns">PowerDNS</div>
<div class="item" data-value="rackspace">Rackspace</div>
<div class="item" data-value="rcodezero">RcodeZero</div>
<div class="item" data-value="regru">reg.ru</div>
<div class="item" data-value="rfc2136">RFC2136</div>
<div class="item" data-value="rimuhosting">RimuHosting</div>
<div class="item" data-value="sakuracloud">Sakura Cloud</div>
<div class="item" data-value="scaleway">Scaleway</div>
<div class="item" data-value="selectel">Selectel</div>
<div class="item" data-value="servercow">Servercow</div>
<div class="item" data-value="shellrent">Shellrent</div>
<div class="item" data-value="simply">Simply.com</div>
<div class="item" data-value="sonic">Sonic</div>
<div class="item" data-value="stackpath">Stackpath</div>
<div class="item" data-value="tencentcloud">Tencent Cloud DNS</div>
<div class="item" data-value="transip">TransIP</div>
<div class="item" data-value="safedns">UKFast SafeDNS</div>
<div class="item" data-value="ultradns">Ultradns</div>
<div class="item" data-value="variomedia">Variomedia</div>
<div class="item" data-value="vegadns">VegaDNS</div>
<div class="item" data-value="vercel">Vercel</div>
<div class="item" data-value="versio">Versio.[nl|eu|uk]</div>
<div class="item" data-value="vinyldns">VinylDNS</div>
<div class="item" data-value="vkcloud">VK Cloud</div>
<div class="item" data-value="vscale">Vscale</div>
<div class="item" data-value="vultr">Vultr</div>
<div class="item" data-value="webnames">Webnames</div>
<div class="item" data-value="websupport">Websupport</div>
<div class="item" data-value="wedos">WEDOS</div>
<div class="item" data-value="yandex360">Yandex 360</div>
<div class="item" data-value="yandexcloud">Yandex Cloud</div>
<div class="item" data-value="yandex">Yandex PDD</div>
<div class="item" data-value="zoneee">Zone.ee</div>
<div class="item" data-value="zonomi">Zonomi</div>
<div class="default text">Pick a DNS Provider</div>
<div class="menu" id="dnsProviderList">
<!-- Auto populate moved to acmedns module and initDNSProviderList() -->
</div>
</div>
</div>
<div class="field dnsChallengeOnly" style="display:none;">
<label>Credentials File Content</label>
<textarea id="dnsCredentials" placeholder=""></textarea>
<small>For more information on the supported DNS Providers and their attirbutes look <a href="https://go-acme.github.io/lego/dns/" target="_blank">here</a>! </small>
<div class="ui negative message">
<i class="icon exclamation triangle"></i>
These credentials will be stored as plaintext in the database and in environment variables!
<div class="ui divider"></div>
<p>Required Configurations</p>
<div id="dnsProviderAPIFields">
</div>
<!--
<label>Credentials File Content</label>
<textarea id="dnsCredentials" placeholder=""></textarea>
<small>For more information on the supported DNS Providers and their attirbutes look <a href="https://go-acme.github.io/lego/dns/" target="_blank">here</a>! </small>
<div class="ui negative message">
<i class="icon exclamation triangle"></i>
These credentials will be stored as plaintext in the database and in environment variables!
</div>
-->
</div>
<div class="field" id="caInput" style="display:none;">
<label>ACME Server URL</label>
@ -483,6 +360,7 @@
obtainCertificate();
});
//On CA change in dropdown
$("input[name=ca]").on('change', function() {
if(this.value == "Custom ACME Server") {
$("#caInput").show();
@ -490,421 +368,71 @@
$("#hmacInput").show();
$("#skipTLS").show();
$("#dnsChallenge").hide();
$(".dnsChallengeOnly").hide();
} else if (this.value == "ZeroSSL") {
$("#kidInput").show();
$("#hmacInput").show();
$("#dnsChallenge").hide();
$(".dnsChallengeOnly").hide();
$("#skipTLS").hide();
} else if (this.value == "Buypass") {
$("#kidInput").show();
$("#hmacInput").show();
$("#dnsChallenge").hide()
$("#dnsChallenge").hide();
$(".dnsChallengeOnly").hide();
$("#skipTLS").hide();
}else {
$("#caInput").hide();
$("#skipTLS").hide();
$("#kidInput").hide();
$("#hmacInput").hide();
$("#dnsChallenge").show();
if ($("#useDnsChallenge")[0].checked){
$(".dnsChallengeOnly").show();
}
}
})
//On DNS provider dropdown change
$("input[name=dnsProvider]").on('change', function() {
// The file proivders-scraper-util.js can be used to generate the list of providers
switch(this.value){
case "edgedns":
$("#dnsCredentials").val("AKAMAI_ACCESS_TOKEN=\nAKAMAI_CLIENT_SECRET=\nAKAMAI_CLIENT_TOKEN=\nAKAMAI_EDGERC=\nAKAMAI_EDGERC_SECTION=\nAKAMAI_HOST=");
break;
case "alidns":
$("#dnsCredentials").val("ALICLOUD_ACCESS_KEY=\nALICLOUD_RAM_ROLE=\nALICLOUD_SECRET_KEY=\nALICLOUD_SECURITY_TOKEN=");
break;
case "allinkl":
$("#dnsCredentials").val("ALL_INKL_LOGIN=\nALL_INKL_PASSWORD=");
break;
case "lightsail":
$("#dnsCredentials").val("AWS_ACCESS_KEY_ID=\nAWS_ACCESS_KEY_ID_FILE=\nAWS_SHARED_CREDENTIALS_FILE=\nAWS_SECRET_ACCESS_KEY=\nAWS_SECRET_ACCESS_KEY_FILE=\nAWS_SHARED_CREDENTIALS_FILE=\nDNS_ZONE=");
break;
case "route53":
$("#dnsCredentials").val("AWS_ACCESS_KEY_ID=\nAWS_ACCESS_KEY_ID_FILE=\nAWS_SHARED_CREDENTIALS_FILE=\nAWS_ASSUME_ROLE_ARN=\nAWS_ASSUME_ROLE_ARN_FILE=\nAWS_EXTERNAL_ID=\nAWS_EXTERNAL_ID_FILE=\nAWS_HOSTED_ZONE_ID=\nAWS_PROFILE=\nAWS_PROFILE_FILE=\nAWS_REGION=\nAWS_REGION_FILE=\nAWS_SDK_LOAD_CONFIG=\nAWS_SDK_LOAD_CONFIG_FILE=\nAWS_SECRET_ACCESS_KEY=\nAWS_SECRET_ACCESS_KEY_FILE=\nAWS_SHARED_CREDENTIALS_FILE=");
break;
case "arvancloud":
$("#dnsCredentials").val("ARVANCLOUD_API_KEY=");
break;
case "auroradns":
$("#dnsCredentials").val("AURORA_API_KEY=\nAURORA_SECRET=");
break;
case "autodns":
$("#dnsCredentials").val("AUTODNS_API_PASSWORD=\nAUTODNS_API_USER=");
break;
case "azure":
$("#dnsCredentials").val("AZURE_CLIENT_ID=\nAZURE_CLIENT_SECRET=\nAZURE_ENVIRONMENT=\nAZURE_RESOURCE_GROUP=\nAZURE_SUBSCRIPTION_ID=\nAZURE_TENANT_ID=\ninstance metadata service=");
break;
case "azuredns":
$("#dnsCredentials").val("AZURE_CLIENT_CERTIFICATE_PATH=\nAZURE_CLIENT_ID=\nAZURE_CLIENT_SECRET=\nAZURE_TENANT_ID=");
break;
case "bindman":
$("#dnsCredentials").val("BINDMAN_MANAGER_ADDRESS=");
break;
case "bluecat":
$("#dnsCredentials").val("BLUECAT_CONFIG_NAME=\nBLUECAT_DNS_VIEW=\nBLUECAT_PASSWORD=\nBLUECAT_SERVER_URL=\nBLUECAT_USER_NAME=");
break;
case "brandit":
$("#dnsCredentials").val("BRANDIT_API_KEY=\nBRANDIT_API_USERNAME=");
break;
case "bunny":
$("#dnsCredentials").val("BUNNY_API_KEY=");
break;
case "checkdomain":
$("#dnsCredentials").val("CHECKDOMAIN_TOKEN=");
break;
case "civo":
$("#dnsCredentials").val("CIVO_TOKEN=");
break;
case "cloudru":
$("#dnsCredentials").val("CLOUDRU_KEY_ID=\nCLOUDRU_SECRET=\nCLOUDRU_SERVICE_INSTANCE_ID=");
break;
case "clouddns":
$("#dnsCredentials").val("CLOUDDNS_CLIENT_ID=\nCLOUDDNS_EMAIL=\nCLOUDDNS_PASSWORD=");
break;
case "cloudflare":
$("#dnsCredentials").val("CF_API_EMAIL=\nCF_API_KEY=\nCF_DNS_API_TOKEN=\nCF_ZONE_API_TOKEN=\nCLOUDFLARE_API_KEY=\nCLOUDFLARE_DNS_API_TOKEN=\nCLOUDFLARE_EMAIL=\nCLOUDFLARE_ZONE_API_TOKEN=");
break;
case "cloudns":
$("#dnsCredentials").val("CLOUDNS_AUTH_ID=\nCLOUDNS_AUTH_PASSWORD=");
break;
case "cloudxns":
$("#dnsCredentials").val("CLOUDXNS_API_KEY=\nCLOUDXNS_SECRET_KEY=");
break;
case "conoha":
$("#dnsCredentials").val("CONOHA_API_PASSWORD=\nCONOHA_API_USERNAME=\nCONOHA_TENANT_ID=");
break;
case "constellix":
$("#dnsCredentials").val("CONSTELLIX_API_KEY=\nCONSTELLIX_SECRET_KEY=");
break;
case "cpanel":
$("#dnsCredentials").val("CPANEL_BASE_URL=\nCPANEL_TOKEN=\nCPANEL_USERNAME=");
break;
case "derak":
$("#dnsCredentials").val("DERAK_API_KEY=");
break;
case "desec":
$("#dnsCredentials").val("DESEC_TOKEN=");
break;
case "designate":
$("#dnsCredentials").val("OS_APPLICATION_CREDENTIAL_ID=\nOS_APPLICATION_CREDENTIAL_NAME=\nOS_APPLICATION_CREDENTIAL_SECRET=\nOS_AUTH_URL=\nOS_PASSWORD=\nOS_PROJECT_NAME=\nOS_REGION_NAME=\nOS_USERNAME=\nOS_USER_ID=");
break;
case "digitalocean":
$("#dnsCredentials").val("DO_AUTH_TOKEN=");
break;
case "dnsmadeeasy":
$("#dnsCredentials").val("DNSMADEEASY_API_KEY=\nDNSMADEEASY_API_SECRET=");
break;
case "dnshomede":
$("#dnsCredentials").val("DNSHOMEDE_CREDENTIALS=");
break;
case "dnsimple":
$("#dnsCredentials").val("DNSIMPLE_OAUTH_TOKEN=");
break;
case "dnspod":
$("#dnsCredentials").val("DNSPOD_API_KEY=");
break;
case "dode":
$("#dnsCredentials").val("DODE_TOKEN=");
break;
case "domeneshop":
$("#dnsCredentials").val("DOMENESHOP_API_SECRET=\nDOMENESHOP_API_TOKEN=");
break;
case "dreamhost":
$("#dnsCredentials").val("DREAMHOST_API_KEY=");
break;
case "duckdns":
$("#dnsCredentials").val("DUCKDNS_TOKEN=");
break;
case "dyn":
$("#dnsCredentials").val("DYN_CUSTOMER_NAME=\nDYN_PASSWORD=\nDYN_USER_NAME=");
break;
case "dynu":
$("#dnsCredentials").val("DYNU_API_KEY=");
break;
case "easydns":
$("#dnsCredentials").val("EASYDNS_KEY=\nEASYDNS_TOKEN=");
break;
case "efficientip":
$("#dnsCredentials").val("EFFICIENTIP_DNS_NAME=\nEFFICIENTIP_HOSTNAME=\nEFFICIENTIP_PASSWORD=\nEFFICIENTIP_USERNAME=");
break;
case "epik":
$("#dnsCredentials").val("EPIK_SIGNATURE=");
break;
case "exoscale":
$("#dnsCredentials").val("EXOSCALE_API_KEY=\nEXOSCALE_API_SECRET=");
break;
case "exec":
$("#dnsCredentials").val("EXEC_MODE=\nRAW=\nEXEC_PATH=");
break;
case "freemyip":
$("#dnsCredentials").val("FREEMYIP_TOKEN=");
break;
case "gcore":
$("#dnsCredentials").val("GCORE_PERMANENT_API_TOKEN=");
break;
case "gandi":
$("#dnsCredentials").val("GANDI_API_KEY=");
break;
case "gandiv5":
$("#dnsCredentials").val("GANDIV5_API_KEY=\nGANDIV5_PERSONAL_ACCESS_TOKEN=");
break;
case "glesys":
$("#dnsCredentials").val("GLESYS_API_KEY=\nGLESYS_API_USER=");
break;
case "godaddy":
$("#dnsCredentials").val("GODADDY_API_KEY=\nGODADDY_API_SECRET=");
break;
case "gcloud":
$("#dnsCredentials").val("Application Default Credentials=\nGCE_PROJECT=\nGCE_SERVICE_ACCOUNT=\nGCE_SERVICE_ACCOUNT_FILE=");
break;
case "googledomains":
$("#dnsCredentials").val("GOOGLE_DOMAINS_ACCESS_TOKEN=");
break;
case "hetzner":
$("#dnsCredentials").val("HETZNER_API_KEY=");
break;
case "hostingde":
$("#dnsCredentials").val("HOSTINGDE_API_KEY=");
break;
case "hosttech":
$("#dnsCredentials").val("HOSTTECH_API_KEY=\nHOSTTECH_PASSWORD=");
break;
case "httpreq":
$("#dnsCredentials").val("HTTPREQ_ENDPOINT=\nHTTPREQ_MODE=\nRAW=");
break;
case "httpnet":
$("#dnsCredentials").val("HTTPNET_API_KEY=");
break;
case "hurricane":
$("#dnsCredentials").val("HURRICANE_TOKENS=");
break;
case "hyperone":
$("#dnsCredentials").val("HYPERONE_API_URL=\nHYPERONE_LOCATION_ID=\nHYPERONE_PASSPORT_LOCATION=\nHYPERONE_POLLING_INTERVAL=\nHYPERONE_PROPAGATION_TIMEOUT=\nHYPERONE_TTL=");
break;
case "ibmcloud":
$("#dnsCredentials").val("SOFTLAYER_API_KEY=\nSOFTLAYER_USERNAME=");
break;
case "iijdpf":
$("#dnsCredentials").val("IIJ_DPF_API_TOKEN=\nIIJ_DPF_DPM_SERVICE_CODE=");
break;
case "infoblox":
$("#dnsCredentials").val("INFOBLOX_HOST=\nINFOBLOX_PASSWORD=\nINFOBLOX_USERNAME=");
break;
case "infomaniak":
$("#dnsCredentials").val("INFOMANIAK_ACCESS_TOKEN=");
break;
case "iij":
$("#dnsCredentials").val("IIJ_API_ACCESS_KEY=\nIIJ_API_SECRET_KEY=\nIIJ_DO_SERVICE_CODE=");
break;
case "internetbs":
$("#dnsCredentials").val("INTERNET_BS_API_KEY=\nINTERNET_BS_PASSWORD=");
break;
case "inwx":
$("#dnsCredentials").val("INWX_PASSWORD=\nINWX_USERNAME=");
break;
case "ionos":
$("#dnsCredentials").val("IONOS_API_KEY=\n&lt;prefix&gt;.&lt;secret&gt;=");
break;
case "ipv64":
$("#dnsCredentials").val("IPV64_API_KEY=");
break;
case "iwantmyname":
$("#dnsCredentials").val("IWANTMYNAME_PASSWORD=\nIWANTMYNAME_USERNAME=");
break;
case "joker":
$("#dnsCredentials").val("JOKER_API_KEY=\nJOKER_API_MODE=\nJOKER_PASSWORD=\nJOKER_USERNAME=");
break;
case "acme-dns":
$("#dnsCredentials").val("ACME_DNS_API_BASE=\nACME_DNS_STORAGE_PATH=");
break;
case "liara":
$("#dnsCredentials").val("LIARA_API_KEY=");
break;
case "linode":
$("#dnsCredentials").val("LINODE_TOKEN=");
break;
case "liquidweb":
$("#dnsCredentials").val("LWAPI_PASSWORD=\nLWAPI_USERNAME=");
break;
case "loopia":
$("#dnsCredentials").val("LOOPIA_API_PASSWORD=\nLOOPIA_API_USER=");
break;
case "luadns":
$("#dnsCredentials").val("LUADNS_API_TOKEN=\nLUADNS_API_USERNAME=");
break;
case "mailinabox":
$("#dnsCredentials").val("MAILINABOX_BASE_URL=\nMAILINABOX_EMAIL=\nMAILINABOX_PASSWORD=");
break;
case "metaname":
$("#dnsCredentials").val("METANAME_ACCOUNT_REFERENCE=\nMETANAME_API_KEY=");
break;
case "mydnsjp":
$("#dnsCredentials").val("MYDNSJP_MASTER_ID=\nMYDNSJP_PASSWORD=");
break;
case "mythicbeasts":
$("#dnsCredentials").val("MYTHICBEASTS_PASSWORD=\nMYTHICBEASTS_USERNAME=");
break;
case "namedotcom":
$("#dnsCredentials").val("NAMECOM_API_TOKEN=\nNAMECOM_USERNAME=");
break;
case "namecheap":
$("#dnsCredentials").val("NAMECHEAP_API_KEY=\nNAMECHEAP_API_USER=");
break;
case "namesilo":
$("#dnsCredentials").val("NAMESILO_API_KEY=");
break;
case "nearlyfreespeech":
$("#dnsCredentials").val("NEARLYFREESPEECH_API_KEY=\nNEARLYFREESPEECH_LOGIN=");
break;
case "netcup":
$("#dnsCredentials").val("NETCUP_API_KEY=\nNETCUP_API_PASSWORD=\nNETCUP_CUSTOMER_NUMBER=");
break;
case "netlify":
$("#dnsCredentials").val("NETLIFY_TOKEN=");
break;
case "nicmanager":
$("#dnsCredentials").val("NICMANAGER_API_EMAIL=\nNICMANAGER_API_LOGIN=\nNICMANAGER_API_PASSWORD=\nNICMANAGER_API_USERNAME=");
break;
case "nifcloud":
$("#dnsCredentials").val("NIFCLOUD_ACCESS_KEY_ID=\nNIFCLOUD_SECRET_ACCESS_KEY=");
break;
case "njalla":
$("#dnsCredentials").val("NJALLA_TOKEN=");
break;
case "nodion":
$("#dnsCredentials").val("NODION_API_TOKEN=");
break;
case "ns1":
$("#dnsCredentials").val("NS1_API_KEY=");
break;
case "otc":
$("#dnsCredentials").val("OTC_DOMAIN_NAME=\nOTC_IDENTITY_ENDPOINT=\nOTC_PASSWORD=\nOTC_PROJECT_NAME=\nOTC_USER_NAME=");
break;
case "oraclecloud":
$("#dnsCredentials").val("OCI_COMPARTMENT_OCID=\nOCI_PRIVKEY_FILE=\nOCI_PRIVKEY_PASS=\nOCI_PUBKEY_FINGERPRINT=\nOCI_REGION=\nOCI_TENANCY_OCID=\nOCI_USER_OCID=");
break;
case "ovh":
$("#dnsCredentials").val("OVH_APPLICATION_KEY=\nOVH_APPLICATION_SECRET=\nOVH_CONSUMER_KEY=\nOVH_ENDPOINT=");
break;
case "plesk":
$("#dnsCredentials").val("PLESK_PASSWORD=\nPLESK_SERVER_BASE_URL=\nPLESK_USERNAME=");
break;
case "porkbun":
$("#dnsCredentials").val("PORKBUN_API_KEY=\nPORKBUN_SECRET_API_KEY=");
break;
case "pdns":
$("#dnsCredentials").val("PDNS_API_KEY=\nPDNS_API_URL=");
break;
case "rackspace":
$("#dnsCredentials").val("RACKSPACE_API_KEY=\nRACKSPACE_USER=");
break;
case "rcodezero":
$("#dnsCredentials").val("RCODEZERO_API_TOKEN=");
break;
case "regru":
$("#dnsCredentials").val("REGRU_PASSWORD=\nREGRU_USERNAME=");
break;
case "rfc2136":
$("#dnsCredentials").val("RFC2136_NAMESERVER=\nRFC2136_TSIG_ALGORITHM=\nRFC2136_TSIG*=\nRFC2136_TSIG_KEY=\nRFC2136_TSIG*=\nRFC2136_TSIG_SECRET=\n RFC2136_TSIG*=");
break;
case "rimuhosting":
$("#dnsCredentials").val("RIMUHOSTING_API_KEY=");
break;
case "sakuracloud":
$("#dnsCredentials").val("SAKURACLOUD_ACCESS_TOKEN=\nSAKURACLOUD_ACCESS_TOKEN_SECRET=");
break;
case "scaleway":
$("#dnsCredentials").val("SCW_PROJECT_ID=\nSCW_SECRET_KEY=");
break;
case "selectel":
$("#dnsCredentials").val("SELECTEL_API_TOKEN=");
break;
case "selectelv2":
$("#dnsCredentials").val("SELECTELV2_ACCOUNT_ID=\nSELECTELV2_PASSWORD=\nSELECTELV2_PROJECT_ID=\nSELECTELV2_USERNAME=");
break;
case "servercow":
$("#dnsCredentials").val("SERVERCOW_PASSWORD=\nSERVERCOW_USERNAME=");
break;
case "shellrent":
$("#dnsCredentials").val("SHELLRENT_TOKEN=\nSHELLRENT_USERNAME=");
break;
case "simply":
$("#dnsCredentials").val("SIMPLY_ACCOUNT_NAME=\nSIMPLY_API_KEY=");
break;
case "sonic":
$("#dnsCredentials").val("SONIC_API_KEY=\nSONIC_USER_ID=");
break;
case "stackpath":
$("#dnsCredentials").val("STACKPATH_CLIENT_ID=\nSTACKPATH_CLIENT_SECRET=\nSTACKPATH_STACK_ID=");
break;
case "tencentcloud":
$("#dnsCredentials").val("TENCENTCLOUD_SECRET_ID=\nTENCENTCLOUD_SECRET_KEY=");
break;
case "transip":
$("#dnsCredentials").val("TRANSIP_ACCOUNT_NAME=\nTRANSIP_PRIVATE_KEY_PATH=");
break;
case "safedns":
$("#dnsCredentials").val("SAFEDNS_AUTH_TOKEN=");
break;
case "ultradns":
$("#dnsCredentials").val("ULTRADNS_PASSWORD=\nULTRADNS_USERNAME=");
break;
case "variomedia":
$("#dnsCredentials").val("VARIOMEDIA_API_TOKEN=");
break;
case "vegadns":
$("#dnsCredentials").val("SECRET_VEGADNS_KEY=\nSECRET_VEGADNS_SECRET=\nVEGADNS_URL=");
break;
case "vercel":
$("#dnsCredentials").val("VERCEL_API_TOKEN=");
break;
case "versio":
$("#dnsCredentials").val("VERSIO_PASSWORD=\nVERSIO_USERNAME=");
break;
case "vinyldns":
$("#dnsCredentials").val("VINYLDNS_ACCESS_KEY=\nVINYLDNS_HOST=\nVINYLDNS_SECRET_KEY=");
break;
case "vkcloud":
$("#dnsCredentials").val("VK_CLOUD_PASSWORD=\nVK_CLOUD_PROJECT_ID=\nVK_CLOUD_USERNAME=");
break;
case "vscale":
$("#dnsCredentials").val("VSCALE_API_TOKEN=");
break;
case "vultr":
$("#dnsCredentials").val("VULTR_API_KEY=");
break;
case "webnames":
$("#dnsCredentials").val("WEBNAMES_API_KEY=");
break;
case "httpreq":
$("#dnsCredentials").val("HTTPREQ_ENDPOINT=\nHTTPREQ_MODE=\nRAW=");
break;
case "websupport":
$("#dnsCredentials").val("WEBSUPPORT_API_KEY=\nWEBSUPPORT_SECRET=");
break;
case "wedos":
$("#dnsCredentials").val("WEDOS_USERNAME=\nWEDOS_WAPI_PASSWORD=");
break;
case "yandex360":
$("#dnsCredentials").val("YANDEX360_OAUTH_TOKEN=\nYANDEX360_ORG_ID=");
break;
case "yandexcloud":
$("#dnsCredentials").val("YANDEX_CLOUD_FOLDER_ID=\nYANDEX_CLOUD_IAM_TOKEN=\ndns.admin=");
break;
case "yandex":
$("#dnsCredentials").val("YANDEX_PDD_TOKEN=");
break;
case "zoneee":
$("#dnsCredentials").val("ZONEEE_API_KEY=\nZONEEE_API_USER=");
break;
case "zonomi":
$("#dnsCredentials").val("ZONOMI_API_KEY=");
break;
}
})
let newProviderName = $("#dnsProvider").find("input").val();
$.get("/api/acme/dns/providers?name=" + newProviderName, function(data){
console.log("Loaded required config", data);
$("#dnsProviderAPIFields").html("");
//Generate a form for this config
let booleanFieldsHTML = "";
for (const [key, datatype] of Object.entries(data)) {
if (datatype == "int"){
$("#dnsProviderAPIFields").append(`<div class="ui fluid labeled dnsConfigField input" key="${key}" style="margin-top: 0.2em;">
<div class="ui basic blue label" style="font-weight: 300;">
${key}
</div>
<input type="number" value="300">
</div>`);
}else if (datatype == "bool"){
booleanFieldsHTML += (`<div class="ui checkbox dnsConfigField" key="${key}" style="margin-top: 1em !important; padding-left: 0.4em;">
<input type="checkbox">
<label>${key}</label>
</div>`);
}else{
//Default to string
$("#dnsProviderAPIFields").append(`<div class="ui fluid labeled input dnsConfigField" key="${key}" style="margin-top: 0.2em;">
<div class="ui basic label" style="font-weight: 300;">
${key}
</div>
<input type="text">
</div>`);
}
}
//Append the boolean fields at the bottom, if exists
$("#dnsProviderAPIFields").append(booleanFieldsHTML);
if (booleanFieldsHTML != ""){
$(".dnsConfigField.checkbox").checkbox();
}
});
});
// Get filename form domains and input
function getFilename() {
@ -987,29 +515,52 @@
});
}
//Read DNS credential from form and generate a key value structure that looks like
// the old DNSCredential TextArea input
function readDnsCredentials(){
let dnsCredentials = "";
$(".dnsConfigField").each(function(){
let thisKey = $(this).attr("key");
if ($(this).hasClass("checkbox")){
//Boolean option
let checked = $(this).find("input")[0].checked;
dnsCredentials += `${thisKey}=${checked?"true":"false"}\n`
}else{
//String or int options
let value = $(this).find("input").val().trim();
dnsCredentials += `${thisKey}=${value}\n`
}
});
dnsCredentials = dnsCredentials.trim();
return dnsCredentials;
}
// Update DNS values for autorenewal
function updateCertificateDNS() {
var dns = $("#useDnsChallenge")[0].checked;
var dnsProvider = "";
var dnsCredentials = "";
if (dns) {
dnsProvider = $("#dnsProvider").dropdown("get value");
dnsCredentials = $("#dnsCredentials").val();
if (!dns) {
return;
}
if(dnsProvider == "") {
parent.msgbox("DNS Provider cannot be empty", false, 5000);
$("#obtainButton").removeClass("loading").removeClass("disabled");
return;
}
dnsProvider = $("#dnsProvider").dropdown("get value");
if(dnsCredentials == "") {
parent.msgbox("DNS Credentials cannot be empty", false, 5000);
$("#obtainButton").removeClass("loading").removeClass("disabled");
return;
}
} else {
//dnsCredentials = $("#dnsCredentials").val();
dnsCredentials = readDnsCredentials();
if(dnsProvider == "") {
parent.msgbox("DNS Provider cannot be empty", false, 5000);
$("#obtainButton").removeClass("loading").removeClass("disabled");
return;
}
if(dnsCredentials == "") {
parent.msgbox("DNS Credentials cannot be empty", false, 5000);
$("#obtainButton").removeClass("loading").removeClass("disabled");
return;
}
@ -1234,7 +785,35 @@
}
}
//Clear up the input field when page load
//Load the json map and create the dropdown for DNS provider names
let dnsProviderNameMap = {};
function initDNSProviderList(){
$.get("dnsnames.json", function(namemap){
dnsProviderNameMap = namemap;
//Load a list of supported DNS provider from backend
$("#dnsProviderList").html("");
$.get("/api/acme/dns/providers", function(providerList){
providerList.sort();
providerList.forEach(providerid => {
let providerName = providerid;
if (dnsProviderNameMap[providerid] != undefined){
providerName = dnsProviderNameMap[providerid];
}
$("#dnsProviderList").append(`<div class="item" data-value="${providerid}">${providerName}</div>`);
});
$("#dnsProvider").dropdown();
setTimeout(function(){
//The dropdown is large, it takes some time to load
$("#dnsProvider").dropdown("set selected", "cloudflare");
}, 300)
});
});
}
initDNSProviderList();
//Clear up the input field when page load
$("#filenameInput").val("");
</script>
</body>

View File

@ -0,0 +1,132 @@
{
"edgedns": "Akamai EdgeDNS",
"alidns": "Alibaba Cloud DNS",
"allinkl": "all-inkl",
"lightsail": "Amazon Lightsail",
"route53": "Amazon Route 53",
"arvancloud": "ArvanCloud",
"auroradns": "Aurora DNS",
"autodns": "Autodns",
"azure": "Azure (deprecated)",
"azuredns": "Azure DNS",
"bindman": "Bindman",
"bluecat": "Bluecat",
"brandit": "Brandit",
"bunny": "Bunny",
"checkdomain": "Checkdomain",
"civo": "Civo",
"cloudru": "Cloud.ru",
"clouddns": "CloudDNS",
"cloudflare": "Cloudflare",
"cloudns": "ClouDNS",
"cloudxns": "CloudXNS",
"conoha": "ConoHa",
"constellix": "Constellix",
"cpanel": "CPanel/WHM",
"derak": "Derak Cloud",
"desec": "deSEC.io",
"designate": "Designate DNSaaS for Openstack",
"digitalocean": "Digital Ocean",
"dnsmadeeasy": "DNS Made Easy",
"dnshomede": "dnsHome.de",
"dnsimple": "DNSimple",
"dnspod": "DNSPod (deprecated)",
"dode": "Domain Offensive (do.de)",
"domeneshop": "Domeneshop",
"dreamhost": "DreamHost",
"duckdns": "Duck DNS",
"dyn": "Dyn",
"dynu": "Dynu",
"easydns": "EasyDNS",
"efficientip": "Efficient IP",
"epik": "Epik",
"exoscale": "Exoscale",
"exec": "External program",
"freemyip": "freemyip.com",
"gcore": "G-Core",
"gandi": "Gandi",
"gandiv5": "Gandi Live DNS (v5)",
"glesys": "Glesys",
"godaddy": "Go Daddy",
"gcloud": "Google Cloud",
"googledomains": "Google Domains",
"hetzner": "Hetzner",
"hostingde": "Hosting.de",
"hosttech": "Hosttech",
"httpreq": "HTTP request",
"httpnet": "http.net",
"hurricane": "Hurricane Electric DNS",
"hyperone": "HyperOne",
"ibmcloud": "IBM Cloud (SoftLayer)",
"iijdpf": "IIJ DNS Platform Service",
"infoblox": "Infoblox",
"infomaniak": "Infomaniak",
"iij": "Internet Initiative Japan",
"internetbs": "Internet.bs",
"inwx": "INWX",
"ionos": "Ionos",
"ipv64": "IPv64",
"iwantmyname": "iwantmyname",
"joker": "Joker",
"acme-dns": "Joohoi's ACME-DNS",
"liara": "Liara",
"linode": "Linode (v4)",
"liquidweb": "Liquid Web",
"loopia": "Loopia",
"luadns": "LuaDNS",
"mailinabox": "Mail-in-a-Box",
"metaname": "Metaname",
"mydnsjp": "MyDNS.jp",
"mythicbeasts": "MythicBeasts",
"namedotcom": "Name.com",
"namecheap": "Namecheap",
"namesilo": "Namesilo",
"nearlyfreespeech": "NearlyFreeSpeech.NET",
"netcup": "Netcup",
"netlify": "Netlify",
"nicmanager": "Nicmanager",
"nifcloud": "NIFCloud",
"njalla": "Njalla",
"nodion": "Nodion",
"ns1": "NS1",
"otc": "Open Telekom Cloud",
"oraclecloud": "Oracle Cloud",
"ovh": "OVH",
"plesk": "plesk.com",
"porkbun": "Porkbun",
"pdns": "PowerDNS",
"rackspace": "Rackspace",
"rcodezero": "RcodeZero",
"regru": "reg.ru",
"rfc2136": "RFC2136",
"rimuhosting": "RimuHosting",
"sakuracloud": "Sakura Cloud",
"scaleway": "Scaleway",
"selectel": "Selectel",
"servercow": "Servercow",
"shellrent": "Shellrent",
"simply": "Simply.com",
"sonic": "Sonic",
"stackpath": "Stackpath",
"tencentcloud": "Tencent Cloud DNS",
"transip": "TransIP",
"safedns": "UKFast SafeDNS",
"ultradns": "Ultradns",
"variomedia": "Variomedia",
"vegadns": "VegaDNS",
"vercel": "Vercel",
"versio": "Versio.[nl|eu|uk]",
"vinyldns": "VinylDNS",
"vkcloud": "VK Cloud",
"vscale": "Vscale",
"vultr": "Vultr",
"webnames": "Webnames",
"websupport": "Websupport",
"wedos": "WEDOS",
"yandex360": "Yandex 360",
"yandexcloud": "Yandex Cloud",
"yandex": "Yandex PDD",
"zoneee": "Zone.ee",
"zonomi": "Zonomi"
}