mirror of
https://github.com/tobychui/zoraxy.git
synced 2025-06-03 06:07:20 +02:00
Merge pull request #152 from tobychui/v3.0.4
V3.0.4 Updates - Optimized DNS challenge implementation - Removed dependencies on environment variable write and keep all data contained - Fixed panic on loading certificate generated by Zoraxy v2 - Added automatic form generator for DNS challenge / providers - Added CA name default value - Added code generator for acmedns module (storing the DNS challenge provider contents extracted from lego) - Fixed ACME snippet "Obtain Certificate" concurrent issues in save EAB and DNS credentials
This commit is contained in:
commit
ec973eb3bc
17
README.md
17
README.md
@ -34,6 +34,7 @@ General purpose request (reverse) proxy and forwarding tool for networking noobs
|
||||
- SMTP config for password reset
|
||||
|
||||
## Downloads
|
||||
|
||||
[Windows](https://github.com/tobychui/zoraxy/releases/latest/download/zoraxy_windows_amd64.exe)
|
||||
/[Linux (amd64)](https://github.com/tobychui/zoraxy/releases/latest/download/zoraxy_linux_amd64)
|
||||
/[Linux (arm64)](https://github.com/tobychui/zoraxy/releases/latest/download/zoraxy_linux_arm64)
|
||||
@ -41,6 +42,7 @@ General purpose request (reverse) proxy and forwarding tool for networking noobs
|
||||
For other systems or architectures, please see [Release](https://github.com/tobychui/zoraxy/releases/latest/)
|
||||
|
||||
## Build from Source
|
||||
|
||||
Requires Go 1.22 or higher
|
||||
|
||||
```bash
|
||||
@ -79,21 +81,23 @@ The installation method is same as Linux. If you are using a Raspberry Pi 4 or n
|
||||
The installation method is same as Linux. For other ARM SBCs, please refer to your SBC's CPU architecture and pick the one that is suitable for your device.
|
||||
|
||||
#### Docker
|
||||
|
||||
See the [/docker](https://github.com/tobychui/zoraxy/tree/main/docker) folder for more details.
|
||||
|
||||
### Start Paramters
|
||||
|
||||
```
|
||||
Usage of zoraxy:
|
||||
-autorenew int
|
||||
ACME auto TLS/SSL certificate renew check interval (seconds) (default 86400)
|
||||
-fastgeoip
|
||||
Enable high speed geoip lookup, require 1GB extra memory (Not recommend for low end devices)
|
||||
-info
|
||||
Show information about this program in JSON
|
||||
-log
|
||||
Log terminal output to file (default true)
|
||||
-mdns
|
||||
Enable mDNS scanner and transponder (default true)
|
||||
-mdnsname string
|
||||
mDNS name, leave empty to use default (zoraxy_{node-uuid}.local)
|
||||
-noauth
|
||||
Disable authentication for management interface
|
||||
-port string
|
||||
@ -153,12 +157,13 @@ This allows you to have an infinite number of network members in your Global Are
|
||||
## Web SSH
|
||||
|
||||
Web SSH currently only supports Linux based OSes. The following platforms are supported:
|
||||
|
||||
- linux/amd64
|
||||
- linux/arm64
|
||||
- linux/armv6 (experimental)
|
||||
- linux/386 (experimental)
|
||||
|
||||
### Loopback Connection
|
||||
### Loopback Connection
|
||||
|
||||
Loopback web SSH connection, by default, is disabled. This means that if you are trying to connect to an address like 127.0.0.1 or localhost, the system will reject your connection for security reasons. To enable loopback for testing or development purpose, use the following flags to override the loopback checking:
|
||||
|
||||
@ -167,12 +172,14 @@ Loopback web SSH connection, by default, is disabled. This means that if you are
|
||||
```
|
||||
|
||||
## Sponsor This Project
|
||||
|
||||
If you like the project and want to support us, please consider a donation. You can use the links below
|
||||
|
||||
- [tobychui (Primary author)](https://paypal.me/tobychui)
|
||||
- PassiveLemon (Docker compatibility maintainer)
|
||||
|
||||
|
||||
## License
|
||||
|
||||
This project is open-sourced under AGPL. I open-sourced this project so everyone can check for security issues and benefit all users. **If you plan to use this project in a commercial environment (which violate the AGPL terms), please contact toby@imuslab.com for an alternative license.**
|
||||
This project is open-sourced under AGPL. I open-sourced this project so everyone can check for security issues and benefit all users. **This software is intended to be free of charge. If you have acquired this software from a third-party seller, the authors of this repository bears no responsibility for any technical difficulties assistance or support.**
|
||||
|
||||
|
||||
|
@ -85,8 +85,8 @@ func acmeRegisterSpecialRoutingRule() {
|
||||
// This function check if the renew setup is satisfied. If not, toggle them automatically
|
||||
func AcmeCheckAndHandleRenewCertificate(w http.ResponseWriter, r *http.Request) {
|
||||
isForceHttpsRedirectEnabledOriginally := false
|
||||
dnsPara, _ := utils.PostPara(r, "dns")
|
||||
if dnsPara == "false" {
|
||||
dnsPara, _ := utils.PostBool(r, "dns")
|
||||
if !dnsPara {
|
||||
if dynamicProxyRouter.Option.Port == 443 {
|
||||
//Enable port 80 to 443 redirect
|
||||
if !dynamicProxyRouter.Option.ForceHttpsRedirect {
|
||||
@ -117,7 +117,7 @@ func AcmeCheckAndHandleRenewCertificate(w http.ResponseWriter, r *http.Request)
|
||||
tlsCertManager.UpdateLoadedCertList()
|
||||
|
||||
//Restore original settings
|
||||
if dynamicProxyRouter.Option.Port == 443 && dnsPara == "false" {
|
||||
if dynamicProxyRouter.Option.Port == 443 && !dnsPara {
|
||||
if !isForceHttpsRedirectEnabledOriginally {
|
||||
//Default is off. Turn the redirection off
|
||||
SystemWideLogger.PrintAndLog("ACME", "Restoring HTTP to HTTPS redirect settings", nil)
|
||||
|
@ -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
|
||||
|
11
src/cert.go
11
src/cert.go
@ -47,7 +47,7 @@ func handleListCertificate(w http.ResponseWriter, r *http.Request) {
|
||||
LastModifiedDate string
|
||||
ExpireDate string
|
||||
RemainingDays int
|
||||
DNS bool
|
||||
UseDNS bool
|
||||
}
|
||||
|
||||
results := []*CertInfo{}
|
||||
@ -84,9 +84,10 @@ func handleListCertificate(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
certInfoFilename := filepath.Join(tlsCertManager.CertStore, filename+".json")
|
||||
certInfo, err := acme.LoadCertInfoJSON(certInfoFilename)
|
||||
if err != nil {
|
||||
SystemWideLogger.PrintAndLog("Could not Load CertInfoJson", certInfoFilename, err)
|
||||
useDNSValidation := false //Default to false for HTTP TLS certificates
|
||||
certInfo, err := acme.LoadCertInfoJSON(certInfoFilename) //Note: Not all certs have info json
|
||||
if err == nil {
|
||||
useDNSValidation = certInfo.UseDNS
|
||||
}
|
||||
|
||||
thisCertInfo := CertInfo{
|
||||
@ -94,7 +95,7 @@ func handleListCertificate(w http.ResponseWriter, r *http.Request) {
|
||||
LastModifiedDate: modifiedTime,
|
||||
ExpireDate: certExpireTime,
|
||||
RemainingDays: expiredIn,
|
||||
DNS: certInfo.DNS,
|
||||
UseDNS: useDNSValidation,
|
||||
}
|
||||
|
||||
results = append(results, &thisCertInfo)
|
||||
|
@ -155,7 +155,7 @@ func GetDefaultRootConfig() (*dynamicproxy.ProxyEndpoint, error) {
|
||||
*/
|
||||
|
||||
func ExportConfigAsZip(w http.ResponseWriter, r *http.Request) {
|
||||
includeSysDBRaw, err := utils.GetPara(r, "includeDB")
|
||||
includeSysDBRaw, _ := utils.GetPara(r, "includeDB")
|
||||
includeSysDB := false
|
||||
if includeSysDBRaw == "true" {
|
||||
//Include the system database in backup snapshot
|
||||
@ -177,7 +177,7 @@ func ExportConfigAsZip(w http.ResponseWriter, r *http.Request) {
|
||||
defer zipWriter.Close()
|
||||
|
||||
// Walk through the folder and add files to the zip
|
||||
err = filepath.Walk(folderPath, func(filePath string, fileInfo os.FileInfo, err error) error {
|
||||
err := filepath.Walk(folderPath, func(filePath string, fileInfo os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
140
src/go.mod
140
src/go.mod
@ -20,15 +20,155 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
cloud.google.com/go/compute v1.20.1 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.2.3 // indirect
|
||||
github.com/AdamSLevy/jsonrpc2/v14 v14.1.0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.1.0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.1.0 // indirect
|
||||
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
|
||||
github.com/Azure/go-autorest/autorest v0.11.29 // indirect
|
||||
github.com/Azure/go-autorest/autorest/adal v0.9.22 // indirect
|
||||
github.com/Azure/go-autorest/autorest/azure/auth v0.5.12 // indirect
|
||||
github.com/Azure/go-autorest/autorest/azure/cli v0.4.5 // indirect
|
||||
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
|
||||
github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect
|
||||
github.com/Azure/go-autorest/logger v0.2.1 // indirect
|
||||
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect
|
||||
github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87 // indirect
|
||||
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 // indirect
|
||||
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1755 // indirect
|
||||
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect
|
||||
github.com/aws/aws-sdk-go-v2 v1.24.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/config v1.26.6 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/lightsail v1.34.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.37.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect
|
||||
github.com/aws/smithy-go v1.19.0 // indirect
|
||||
github.com/aymerick/douceur v0.2.0 // indirect
|
||||
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc // indirect
|
||||
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
|
||||
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||||
github.com/civo/civogo v0.3.11 // indirect
|
||||
github.com/cloudflare/cloudflare-go v0.86.0 // indirect
|
||||
github.com/cpu/goacmedns v0.1.1 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/deepmap/oapi-codegen v1.9.1 // indirect
|
||||
github.com/dimchansky/utfbom v1.1.1 // indirect
|
||||
github.com/dnsimple/dnsimple-go v1.2.0 // indirect
|
||||
github.com/exoscale/egoscale v0.102.3 // indirect
|
||||
github.com/fatih/structs v1.1.0 // indirect
|
||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||
github.com/ghodss/yaml v1.0.0 // indirect
|
||||
github.com/go-errors/errors v1.0.1 // indirect
|
||||
github.com/go-jose/go-jose/v4 v4.0.1 // indirect
|
||||
github.com/go-resty/resty/v2 v2.11.0 // indirect
|
||||
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect
|
||||
github.com/goccy/go-json v0.10.2 // indirect
|
||||
github.com/gofrs/uuid v4.4.0+incompatible // indirect
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/google/go-querystring v1.1.0 // indirect
|
||||
github.com/google/s2a-go v0.1.4 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
|
||||
github.com/googleapis/gax-go/v2 v2.11.0 // indirect
|
||||
github.com/gophercloud/gophercloud v1.0.0 // indirect
|
||||
github.com/gophercloud/utils v0.0.0-20210216074907-f6de111f2eae // indirect
|
||||
github.com/gorilla/css v1.0.1 // indirect
|
||||
github.com/gorilla/securecookie v1.1.2 // indirect
|
||||
github.com/hashicorp/errwrap v1.0.0 // indirect
|
||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/hashicorp/go-retryablehttp v0.7.5 // indirect
|
||||
github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df // indirect
|
||||
github.com/infobloxopen/infoblox-go-client v1.1.1 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect
|
||||
github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b // indirect
|
||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||
github.com/labbsr0x/bindman-dns-webhook v1.0.2 // indirect
|
||||
github.com/labbsr0x/goh v1.0.1 // indirect
|
||||
github.com/linode/linodego v1.28.0 // indirect
|
||||
github.com/liquidweb/liquidweb-cli v0.6.9 // indirect
|
||||
github.com/liquidweb/liquidweb-go v1.6.4 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/miekg/dns v1.1.58 // indirect
|
||||
github.com/mimuret/golang-iij-dpf v0.9.1 // indirect
|
||||
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04 // indirect
|
||||
github.com/nrdcg/auroradns v1.1.0 // indirect
|
||||
github.com/nrdcg/bunny-go v0.0.0-20230728143221-c9dda82568d9 // indirect
|
||||
github.com/nrdcg/desec v0.7.0 // indirect
|
||||
github.com/nrdcg/dnspod-go v0.4.0 // indirect
|
||||
github.com/nrdcg/freemyip v0.2.0 // indirect
|
||||
github.com/nrdcg/goinwx v0.10.0 // indirect
|
||||
github.com/nrdcg/mailinabox v0.2.0 // indirect
|
||||
github.com/nrdcg/namesilo v0.2.1 // indirect
|
||||
github.com/nrdcg/nodion v0.1.0 // indirect
|
||||
github.com/nrdcg/porkbun v0.3.0 // indirect
|
||||
github.com/nzdjb/go-metaname v1.0.0 // indirect
|
||||
github.com/oracle/oci-go-sdk v24.3.0+incompatible // indirect
|
||||
github.com/ovh/go-ovh v1.4.3 // indirect
|
||||
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
|
||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/pquerna/otp v1.4.0 // indirect
|
||||
github.com/sacloud/api-client-go v0.2.8 // indirect
|
||||
github.com/sacloud/go-http v0.1.6 // indirect
|
||||
github.com/sacloud/iaas-api-go v1.11.1 // indirect
|
||||
github.com/sacloud/packages-go v0.0.9 // indirect
|
||||
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.22 // indirect
|
||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 // indirect
|
||||
github.com/softlayer/softlayer-go v1.1.3 // indirect
|
||||
github.com/softlayer/xmlrpc v0.0.0-20200409220501-5f089df7cb7e // indirect
|
||||
github.com/spf13/cast v1.3.1 // indirect
|
||||
github.com/stretchr/objx v0.5.1 // indirect
|
||||
github.com/stretchr/testify v1.8.4 // indirect
|
||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.490 // indirect
|
||||
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.490 // indirect
|
||||
github.com/transip/gotransip/v6 v6.23.0 // indirect
|
||||
github.com/ultradns/ultradns-go-sdk v1.6.1-20231103022937-8589b6a // indirect
|
||||
github.com/vinyldns/go-vinyldns v0.9.16 // indirect
|
||||
github.com/vultr/govultr/v2 v2.17.2 // indirect
|
||||
github.com/yandex-cloud/go-genproto v0.0.0-20220805142335-27b56ddae16f // indirect
|
||||
github.com/yandex-cloud/go-sdk v0.0.0-20220805164847-cf028e604997 // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
go.uber.org/ratelimit v0.2.0 // indirect
|
||||
golang.org/x/crypto v0.21.0 // indirect
|
||||
golang.org/x/mod v0.16.0 // indirect
|
||||
golang.org/x/oauth2 v0.16.0 // indirect
|
||||
golang.org/x/sync v0.6.0 // indirect
|
||||
golang.org/x/time v0.5.0 // indirect
|
||||
golang.org/x/tools v0.19.0 // indirect
|
||||
google.golang.org/api v0.126.0 // indirect
|
||||
google.golang.org/appengine v1.6.7 // indirect
|
||||
google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect
|
||||
google.golang.org/grpc v1.55.0 // indirect
|
||||
google.golang.org/protobuf v1.31.0 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/ns1/ns1-go.v2 v2.7.13 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
@ -52,7 +52,7 @@ var logOutputToFile = flag.Bool("log", true, "Log terminal output to file")
|
||||
|
||||
var (
|
||||
name = "Zoraxy"
|
||||
version = "3.0.3"
|
||||
version = "3.0.4"
|
||||
nodeUUID = "generic"
|
||||
development = false //Set this to false to use embedded web fs
|
||||
bootTime = time.Now().Unix()
|
||||
|
@ -33,7 +33,7 @@ type CertificateInfoJSON struct {
|
||||
AcmeName string `json:"acme_name"`
|
||||
AcmeUrl string `json:"acme_url"`
|
||||
SkipTLS bool `json:"skip_tls"`
|
||||
DNS bool `json:"dns"`
|
||||
UseDNS bool `json:"dns"`
|
||||
}
|
||||
|
||||
// ACMEUser represents a user in the ACME system.
|
||||
@ -80,7 +80,7 @@ func NewACME(acmeServer string, port string, database *database.Database) *ACMEH
|
||||
}
|
||||
|
||||
// ObtainCert obtains a certificate for the specified domains.
|
||||
func (a *ACMEHandler) ObtainCert(domains []string, certificateName string, email string, caName string, caUrl string, skipTLS bool, dns bool) (bool, error) {
|
||||
func (a *ACMEHandler) ObtainCert(domains []string, certificateName string, email string, caName string, caUrl string, skipTLS bool, useDNS bool) (bool, error) {
|
||||
log.Println("[ACME] Obtaining certificate...")
|
||||
|
||||
// generate private key
|
||||
@ -117,6 +117,11 @@ func (a *ACMEHandler) ObtainCert(domains []string, certificateName string, email
|
||||
}
|
||||
}
|
||||
|
||||
//Fallback to Let's Encrypt if it is not set
|
||||
if caName == "" {
|
||||
caName = "Let's Encrypt"
|
||||
}
|
||||
|
||||
// setup the custom ACME url endpoint.
|
||||
if caUrl != "" {
|
||||
config.CADirURL = caUrl
|
||||
@ -146,7 +151,7 @@ func (a *ACMEHandler) ObtainCert(domains []string, certificateName string, email
|
||||
}
|
||||
|
||||
// setup how to receive challenge
|
||||
if dns {
|
||||
if useDNS {
|
||||
if !a.Database.TableExists("acme") {
|
||||
a.Database.NewTable("acme")
|
||||
return false, errors.New("DNS Provider and DNS Credenital configuration required for ACME Provider (Error -1)")
|
||||
@ -279,7 +284,7 @@ func (a *ACMEHandler) ObtainCert(domains []string, certificateName string, email
|
||||
AcmeName: caName,
|
||||
AcmeUrl: caUrl,
|
||||
SkipTLS: skipTLS,
|
||||
DNS: dns,
|
||||
UseDNS: useDNS,
|
||||
}
|
||||
|
||||
certInfoBytes, err := json.Marshal(certInfo)
|
||||
@ -392,6 +397,8 @@ func (a *ACMEHandler) HandleRenewCertificate(w http.ResponseWriter, r *http.Requ
|
||||
utils.SendErrorResponse(w, jsonEscape(err.Error()))
|
||||
return
|
||||
}
|
||||
//Make sure the wildcard * do not goes into the filename
|
||||
filename = strings.ReplaceAll(filename, "*", "_")
|
||||
|
||||
email, err := utils.PostPara(r, "email")
|
||||
if err != nil {
|
||||
|
@ -1,22 +1,35 @@
|
||||
package acme
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/go-acme/lego/v4/challenge"
|
||||
"github.com/go-acme/lego/v4/providers/dns"
|
||||
"imuslab.com/zoraxy/mod/acme/acmedns"
|
||||
)
|
||||
|
||||
func GetDnsChallengeProviderByName(dnsProvider string, dnsCredentials string) (challenge.Provider, error) {
|
||||
credentials := extractDnsCredentials(dnsCredentials)
|
||||
|
||||
//Original Implementation
|
||||
/*credentials, err := extractDnsCredentials(dnsCredentials)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
setCredentialsIntoEnvironmentVariables(credentials)
|
||||
|
||||
provider, err := dns.NewDNSChallengeProviderByName(dnsProvider)
|
||||
return provider, err
|
||||
*/
|
||||
|
||||
//New implementation using acmedns CICD pipeline generated datatype
|
||||
return acmedns.GetDNSProviderByJsonConfig(dnsProvider, dnsCredentials)
|
||||
}
|
||||
|
||||
/*
|
||||
Original implementation of DNS ACME using OS.Env as payload
|
||||
*/
|
||||
|
||||
func setCredentialsIntoEnvironmentVariables(credentials map[string]string) {
|
||||
for key, value := range credentials {
|
||||
err := os.Setenv(key, value)
|
||||
@ -28,7 +41,7 @@ func setCredentialsIntoEnvironmentVariables(credentials map[string]string) {
|
||||
}
|
||||
}
|
||||
|
||||
func extractDnsCredentials(input string) map[string]string {
|
||||
func extractDnsCredentials(input string) (map[string]string, error) {
|
||||
result := make(map[string]string)
|
||||
|
||||
// Split the input string by newline character
|
||||
@ -37,7 +50,8 @@ func extractDnsCredentials(input string) map[string]string {
|
||||
// Iterate over each line
|
||||
for _, line := range lines {
|
||||
// Split the line by "=" character
|
||||
parts := strings.Split(line, "=")
|
||||
//use SpliyN to make sure not to split the value if the value is base64
|
||||
parts := strings.SplitN(line, "=", 1)
|
||||
|
||||
// Check if the line is in the correct format
|
||||
if len(parts) == 2 {
|
||||
@ -46,8 +60,13 @@ func extractDnsCredentials(input string) map[string]string {
|
||||
|
||||
// Add the key-value pair to the map
|
||||
result[key] = value
|
||||
|
||||
if value == "" || key == "" {
|
||||
//invalid config
|
||||
return result, errors.New("DNS credential extract failed")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
return result, nil
|
||||
}
|
||||
|
982
src/mod/acme/acmedns/acmedns.go
Normal file
982
src/mod/acme/acmedns/acmedns.go
Normal 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.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 "cpanel":
|
||||
cfg := cpanel.NewDefaultConfig()
|
||||
err := json.Unmarshal([]byte(js), &cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cpanel.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 "mailinabox":
|
||||
cfg := mailinabox.NewDefaultConfig()
|
||||
err := json.Unmarshal([]byte(js), &cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return mailinabox.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 "shellrent":
|
||||
cfg := shellrent.NewDefaultConfig()
|
||||
err := json.Unmarshal([]byte(js), &cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return shellrent.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)
|
||||
}
|
||||
}
|
27
src/mod/acme/acmedns/acmedns_test.go
Normal file
27
src/mod/acme/acmedns/acmedns_test.go
Normal 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)
|
||||
}
|
||||
|
||||
}
|
3493
src/mod/acme/acmedns/providers.json
Normal file
3493
src/mod/acme/acmedns/providers.json
Normal file
File diff suppressed because it is too large
Load Diff
80
src/mod/acme/acmedns/providerutils.go
Normal file
80
src/mod/acme/acmedns/providerutils.go
Normal 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))
|
||||
}
|
@ -356,7 +356,7 @@ func (a *AutoRenewer) renewExpiredDomains(certs []*ExpiredCerts) ([]string, erro
|
||||
}
|
||||
}
|
||||
|
||||
_, err = a.AcmeHandler.ObtainCert(expiredCert.Domains, certName, a.RenewerConfig.Email, certInfo.AcmeName, certInfo.AcmeUrl, certInfo.SkipTLS, certInfo.DNS)
|
||||
_, err = a.AcmeHandler.ObtainCert(expiredCert.Domains, certName, a.RenewerConfig.Email, certInfo.AcmeName, certInfo.AcmeUrl, certInfo.SkipTLS, certInfo.UseDNS)
|
||||
if err != nil {
|
||||
log.Println("Renew " + fileName + "(" + strings.Join(expiredCert.Domains, ",") + ") failed: " + err.Error())
|
||||
} else {
|
||||
|
@ -51,8 +51,29 @@ func TestResolveCountryCodeFromIP(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test an IP address that should return a valid country code
|
||||
ip := "8.8.8.8"
|
||||
expected := "US"
|
||||
knownIpCountryMap := [][]string{
|
||||
{"3.224.220.101", "US"},
|
||||
{"176.113.115.113", "RU"},
|
||||
{"65.21.233.213", "FI"},
|
||||
{"94.23.207.193", "FR"},
|
||||
}
|
||||
|
||||
for _, testcase := range knownIpCountryMap {
|
||||
ip := testcase[0]
|
||||
expected := testcase[1]
|
||||
info, err := store.ResolveCountryCodeFromIP(ip)
|
||||
if err != nil {
|
||||
t.Errorf("error resolving country code for IP %s: %v", ip, err)
|
||||
return
|
||||
}
|
||||
if info.CountryIsoCode != expected {
|
||||
t.Errorf("expected country code %s, but got %s for IP %s", expected, info.CountryIsoCode, ip)
|
||||
}
|
||||
}
|
||||
|
||||
// Test an IP address that should return an empty country code
|
||||
ip := "127.0.0.1"
|
||||
expected := ""
|
||||
info, err := store.ResolveCountryCodeFromIP(ip)
|
||||
if err != nil {
|
||||
t.Errorf("error resolving country code for IP %s: %v", ip, err)
|
||||
@ -61,16 +82,4 @@ func TestResolveCountryCodeFromIP(t *testing.T) {
|
||||
if info.CountryIsoCode != expected {
|
||||
t.Errorf("expected country code %s, but got %s for IP %s", expected, info.CountryIsoCode, ip)
|
||||
}
|
||||
|
||||
// Test an IP address that should return an empty country code
|
||||
ip = "127.0.0.1"
|
||||
expected = ""
|
||||
info, err = store.ResolveCountryCodeFromIP(ip)
|
||||
if err != nil {
|
||||
t.Errorf("error resolving country code for IP %s: %v", ip, err)
|
||||
return
|
||||
}
|
||||
if info.CountryIsoCode != expected {
|
||||
t.Errorf("expected country code %s, but got %s for IP %s", expected, info.CountryIsoCode, ip)
|
||||
}
|
||||
}
|
||||
|
123399
src/mod/geodb/geoipv4.csv
123399
src/mod/geodb/geoipv4.csv
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
2
src/start.sh
Normal file
2
src/start.sh
Normal file
@ -0,0 +1,2 @@
|
||||
#/bin/bash
|
||||
sudo ./zoraxy
|
@ -361,8 +361,8 @@
|
||||
<td>${entry.Domain}</td>
|
||||
<td>${entry.LastModifiedDate}</td>
|
||||
<td class="${isExpired?"expired":"valid"} certdate">${entry.ExpireDate} (${!isExpired?entry.RemainingDays+" days left":"Expired"})</td>
|
||||
<td><i class="${entry.DNS?"green check": "red times"} circle outline icon"></i></td>
|
||||
<td><button title="Renew Certificate" class="ui mini basic icon button renewButton" onclick="renewCertificate('${entry.Domain}', '${entry.DNS}', this);"><i class="ui green refresh icon"></i></button></td>
|
||||
<td><i class="${entry.UseDNS?"green check": "red times"} circle outline icon"></i></td>
|
||||
<td><button title="Renew Certificate" class="ui mini basic icon button renewButton" onclick="renewCertificate('${entry.Domain}', '${entry.UseDNS}', this);"><i class="ui green refresh icon"></i></button></td>
|
||||
<td><button title="Delete key-pair" class="ui mini basic red icon button" onclick="deleteCertificate('${entry.Domain}');"><i class="ui red trash icon"></i></button></td>
|
||||
</tr>`);
|
||||
});
|
||||
|
@ -122,153 +122,31 @@
|
||||
</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>DNS Credentials (Leave all fields empty to use previous settings)<br>
|
||||
<small><i class="yellow exclamation triangle icon"></i> Note that domain DNS credentials are stored separately. For each new subdomain, you will need to enter a new DNS credentials.</small></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>
|
||||
@ -478,11 +356,29 @@
|
||||
// Button click event handler for obtaining certificate
|
||||
$("#obtainButton").click(function() {
|
||||
$("#obtainButton").addClass("loading").addClass("disabled");
|
||||
updateCertificateEAB();
|
||||
updateCertificateDNS();
|
||||
obtainCertificate();
|
||||
updateCertificateEAB(function(succ){
|
||||
if (succ){
|
||||
//Continue to next step
|
||||
updateCertificateDNS(function(succ){
|
||||
if (succ){
|
||||
obtainCertificate(function(succ){
|
||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
});
|
||||
}else{
|
||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
console.log("update Certificate DNS process halted");
|
||||
}
|
||||
});
|
||||
}else{
|
||||
console.log("Update Certificate EAB process halted");
|
||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
//On CA change in dropdown
|
||||
$("input[name=ca]").on('change', function() {
|
||||
if(this.value == "Custom ACME Server") {
|
||||
$("#caInput").show();
|
||||
@ -490,421 +386,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<prefix>.<secret>=");
|
||||
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() {
|
||||
@ -931,7 +477,7 @@
|
||||
|
||||
|
||||
// Update EAB values for autorenewal
|
||||
function updateCertificateEAB() {
|
||||
function updateCertificateEAB(callback=undefined) {
|
||||
var ca = $("#ca").dropdown("get value");
|
||||
var caURL = "";
|
||||
if (ca == "Custom ACME Server") {
|
||||
@ -944,6 +490,10 @@
|
||||
}
|
||||
|
||||
if(caURL == "") {
|
||||
//Skip update
|
||||
if (callback != undefined){
|
||||
callback(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -951,6 +501,10 @@
|
||||
var hmac = $("#eab_hmac").val();
|
||||
|
||||
if(kid == "" || hmac == "") {
|
||||
//Skip update
|
||||
if (callback != undefined){
|
||||
callback(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -970,6 +524,9 @@
|
||||
console.log("Error:", response.error);
|
||||
// Show error message
|
||||
parent.msgbox(response.error, false, 12000);
|
||||
if (callback != undefined){
|
||||
callback(false);
|
||||
}
|
||||
} else {
|
||||
console.log("Certificate EAB updated successfully");
|
||||
// Show success message
|
||||
@ -977,44 +534,92 @@
|
||||
|
||||
// Renew the parent certificate list
|
||||
parent.initManagedDomainCertificateList();
|
||||
if (callback != undefined){
|
||||
callback(true);
|
||||
}
|
||||
}
|
||||
},
|
||||
error: function(error) {
|
||||
//$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
console.log("Failed to update EAB configuration:", error);
|
||||
parent.msgbox("Failed to update EAB configuration");
|
||||
if (callback != undefined){
|
||||
callback(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//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");
|
||||
let value = "";
|
||||
if ($(this).hasClass("checkbox")){
|
||||
//Boolean option
|
||||
let checked = $(this).find("input")[0].checked;
|
||||
dnsCredentials[thisKey] = checked;
|
||||
}else{
|
||||
//String or int options
|
||||
let value = $(this).find("input").val().trim();
|
||||
dnsCredentials[thisKey] = value;
|
||||
}
|
||||
});
|
||||
|
||||
return dnsCredentials;
|
||||
}
|
||||
|
||||
// Update DNS values for autorenewal
|
||||
function updateCertificateDNS() {
|
||||
function updateCertificateDNS(callback=undefined) {
|
||||
var dns = $("#useDnsChallenge")[0].checked;
|
||||
var dnsProvider = "";
|
||||
var dnsCredentials = "";
|
||||
|
||||
if (dns) {
|
||||
dnsProvider = $("#dnsProvider").dropdown("get value");
|
||||
dnsCredentials = $("#dnsCredentials").val();
|
||||
|
||||
if(dnsProvider == "") {
|
||||
parent.msgbox("DNS Provider cannot be empty", false, 5000);
|
||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
return;
|
||||
if (!dns) {
|
||||
if (callback != undefined){
|
||||
callback(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if(dnsCredentials == "") {
|
||||
parent.msgbox("DNS Credentials cannot be empty", false, 5000);
|
||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
return;
|
||||
//Check if all fields is empty. If yes, do not update the config
|
||||
let allFieldsEmpty = true;
|
||||
$(".dnsConfigField").each(function(){
|
||||
if ($(this).find("input").val().trim() != ""){
|
||||
allFieldsEmpty = false;
|
||||
}
|
||||
});
|
||||
if (allFieldsEmpty){
|
||||
//Do not update config on server side
|
||||
if (callback != undefined){
|
||||
callback(true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
dnsProvider = $("#dnsProvider").dropdown("get value");
|
||||
|
||||
//dnsCredentials = $("#dnsCredentials").val();
|
||||
dnsCredentials = readDnsCredentials();
|
||||
|
||||
if(dnsProvider == "") {
|
||||
parent.msgbox("DNS Provider cannot be empty", false, 5000);
|
||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
if (callback != undefined){
|
||||
callback(false);
|
||||
}
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
var filename = getFilename();
|
||||
if (filename == '') {
|
||||
parent.msgbox("Domain to renew cannot be empty", false, 5000);
|
||||
if (callback != undefined){
|
||||
callback(false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1024,7 +629,7 @@
|
||||
data: {
|
||||
filename: filename,
|
||||
dnsProvider: dnsProvider,
|
||||
dnsCredentials: dnsCredentials,
|
||||
dnsCredentials: JSON.stringify(dnsCredentials),
|
||||
},
|
||||
success: function(response) {
|
||||
//$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
@ -1032,31 +637,44 @@
|
||||
console.log("Error:", response.error);
|
||||
// Show error message
|
||||
parent.msgbox(response.error, false, 12000);
|
||||
if (callback != undefined){
|
||||
callback(false);
|
||||
}
|
||||
} else {
|
||||
console.log("Certificate DNS Credentials updated successfully");
|
||||
// Show success message
|
||||
parent.msgbox("Certificate DNS Credentials updated successfully");
|
||||
if (callback != undefined){
|
||||
callback(true);
|
||||
}
|
||||
}
|
||||
},
|
||||
error: function(error) {
|
||||
//$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
console.log("Failed to update DNS configuration:", error);
|
||||
parent.msgbox("Failed to update DNS configuration");
|
||||
if (callback != undefined){
|
||||
callback(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Obtain certificate from API
|
||||
function obtainCertificate() {
|
||||
function obtainCertificate(callback=undefined) {
|
||||
var domains = $("#domainsInput").val();
|
||||
var filename = getFilename();
|
||||
if (filename == '') {
|
||||
if (callback != undefined){
|
||||
parent.msgbox("Domain to obtain certificate cannot be empty", false)
|
||||
callback(false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
var email = $("#caRegisterEmail").val();
|
||||
if (email == ""){
|
||||
parent.msgbox("ACME renew email is not set", false)
|
||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
if (callback != undefined){callback(false);}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1090,6 +708,7 @@
|
||||
console.log("Error:", response.error);
|
||||
// Show error message
|
||||
parent.msgbox(response.error, false, 12000);
|
||||
if (callback != undefined){callback(false);}
|
||||
} else {
|
||||
console.log("Certificate renewed successfully");
|
||||
// Show success message
|
||||
@ -1097,11 +716,14 @@
|
||||
|
||||
// Renew the parent certificate list
|
||||
parent.initManagedDomainCertificateList();
|
||||
|
||||
if (callback != undefined){callback(true);}
|
||||
}
|
||||
},
|
||||
error: function(error) {
|
||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||
console.log("Failed to renewed certificate:", error);
|
||||
if (callback != undefined){callback(false);}
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -1234,7 +856,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>
|
||||
|
132
src/web/snippet/dnsnames.json
Normal file
132
src/web/snippet/dnsnames.json
Normal 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"
|
||||
}
|
||||
|
38
tools/dns_challenge_update/code-gen/README.md
Normal file
38
tools/dns_challenge_update/code-gen/README.md
Normal file
@ -0,0 +1,38 @@
|
||||
### DNS Challenge Update Data Structure Code Generator
|
||||
|
||||
This script is designed to automatically pull lego, update the `acmedns` module with new json file and create a function for automatically create a provider based on the given providers name and config json.
|
||||
|
||||
### Usage
|
||||
|
||||
To update the module, simply run update.sh
|
||||
|
||||
```
|
||||
./update.sh
|
||||
```
|
||||
|
||||
The updated files will be written into the `acmedns` folder. Then, you can copy it to the ACME module folder (or later-on a CICD pipeline will be made to do this automatically, but for now you have to manually copy it into the module under `src/mod/acme/`)
|
||||
|
||||
|
||||
|
||||
### Module Usage
|
||||
|
||||
To use the module, you can call to the following function inside the `acmedns`
|
||||
|
||||
```go
|
||||
func GetDNSProviderByJsonConfig(name string, js string)(challenge.Provider, error)
|
||||
|
||||
//For example
|
||||
providersdef.GetDNSProviderByJsonConfig("gandi", "{\"Username\":\"far\",\"Password\":\"boo\"}")
|
||||
```
|
||||
|
||||
|
||||
|
||||
This should be able to replace the default lego v4 build in one (the one attached below) that requires the use of environment variables
|
||||
|
||||
```go
|
||||
// NewDNSChallengeProviderByName Factory for DNS providers.
|
||||
func NewDNSChallengeProviderByName(name string) (challenge.Provider, error)
|
||||
```
|
||||
|
||||
|
||||
|
982
tools/dns_challenge_update/code-gen/acmedns/acmedns.go
Normal file
982
tools/dns_challenge_update/code-gen/acmedns/acmedns.go
Normal 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.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 "cpanel":
|
||||
cfg := cpanel.NewDefaultConfig()
|
||||
err := json.Unmarshal([]byte(js), &cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cpanel.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 "mailinabox":
|
||||
cfg := mailinabox.NewDefaultConfig()
|
||||
err := json.Unmarshal([]byte(js), &cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return mailinabox.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 "shellrent":
|
||||
cfg := shellrent.NewDefaultConfig()
|
||||
err := json.Unmarshal([]byte(js), &cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return shellrent.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)
|
||||
}
|
||||
}
|
3493
tools/dns_challenge_update/code-gen/acmedns/providers.json
Normal file
3493
tools/dns_challenge_update/code-gen/acmedns/providers.json
Normal file
File diff suppressed because it is too large
Load Diff
240
tools/dns_challenge_update/code-gen/extract.go
Normal file
240
tools/dns_challenge_update/code-gen/extract.go
Normal file
@ -0,0 +1,240 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var legoProvidersSourceFolder string = "./lego/providers/dns/"
|
||||
var outputDir string = "./acmedns"
|
||||
var defTemplate string = `package acmedns
|
||||
/*
|
||||
THIS MODULE IS GENERATED AUTOMATICALLY
|
||||
DO NOT EDIT THIS FILE
|
||||
*/
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/go-acme/lego/v4/challenge"
|
||||
{{imports}}
|
||||
)
|
||||
|
||||
//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 {
|
||||
{{magic}}
|
||||
default:
|
||||
return nil, fmt.Errorf("unrecognized DNS provider: %s", name)
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
type Field struct {
|
||||
Title string
|
||||
Datatype string
|
||||
}
|
||||
type ProviderInfo struct {
|
||||
Name string //Name of this provider
|
||||
ConfigableFields []*Field //Field that shd be expose to user for filling in
|
||||
HiddenFields []*Field //Fields that is usable but shd be hidden from user
|
||||
}
|
||||
|
||||
func fileExists(filePath string) bool {
|
||||
_, err := os.Stat(filePath)
|
||||
if err == nil {
|
||||
return true
|
||||
}
|
||||
if os.IsNotExist(err) {
|
||||
return false
|
||||
}
|
||||
// For other errors, you may handle them differently
|
||||
return false
|
||||
}
|
||||
|
||||
// This function define the DNS not supported by zoraxy
|
||||
func getExcludedDNSProviders() []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
|
||||
}
|
||||
}
|
||||
|
||||
func isInSlice(str string, slice []string) bool {
|
||||
for _, s := range slice {
|
||||
if s == str {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func isExcludedDNSProvider(providerName string) bool {
|
||||
return isInSlice(providerName, getExcludedDNSProviders())
|
||||
}
|
||||
|
||||
// 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.
|
||||
structRegex := regexp.MustCompile(`type\s+([A-Za-z0-9_]+)\s+struct\s*{([^{}]*)}`)
|
||||
|
||||
// Find the first match of the struct declaration.
|
||||
match := structRegex.FindStringSubmatch(sourceCode)
|
||||
if len(match) < 3 {
|
||||
return "", "" // No match found
|
||||
}
|
||||
|
||||
// Extract the struct name and its content.
|
||||
structName := match[1]
|
||||
structContent := match[2]
|
||||
|
||||
return structName, structContent
|
||||
}
|
||||
|
||||
func main() {
|
||||
// A map of provider name to information on what can be filled
|
||||
extractedProviderList := map[string]*ProviderInfo{}
|
||||
|
||||
//Search all providers
|
||||
providers, err := filepath.Glob(filepath.Join(legoProvidersSourceFolder, "/*"))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
//Create output folder if not exists
|
||||
err = os.MkdirAll(outputDir, 0775)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
generatedConvertcode := ""
|
||||
importList := ""
|
||||
for _, provider := range providers {
|
||||
providerName := filepath.Base(provider)
|
||||
if isExcludedDNSProvider(providerName) {
|
||||
//Ignore this provider
|
||||
continue
|
||||
}
|
||||
//Check if {provider_name}.go exists
|
||||
providerDef := filepath.Join(provider, providerName+".go")
|
||||
if !fileExists(providerDef) {
|
||||
continue
|
||||
}
|
||||
|
||||
fmt.Println("Extracting config structure for: " + providerDef)
|
||||
providerSrc, err := os.ReadFile(providerDef)
|
||||
if err != nil {
|
||||
fmt.Println(err.Error())
|
||||
return
|
||||
}
|
||||
_, strctContent := extractConfigStruct(string(providerSrc))
|
||||
|
||||
//Filter and write the content to json
|
||||
/*
|
||||
Example of stctContent (Note the tab prefix)
|
||||
|
||||
Token string
|
||||
PropagationTimeout time.Duration
|
||||
PollingInterval time.Duration
|
||||
SequenceInterval time.Duration
|
||||
HTTPClient *http.Client
|
||||
*/
|
||||
strctContentLines := strings.Split(strctContent, "\n")
|
||||
configKeys := []*Field{}
|
||||
hiddenKeys := []*Field{}
|
||||
for _, lineDef := range strctContentLines {
|
||||
fields := strings.Fields(lineDef)
|
||||
if len(fields) < 2 || strings.HasPrefix(fields[0], "//") {
|
||||
//Ignore this line
|
||||
continue
|
||||
}
|
||||
|
||||
//Filter out the fields that is not user-filled
|
||||
switch fields[1] {
|
||||
case "*url.URL":
|
||||
fallthrough
|
||||
case "string":
|
||||
configKeys = append(configKeys, &Field{
|
||||
Title: fields[0],
|
||||
Datatype: fields[1],
|
||||
})
|
||||
case "int":
|
||||
if fields[0] != "TTL" {
|
||||
configKeys = append(configKeys, &Field{
|
||||
Title: fields[0],
|
||||
Datatype: fields[1],
|
||||
})
|
||||
} else if fields[0] == "TTL" {
|
||||
//haveTTLField = true
|
||||
} else {
|
||||
hiddenKeys = append(hiddenKeys, &Field{
|
||||
Title: fields[0],
|
||||
Datatype: fields[1],
|
||||
})
|
||||
}
|
||||
case "bool":
|
||||
if fields[0] == "InsecureSkipVerify" || fields[0] == "SSLVerify" || fields[0] == "Debug" {
|
||||
configKeys = append(configKeys, &Field{
|
||||
Title: fields[0],
|
||||
Datatype: fields[1],
|
||||
})
|
||||
} else {
|
||||
hiddenKeys = append(hiddenKeys, &Field{
|
||||
Title: fields[0],
|
||||
Datatype: fields[1],
|
||||
})
|
||||
}
|
||||
default:
|
||||
//Not used fields
|
||||
hiddenKeys = append(hiddenKeys, &Field{
|
||||
Title: fields[0],
|
||||
Datatype: fields[1],
|
||||
})
|
||||
}
|
||||
}
|
||||
fmt.Println(strctContent)
|
||||
|
||||
extractedProviderList[providerName] = &ProviderInfo{
|
||||
Name: providerName,
|
||||
ConfigableFields: configKeys,
|
||||
HiddenFields: hiddenKeys,
|
||||
}
|
||||
|
||||
//Generate the code for converting incoming json into target config
|
||||
codeSegment := `
|
||||
case "` + providerName + `":
|
||||
cfg := ` + providerName + `.NewDefaultConfig()
|
||||
err := json.Unmarshal([]byte(js), &cfg)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return ` + providerName + `.NewDNSProviderConfig(cfg)`
|
||||
|
||||
generatedConvertcode += codeSegment
|
||||
importList += ` "github.com/go-acme/lego/v4/providers/dns/` + providerName + "\"\n"
|
||||
}
|
||||
|
||||
js, err := json.MarshalIndent(extractedProviderList, "", " ")
|
||||
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)
|
||||
fmt.Println("Output written to file")
|
||||
}
|
26
tools/dns_challenge_update/code-gen/update.sh
Normal file
26
tools/dns_challenge_update/code-gen/update.sh
Normal file
@ -0,0 +1,26 @@
|
||||
#/bin/bash
|
||||
|
||||
repo_url="https://github.com/go-acme/lego"
|
||||
|
||||
# Check if the folder "./lego" exists
|
||||
if [ -d "./lego" ]; then
|
||||
# If the folder exists, change into it and perform a git pull
|
||||
echo "Folder './lego' exists. Pulling updates..."
|
||||
cd "./lego" || exit
|
||||
git pull
|
||||
cd ../
|
||||
else
|
||||
# If the folder doesn't exist, clone the repository
|
||||
echo "Folder './lego' does not exist. Cloning the repository..."
|
||||
git clone "$repo_url" "./lego" || exit
|
||||
fi
|
||||
|
||||
# Run the extract.go to get all the config from lego source code
|
||||
echo "Generating code"
|
||||
go run ./extract.go
|
||||
|
||||
echo "Cleaning up lego"
|
||||
# Comment the line below if you dont want to pull everytime update
|
||||
# This is to help go compiler to not load all the lego source file when compile
|
||||
#rm -rf ./lego/
|
||||
echo "Config generated"
|
Loading…
x
Reference in New Issue
Block a user