Browse Source

Fixed bug in acmedns generator

Toby Chui 9 months ago
parent
commit
5e98d358d7

+ 958 - 0
tools/provider_config_updater/acmedns/acmedns_nt61.go

@@ -0,0 +1,958 @@
+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/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/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/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.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return alidns.NewDNSProviderConfig(cfg)
+	case "allinkl":
+		cfg := allinkl.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return allinkl.NewDNSProviderConfig(cfg)
+	case "arvancloud":
+		cfg := arvancloud.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return arvancloud.NewDNSProviderConfig(cfg)
+	case "auroradns":
+		cfg := auroradns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return auroradns.NewDNSProviderConfig(cfg)
+	case "autodns":
+		cfg := autodns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return autodns.NewDNSProviderConfig(cfg)
+	case "azure":
+		cfg := azure.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return azure.NewDNSProviderConfig(cfg)
+	case "azuredns":
+		cfg := azuredns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return azuredns.NewDNSProviderConfig(cfg)
+	case "bindman":
+		cfg := bindman.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return bindman.NewDNSProviderConfig(cfg)
+	case "bluecat":
+		cfg := bluecat.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return bluecat.NewDNSProviderConfig(cfg)
+	case "brandit":
+		cfg := brandit.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return brandit.NewDNSProviderConfig(cfg)
+	case "bunny":
+		cfg := bunny.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return bunny.NewDNSProviderConfig(cfg)
+	case "checkdomain":
+		cfg := checkdomain.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return checkdomain.NewDNSProviderConfig(cfg)
+	case "civo":
+		cfg := civo.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return civo.NewDNSProviderConfig(cfg)
+	case "clouddns":
+		cfg := clouddns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return clouddns.NewDNSProviderConfig(cfg)
+	case "cloudflare":
+		cfg := cloudflare.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudflare.NewDNSProviderConfig(cfg)
+	case "cloudns":
+		cfg := cloudns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudns.NewDNSProviderConfig(cfg)
+	case "cloudru":
+		cfg := cloudru.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudru.NewDNSProviderConfig(cfg)
+	case "cloudxns":
+		cfg := cloudxns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return cloudxns.NewDNSProviderConfig(cfg)
+	case "conoha":
+		cfg := conoha.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return conoha.NewDNSProviderConfig(cfg)
+	case "constellix":
+		cfg := constellix.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return constellix.NewDNSProviderConfig(cfg)
+	case "derak":
+		cfg := derak.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return derak.NewDNSProviderConfig(cfg)
+	case "desec":
+		cfg := desec.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return desec.NewDNSProviderConfig(cfg)
+	case "digitalocean":
+		cfg := digitalocean.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return digitalocean.NewDNSProviderConfig(cfg)
+	case "dnshomede":
+		cfg := dnshomede.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnshomede.NewDNSProviderConfig(cfg)
+	case "dnsimple":
+		cfg := dnsimple.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnsimple.NewDNSProviderConfig(cfg)
+	case "dnsmadeeasy":
+		cfg := dnsmadeeasy.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnsmadeeasy.NewDNSProviderConfig(cfg)
+	case "dnspod":
+		cfg := dnspod.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dnspod.NewDNSProviderConfig(cfg)
+	case "dode":
+		cfg := dode.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dode.NewDNSProviderConfig(cfg)
+	case "domeneshop":
+		cfg := domeneshop.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return domeneshop.NewDNSProviderConfig(cfg)
+	case "dreamhost":
+		cfg := dreamhost.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dreamhost.NewDNSProviderConfig(cfg)
+	case "duckdns":
+		cfg := duckdns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return duckdns.NewDNSProviderConfig(cfg)
+	case "dyn":
+		cfg := dyn.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dyn.NewDNSProviderConfig(cfg)
+	case "dynu":
+		cfg := dynu.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return dynu.NewDNSProviderConfig(cfg)
+	case "easydns":
+		cfg := easydns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return easydns.NewDNSProviderConfig(cfg)
+	case "efficientip":
+		cfg := efficientip.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return efficientip.NewDNSProviderConfig(cfg)
+	case "epik":
+		cfg := epik.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return epik.NewDNSProviderConfig(cfg)
+	case "exoscale":
+		cfg := exoscale.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return exoscale.NewDNSProviderConfig(cfg)
+	case "freemyip":
+		cfg := freemyip.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return freemyip.NewDNSProviderConfig(cfg)
+	case "gandi":
+		cfg := gandi.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return gandi.NewDNSProviderConfig(cfg)
+	case "gandiv5":
+		cfg := gandiv5.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return gandiv5.NewDNSProviderConfig(cfg)
+	case "gcore":
+		cfg := gcore.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return gcore.NewDNSProviderConfig(cfg)
+	case "glesys":
+		cfg := glesys.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return glesys.NewDNSProviderConfig(cfg)
+	case "godaddy":
+		cfg := godaddy.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return godaddy.NewDNSProviderConfig(cfg)
+	case "googledomains":
+		cfg := googledomains.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return googledomains.NewDNSProviderConfig(cfg)
+	case "hetzner":
+		cfg := hetzner.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hetzner.NewDNSProviderConfig(cfg)
+	case "hostingde":
+		cfg := hostingde.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hostingde.NewDNSProviderConfig(cfg)
+	case "hosttech":
+		cfg := hosttech.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hosttech.NewDNSProviderConfig(cfg)
+	case "httpnet":
+		cfg := httpnet.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return httpnet.NewDNSProviderConfig(cfg)
+	case "hyperone":
+		cfg := hyperone.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return hyperone.NewDNSProviderConfig(cfg)
+	case "ibmcloud":
+		cfg := ibmcloud.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ibmcloud.NewDNSProviderConfig(cfg)
+	case "iij":
+		cfg := iij.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return iij.NewDNSProviderConfig(cfg)
+	case "iijdpf":
+		cfg := iijdpf.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return iijdpf.NewDNSProviderConfig(cfg)
+	case "infoblox":
+		cfg := infoblox.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return infoblox.NewDNSProviderConfig(cfg)
+	case "infomaniak":
+		cfg := infomaniak.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return infomaniak.NewDNSProviderConfig(cfg)
+	case "internetbs":
+		cfg := internetbs.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return internetbs.NewDNSProviderConfig(cfg)
+	case "inwx":
+		cfg := inwx.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return inwx.NewDNSProviderConfig(cfg)
+	case "ionos":
+		cfg := ionos.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ionos.NewDNSProviderConfig(cfg)
+	case "ipv64":
+		cfg := ipv64.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ipv64.NewDNSProviderConfig(cfg)
+	case "iwantmyname":
+		cfg := iwantmyname.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return iwantmyname.NewDNSProviderConfig(cfg)
+	case "joker":
+		cfg := joker.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return joker.NewDNSProviderConfig(cfg)
+	case "liara":
+		cfg := liara.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return liara.NewDNSProviderConfig(cfg)
+	case "lightsail":
+		cfg := lightsail.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return lightsail.NewDNSProviderConfig(cfg)
+	case "linode":
+		cfg := linode.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return linode.NewDNSProviderConfig(cfg)
+	case "liquidweb":
+		cfg := liquidweb.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return liquidweb.NewDNSProviderConfig(cfg)
+	case "loopia":
+		cfg := loopia.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return loopia.NewDNSProviderConfig(cfg)
+	case "luadns":
+		cfg := luadns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return luadns.NewDNSProviderConfig(cfg)
+	case "metaname":
+		cfg := metaname.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return metaname.NewDNSProviderConfig(cfg)
+	case "mydnsjp":
+		cfg := mydnsjp.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return mydnsjp.NewDNSProviderConfig(cfg)
+	case "namecheap":
+		cfg := namecheap.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return namecheap.NewDNSProviderConfig(cfg)
+	case "namedotcom":
+		cfg := namedotcom.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return namedotcom.NewDNSProviderConfig(cfg)
+	case "namesilo":
+		cfg := namesilo.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return namesilo.NewDNSProviderConfig(cfg)
+	case "nearlyfreespeech":
+		cfg := nearlyfreespeech.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nearlyfreespeech.NewDNSProviderConfig(cfg)
+	case "netcup":
+		cfg := netcup.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return netcup.NewDNSProviderConfig(cfg)
+	case "netlify":
+		cfg := netlify.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return netlify.NewDNSProviderConfig(cfg)
+	case "nicmanager":
+		cfg := nicmanager.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nicmanager.NewDNSProviderConfig(cfg)
+	case "nifcloud":
+		cfg := nifcloud.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nifcloud.NewDNSProviderConfig(cfg)
+	case "njalla":
+		cfg := njalla.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return njalla.NewDNSProviderConfig(cfg)
+	case "nodion":
+		cfg := nodion.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return nodion.NewDNSProviderConfig(cfg)
+	case "ns1":
+		cfg := ns1.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ns1.NewDNSProviderConfig(cfg)
+	case "otc":
+		cfg := otc.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return otc.NewDNSProviderConfig(cfg)
+	case "ovh":
+		cfg := ovh.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ovh.NewDNSProviderConfig(cfg)
+	case "pdns":
+		cfg := pdns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return pdns.NewDNSProviderConfig(cfg)
+	case "plesk":
+		cfg := plesk.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return plesk.NewDNSProviderConfig(cfg)
+	case "porkbun":
+		cfg := porkbun.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return porkbun.NewDNSProviderConfig(cfg)
+	case "rackspace":
+		cfg := rackspace.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rackspace.NewDNSProviderConfig(cfg)
+	case "rcodezero":
+		cfg := rcodezero.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rcodezero.NewDNSProviderConfig(cfg)
+	case "regru":
+		cfg := regru.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return regru.NewDNSProviderConfig(cfg)
+	case "rfc2136":
+		cfg := rfc2136.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rfc2136.NewDNSProviderConfig(cfg)
+	case "rimuhosting":
+		cfg := rimuhosting.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return rimuhosting.NewDNSProviderConfig(cfg)
+	case "route53":
+		cfg := route53.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return route53.NewDNSProviderConfig(cfg)
+	case "safedns":
+		cfg := safedns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return safedns.NewDNSProviderConfig(cfg)
+	case "sakuracloud":
+		cfg := sakuracloud.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return sakuracloud.NewDNSProviderConfig(cfg)
+	case "scaleway":
+		cfg := scaleway.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return scaleway.NewDNSProviderConfig(cfg)
+	case "selectel":
+		cfg := selectel.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return selectel.NewDNSProviderConfig(cfg)
+	case "servercow":
+		cfg := servercow.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return servercow.NewDNSProviderConfig(cfg)
+	case "simply":
+		cfg := simply.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return simply.NewDNSProviderConfig(cfg)
+	case "sonic":
+		cfg := sonic.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return sonic.NewDNSProviderConfig(cfg)
+	case "stackpath":
+		cfg := stackpath.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return stackpath.NewDNSProviderConfig(cfg)
+	case "tencentcloud":
+		cfg := tencentcloud.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return tencentcloud.NewDNSProviderConfig(cfg)
+	case "transip":
+		cfg := transip.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return transip.NewDNSProviderConfig(cfg)
+	case "ultradns":
+		cfg := ultradns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return ultradns.NewDNSProviderConfig(cfg)
+	case "variomedia":
+		cfg := variomedia.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return variomedia.NewDNSProviderConfig(cfg)
+	case "vegadns":
+		cfg := vegadns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vegadns.NewDNSProviderConfig(cfg)
+	case "vercel":
+		cfg := vercel.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vercel.NewDNSProviderConfig(cfg)
+	case "versio":
+		cfg := versio.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return versio.NewDNSProviderConfig(cfg)
+	case "vinyldns":
+		cfg := vinyldns.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vinyldns.NewDNSProviderConfig(cfg)
+	case "vkcloud":
+		cfg := vkcloud.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vkcloud.NewDNSProviderConfig(cfg)
+	case "vscale":
+		cfg := vscale.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vscale.NewDNSProviderConfig(cfg)
+	case "vultr":
+		cfg := vultr.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return vultr.NewDNSProviderConfig(cfg)
+	case "webnames":
+		cfg := webnames.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return webnames.NewDNSProviderConfig(cfg)
+	case "websupport":
+		cfg := websupport.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return websupport.NewDNSProviderConfig(cfg)
+	case "wedos":
+		cfg := wedos.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return wedos.NewDNSProviderConfig(cfg)
+	case "yandex":
+		cfg := yandex.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return yandex.NewDNSProviderConfig(cfg)
+	case "yandex360":
+		cfg := yandex360.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return yandex360.NewDNSProviderConfig(cfg)
+	case "yandexcloud":
+		cfg := yandexcloud.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return yandexcloud.NewDNSProviderConfig(cfg)
+	case "zoneee":
+		cfg := zoneee.NewDefaultConfig()
+		err := json.Unmarshal([]byte(js), &cfg)
+		if err != nil {
+			return nil, err
+		}
+		return zoneee.NewDNSProviderConfig(cfg)
+	case "zonomi":
+		cfg := zonomi.NewDefaultConfig()
+		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)
+	}
+}

+ 91 - 31
tools/provider_config_updater/acmedns/providers.json

@@ -1242,15 +1242,32 @@
   "Name": "gandiv5",
   "ConfigableFields": [
    {
-    "Title": "fieldName",
+    "Title": "BaseURL",
+    "Datatype": "string"
+   },
+   {
+    "Title": "APIKey",
     "Datatype": "string"
    },
    {
-    "Title": "authZone",
+    "Title": "PersonalAccessToken",
     "Datatype": "string"
    }
   ],
-  "HiddenFields": []
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
  },
  "gcore": {
   "Name": "gcore",
@@ -2063,35 +2080,40 @@
   "Name": "namecheap",
   "ConfigableFields": [
    {
-    "Title": "domain",
-    "Datatype": "string"
+    "Title": "Debug",
+    "Datatype": "bool"
    },
    {
-    "Title": "key",
+    "Title": "BaseURL",
     "Datatype": "string"
    },
    {
-    "Title": "keyFqdn",
+    "Title": "APIUser",
     "Datatype": "string"
    },
    {
-    "Title": "keyValue",
+    "Title": "APIKey",
     "Datatype": "string"
    },
    {
-    "Title": "tld",
+    "Title": "ClientIP",
     "Datatype": "string"
+   }
+  ],
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
    },
    {
-    "Title": "sld",
-    "Datatype": "string"
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
    },
    {
-    "Title": "host",
-    "Datatype": "string"
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
    }
-  ],
-  "HiddenFields": []
+  ]
  },
  "namedotcom": {
   "Name": "namedotcom",
@@ -2418,26 +2440,38 @@
   "Name": "ovh",
   "ConfigableFields": [
    {
-    "Title": "FieldType",
+    "Title": "APIEndpoint",
     "Datatype": "string"
    },
    {
-    "Title": "SubDomain",
+    "Title": "ApplicationKey",
     "Datatype": "string"
    },
    {
-    "Title": "Target",
+    "Title": "ApplicationSecret",
     "Datatype": "string"
    },
    {
-    "Title": "Zone",
+    "Title": "ConsumerKey",
     "Datatype": "string"
    }
   ],
   "HiddenFields": [
    {
-    "Title": "ID",
-    "Datatype": "int64"
+    "Title": "OAuth2Config",
+    "Datatype": "*OAuth2Config"
+   },
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
    }
   ]
  },
@@ -2875,15 +2909,28 @@
   "Name": "shellrent",
   "ConfigableFields": [
    {
-    "Title": "domainID",
-    "Datatype": "int"
+    "Title": "Username",
+    "Datatype": "string"
    },
    {
-    "Title": "recordID",
-    "Datatype": "int"
+    "Title": "Token",
+    "Datatype": "string"
    }
   ],
-  "HiddenFields": []
+  "HiddenFields": [
+   {
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
+   },
+   {
+    "Title": "HTTPClient",
+    "Datatype": "*http.Client"
+   }
+  ]
  },
  "simply": {
   "Name": "simply",
@@ -3034,15 +3081,28 @@
  },
  "ultradns": {
   "Name": "ultradns",
-  "ConfigableFields": [],
+  "ConfigableFields": [
+   {
+    "Title": "Username",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Password",
+    "Datatype": "string"
+   },
+   {
+    "Title": "Endpoint",
+    "Datatype": "string"
+   }
+  ],
   "HiddenFields": [
    {
-    "Title": "config",
-    "Datatype": "*Config"
+    "Title": "PropagationTimeout",
+    "Datatype": "time.Duration"
    },
    {
-    "Title": "client",
-    "Datatype": "*client.Client"
+    "Title": "PollingInterval",
+    "Datatype": "time.Duration"
    }
   ]
  },

+ 587 - 0
tools/provider_config_updater/acmedns/providers_nt61.json

@@ -0,0 +1,587 @@
+{
+ "alidns": {
+  "Name": "alidns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "allinkl": {
+  "Name": "allinkl",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "arvancloud": {
+  "Name": "arvancloud",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "auroradns": {
+  "Name": "auroradns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "autodns": {
+  "Name": "autodns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "azure": {
+  "Name": "azure",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "azuredns": {
+  "Name": "azuredns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "bindman": {
+  "Name": "bindman",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "bluecat": {
+  "Name": "bluecat",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "brandit": {
+  "Name": "brandit",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "bunny": {
+  "Name": "bunny",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "checkdomain": {
+  "Name": "checkdomain",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "civo": {
+  "Name": "civo",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "clouddns": {
+  "Name": "clouddns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "cloudflare": {
+  "Name": "cloudflare",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "cloudns": {
+  "Name": "cloudns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "cloudru": {
+  "Name": "cloudru",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "cloudxns": {
+  "Name": "cloudxns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "conoha": {
+  "Name": "conoha",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "constellix": {
+  "Name": "constellix",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "derak": {
+  "Name": "derak",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "desec": {
+  "Name": "desec",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "digitalocean": {
+  "Name": "digitalocean",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "dnshomede": {
+  "Name": "dnshomede",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "dnsimple": {
+  "Name": "dnsimple",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "dnsmadeeasy": {
+  "Name": "dnsmadeeasy",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "dnspod": {
+  "Name": "dnspod",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "dode": {
+  "Name": "dode",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "domeneshop": {
+  "Name": "domeneshop",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "dreamhost": {
+  "Name": "dreamhost",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "duckdns": {
+  "Name": "duckdns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "dyn": {
+  "Name": "dyn",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "dynu": {
+  "Name": "dynu",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "easydns": {
+  "Name": "easydns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "efficientip": {
+  "Name": "efficientip",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "epik": {
+  "Name": "epik",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "exoscale": {
+  "Name": "exoscale",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "freemyip": {
+  "Name": "freemyip",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "gandi": {
+  "Name": "gandi",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "gandiv5": {
+  "Name": "gandiv5",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "gcore": {
+  "Name": "gcore",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "glesys": {
+  "Name": "glesys",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "godaddy": {
+  "Name": "godaddy",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "googledomains": {
+  "Name": "googledomains",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "hetzner": {
+  "Name": "hetzner",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "hostingde": {
+  "Name": "hostingde",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "hosttech": {
+  "Name": "hosttech",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "httpnet": {
+  "Name": "httpnet",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "hyperone": {
+  "Name": "hyperone",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "ibmcloud": {
+  "Name": "ibmcloud",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "iij": {
+  "Name": "iij",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "iijdpf": {
+  "Name": "iijdpf",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "infoblox": {
+  "Name": "infoblox",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "infomaniak": {
+  "Name": "infomaniak",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "internetbs": {
+  "Name": "internetbs",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "inwx": {
+  "Name": "inwx",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "ionos": {
+  "Name": "ionos",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "ipv64": {
+  "Name": "ipv64",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "iwantmyname": {
+  "Name": "iwantmyname",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "joker": {
+  "Name": "joker",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "liara": {
+  "Name": "liara",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "lightsail": {
+  "Name": "lightsail",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "linode": {
+  "Name": "linode",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "liquidweb": {
+  "Name": "liquidweb",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "loopia": {
+  "Name": "loopia",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "luadns": {
+  "Name": "luadns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "metaname": {
+  "Name": "metaname",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "mydnsjp": {
+  "Name": "mydnsjp",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "namecheap": {
+  "Name": "namecheap",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "namedotcom": {
+  "Name": "namedotcom",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "namesilo": {
+  "Name": "namesilo",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "nearlyfreespeech": {
+  "Name": "nearlyfreespeech",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "netcup": {
+  "Name": "netcup",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "netlify": {
+  "Name": "netlify",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "nicmanager": {
+  "Name": "nicmanager",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "nifcloud": {
+  "Name": "nifcloud",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "njalla": {
+  "Name": "njalla",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "nodion": {
+  "Name": "nodion",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "ns1": {
+  "Name": "ns1",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "otc": {
+  "Name": "otc",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "ovh": {
+  "Name": "ovh",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "pdns": {
+  "Name": "pdns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "plesk": {
+  "Name": "plesk",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "porkbun": {
+  "Name": "porkbun",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "rackspace": {
+  "Name": "rackspace",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "rcodezero": {
+  "Name": "rcodezero",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "regru": {
+  "Name": "regru",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "rfc2136": {
+  "Name": "rfc2136",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "rimuhosting": {
+  "Name": "rimuhosting",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "route53": {
+  "Name": "route53",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "safedns": {
+  "Name": "safedns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "sakuracloud": {
+  "Name": "sakuracloud",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "scaleway": {
+  "Name": "scaleway",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "selectel": {
+  "Name": "selectel",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "servercow": {
+  "Name": "servercow",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "simply": {
+  "Name": "simply",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "sonic": {
+  "Name": "sonic",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "stackpath": {
+  "Name": "stackpath",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "tencentcloud": {
+  "Name": "tencentcloud",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "transip": {
+  "Name": "transip",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "ultradns": {
+  "Name": "ultradns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "variomedia": {
+  "Name": "variomedia",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "vegadns": {
+  "Name": "vegadns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "vercel": {
+  "Name": "vercel",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "versio": {
+  "Name": "versio",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "vinyldns": {
+  "Name": "vinyldns",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "vkcloud": {
+  "Name": "vkcloud",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "vscale": {
+  "Name": "vscale",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "vultr": {
+  "Name": "vultr",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "webnames": {
+  "Name": "webnames",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "websupport": {
+  "Name": "websupport",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "wedos": {
+  "Name": "wedos",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "yandex": {
+  "Name": "yandex",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "yandex360": {
+  "Name": "yandex360",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "yandexcloud": {
+  "Name": "yandexcloud",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "zoneee": {
+  "Name": "zoneee",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ },
+ "zonomi": {
+  "Name": "zonomi",
+  "ConfigableFields": [],
+  "HiddenFields": []
+ }
+}

+ 71 - 5
tools/provider_config_updater/extract.go

@@ -9,6 +9,15 @@ import (
 	"strings"
 )
 
+/*
+	Usage
+
+	git clone {repo_link_for_lego}
+	go run extract.go
+	//go run extract.go -- "win7"
+
+*/
+
 var legoProvidersSourceFolder string = "./lego/providers/dns/"
 var outputDir string = "./acmedns"
 var defTemplate string = `package acmedns
@@ -72,6 +81,26 @@ func getExcludedDNSProviders() []string {
 	}
 }
 
+// Exclude list for Windows build, due to limitations for lego versions
+func getExcludedDNSProvidersNT61() []string {
+	return []string{
+		"edgedns",      //Too complex data structure
+		"exec",         //Not a DNS provider
+		"httpreq",      //Not a DNS provider
+		"hurricane",    //Multi-credentials arch
+		"oraclecloud",  //Evil company
+		"acmedns",      //Not a DNS provider
+		"selectelv2",   //Not sure why not working with our code generator
+		"designate",    //OpenStack, if you are using this you shd not be using zoraxy
+		"mythicbeasts", //Module require url.URL, which cannot be automatically parsed
+
+		//The following suppliers was not in lego v1.15 (Windows 7 last supported version of lego)
+		"cpanel",
+		"mailinabox",
+		"shellrent",
+	}
+}
+
 func isInSlice(str string, slice []string) bool {
 	for _, s := range slice {
 		if s == str {
@@ -85,6 +114,10 @@ func isExcludedDNSProvider(providerName string) bool {
 	return isInSlice(providerName, getExcludedDNSProviders())
 }
 
+func isExcludedDNSProviderNT61(providerName string) bool {
+	return isInSlice(providerName, getExcludedDNSProvidersNT61())
+}
+
 // extractConfigStruct extracts the name of the config struct and its content as plain text from a given source code.
 func extractConfigStruct(sourceCode string) (string, string) {
 	// Regular expression to match the struct declaration.
@@ -99,6 +132,23 @@ func extractConfigStruct(sourceCode string) (string, string) {
 	// Extract the struct name and its content.
 	structName := match[1]
 	structContent := match[2]
+	if structName != "Config" {
+		allStructs := structRegex.FindAllStringSubmatch(sourceCode, 10)
+		for _, thisStruct := range allStructs {
+			//fmt.Println("Name => ", test[1])
+			//fmt.Println("Content => ", test[2])
+
+			if thisStruct[1] == "Config" {
+				structName = "Config"
+				structContent = thisStruct[2]
+				break
+			}
+		}
+
+		if structName != "Config" {
+			panic("Unable to find Config for this provider")
+		}
+	}
 
 	return structName, structContent
 }
@@ -106,6 +156,7 @@ func extractConfigStruct(sourceCode string) (string, string) {
 func main() {
 	// A map of provider name to information on what can be filled
 	extractedProviderList := map[string]*ProviderInfo{}
+	buildForWindowsSeven := (len(os.Args) > 2 && os.Args[2] == "win7")
 
 	//Search all providers
 	providers, err := filepath.Glob(filepath.Join(legoProvidersSourceFolder, "/*"))
@@ -123,10 +174,19 @@ func main() {
 	importList := ""
 	for _, provider := range providers {
 		providerName := filepath.Base(provider)
-		if isExcludedDNSProvider(providerName) {
-			//Ignore this provider
-			continue
+
+		if buildForWindowsSeven {
+			if isExcludedDNSProviderNT61(providerName) {
+				//Ignore this provider
+				continue
+			}
+		} else {
+			if isExcludedDNSProvider(providerName) {
+				//Ignore this provider
+				continue
+			}
 		}
+
 		//Check if {provider_name}.go exists
 		providerDef := filepath.Join(provider, providerName+".go")
 		if !fileExists(providerDef) {
@@ -230,11 +290,17 @@ func main() {
 	if err != nil {
 		panic(err)
 	}
-	os.WriteFile(filepath.Join(outputDir, "providers.json"), js, 0775)
 
 	fullCodeSnippet := strings.ReplaceAll(defTemplate, "{{magic}}", generatedConvertcode)
 	fullCodeSnippet = strings.ReplaceAll(fullCodeSnippet, "{{imports}}", importList)
 
-	os.WriteFile(filepath.Join(outputDir, "acmedns.go"), []byte(fullCodeSnippet), 0775)
+	outJsonFilename := "providers.json"
+	outGoFilename := "acmedns.go"
+	if buildForWindowsSeven {
+		outJsonFilename = "providers_nt61.json"
+		outGoFilename = "acmedns_nt61.go"
+	}
+	os.WriteFile(filepath.Join(outputDir, outJsonFilename), js, 0775)
+	os.WriteFile(filepath.Join(outputDir, outGoFilename), []byte(fullCodeSnippet), 0775)
 	fmt.Println("Output written to file")
 }

+ 1 - 0
tools/provider_config_updater/lego

@@ -0,0 +1 @@
+Subproject commit d39d57fbc931ddd6f9f914bc2e245acb0a6c3e43

+ 1 - 0
tools/provider_config_updater/update.sh

@@ -18,6 +18,7 @@ fi
 # Run the extract.go to get all the config from lego source code
 echo "Generating code"
 go run ./extract.go
+go run ./extract.go -- "win7"
 
 echo "Cleaning up lego"
 # Comment the line below if you dont want to pull everytime update