mirror of
https://github.com/tobychui/zoraxy.git
synced 2025-06-06 15:47:19 +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
15
README.md
15
README.md
@ -34,6 +34,7 @@ General purpose request (reverse) proxy and forwarding tool for networking noobs
|
|||||||
- SMTP config for password reset
|
- SMTP config for password reset
|
||||||
|
|
||||||
## Downloads
|
## Downloads
|
||||||
|
|
||||||
[Windows](https://github.com/tobychui/zoraxy/releases/latest/download/zoraxy_windows_amd64.exe)
|
[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 (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)
|
/[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/)
|
For other systems or architectures, please see [Release](https://github.com/tobychui/zoraxy/releases/latest/)
|
||||||
|
|
||||||
## Build from Source
|
## Build from Source
|
||||||
|
|
||||||
Requires Go 1.22 or higher
|
Requires Go 1.22 or higher
|
||||||
|
|
||||||
```bash
|
```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.
|
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
|
#### Docker
|
||||||
|
|
||||||
See the [/docker](https://github.com/tobychui/zoraxy/tree/main/docker) folder for more details.
|
See the [/docker](https://github.com/tobychui/zoraxy/tree/main/docker) folder for more details.
|
||||||
|
|
||||||
### Start Paramters
|
### Start Paramters
|
||||||
|
|
||||||
```
|
```
|
||||||
Usage of zoraxy:
|
Usage of zoraxy:
|
||||||
-autorenew int
|
-autorenew int
|
||||||
ACME auto TLS/SSL certificate renew check interval (seconds) (default 86400)
|
ACME auto TLS/SSL certificate renew check interval (seconds) (default 86400)
|
||||||
-fastgeoip
|
-fastgeoip
|
||||||
Enable high speed geoip lookup, require 1GB extra memory (Not recommend for low end devices)
|
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
|
||||||
Log terminal output to file (default true)
|
Log terminal output to file (default true)
|
||||||
-mdns
|
-mdns
|
||||||
Enable mDNS scanner and transponder (default true)
|
Enable mDNS scanner and transponder (default true)
|
||||||
|
-mdnsname string
|
||||||
|
mDNS name, leave empty to use default (zoraxy_{node-uuid}.local)
|
||||||
-noauth
|
-noauth
|
||||||
Disable authentication for management interface
|
Disable authentication for management interface
|
||||||
-port string
|
-port string
|
||||||
@ -153,6 +157,7 @@ This allows you to have an infinite number of network members in your Global Are
|
|||||||
## Web SSH
|
## Web SSH
|
||||||
|
|
||||||
Web SSH currently only supports Linux based OSes. The following platforms are supported:
|
Web SSH currently only supports Linux based OSes. The following platforms are supported:
|
||||||
|
|
||||||
- linux/amd64
|
- linux/amd64
|
||||||
- linux/arm64
|
- linux/arm64
|
||||||
- linux/armv6 (experimental)
|
- linux/armv6 (experimental)
|
||||||
@ -167,12 +172,14 @@ Loopback web SSH connection, by default, is disabled. This means that if you are
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Sponsor This Project
|
## Sponsor This Project
|
||||||
|
|
||||||
If you like the project and want to support us, please consider a donation. You can use the links below
|
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)
|
- [tobychui (Primary author)](https://paypal.me/tobychui)
|
||||||
- PassiveLemon (Docker compatibility maintainer)
|
- PassiveLemon (Docker compatibility maintainer)
|
||||||
|
|
||||||
|
|
||||||
## License
|
## 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
|
// This function check if the renew setup is satisfied. If not, toggle them automatically
|
||||||
func AcmeCheckAndHandleRenewCertificate(w http.ResponseWriter, r *http.Request) {
|
func AcmeCheckAndHandleRenewCertificate(w http.ResponseWriter, r *http.Request) {
|
||||||
isForceHttpsRedirectEnabledOriginally := false
|
isForceHttpsRedirectEnabledOriginally := false
|
||||||
dnsPara, _ := utils.PostPara(r, "dns")
|
dnsPara, _ := utils.PostBool(r, "dns")
|
||||||
if dnsPara == "false" {
|
if !dnsPara {
|
||||||
if dynamicProxyRouter.Option.Port == 443 {
|
if dynamicProxyRouter.Option.Port == 443 {
|
||||||
//Enable port 80 to 443 redirect
|
//Enable port 80 to 443 redirect
|
||||||
if !dynamicProxyRouter.Option.ForceHttpsRedirect {
|
if !dynamicProxyRouter.Option.ForceHttpsRedirect {
|
||||||
@ -117,7 +117,7 @@ func AcmeCheckAndHandleRenewCertificate(w http.ResponseWriter, r *http.Request)
|
|||||||
tlsCertManager.UpdateLoadedCertList()
|
tlsCertManager.UpdateLoadedCertList()
|
||||||
|
|
||||||
//Restore original settings
|
//Restore original settings
|
||||||
if dynamicProxyRouter.Option.Port == 443 && dnsPara == "false" {
|
if dynamicProxyRouter.Option.Port == 443 && !dnsPara {
|
||||||
if !isForceHttpsRedirectEnabledOriginally {
|
if !isForceHttpsRedirectEnabledOriginally {
|
||||||
//Default is off. Turn the redirection off
|
//Default is off. Turn the redirection off
|
||||||
SystemWideLogger.PrintAndLog("ACME", "Restoring HTTP to HTTPS redirect settings", nil)
|
SystemWideLogger.PrintAndLog("ACME", "Restoring HTTP to HTTPS redirect settings", nil)
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/http/pprof"
|
"net/http/pprof"
|
||||||
|
|
||||||
|
"imuslab.com/zoraxy/mod/acme/acmedns"
|
||||||
"imuslab.com/zoraxy/mod/acme/acmewizard"
|
"imuslab.com/zoraxy/mod/acme/acmewizard"
|
||||||
"imuslab.com/zoraxy/mod/auth"
|
"imuslab.com/zoraxy/mod/auth"
|
||||||
"imuslab.com/zoraxy/mod/netstat"
|
"imuslab.com/zoraxy/mod/netstat"
|
||||||
@ -191,6 +192,7 @@ func initAPIs() {
|
|||||||
authRouter.HandleFunc("/api/acme/autoRenew/listDomains", acmeAutoRenewer.HandleLoadAutoRenewDomains)
|
authRouter.HandleFunc("/api/acme/autoRenew/listDomains", acmeAutoRenewer.HandleLoadAutoRenewDomains)
|
||||||
authRouter.HandleFunc("/api/acme/autoRenew/renewPolicy", acmeAutoRenewer.HandleRenewPolicy)
|
authRouter.HandleFunc("/api/acme/autoRenew/renewPolicy", acmeAutoRenewer.HandleRenewPolicy)
|
||||||
authRouter.HandleFunc("/api/acme/autoRenew/renewNow", acmeAutoRenewer.HandleRenewNow)
|
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
|
authRouter.HandleFunc("/api/acme/wizard", acmewizard.HandleGuidedStepCheck) //ACME Wizard
|
||||||
|
|
||||||
//Static Web Server
|
//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
|
LastModifiedDate string
|
||||||
ExpireDate string
|
ExpireDate string
|
||||||
RemainingDays int
|
RemainingDays int
|
||||||
DNS bool
|
UseDNS bool
|
||||||
}
|
}
|
||||||
|
|
||||||
results := []*CertInfo{}
|
results := []*CertInfo{}
|
||||||
@ -84,9 +84,10 @@ func handleListCertificate(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
certInfoFilename := filepath.Join(tlsCertManager.CertStore, filename+".json")
|
certInfoFilename := filepath.Join(tlsCertManager.CertStore, filename+".json")
|
||||||
certInfo, err := acme.LoadCertInfoJSON(certInfoFilename)
|
useDNSValidation := false //Default to false for HTTP TLS certificates
|
||||||
if err != nil {
|
certInfo, err := acme.LoadCertInfoJSON(certInfoFilename) //Note: Not all certs have info json
|
||||||
SystemWideLogger.PrintAndLog("Could not Load CertInfoJson", certInfoFilename, err)
|
if err == nil {
|
||||||
|
useDNSValidation = certInfo.UseDNS
|
||||||
}
|
}
|
||||||
|
|
||||||
thisCertInfo := CertInfo{
|
thisCertInfo := CertInfo{
|
||||||
@ -94,7 +95,7 @@ func handleListCertificate(w http.ResponseWriter, r *http.Request) {
|
|||||||
LastModifiedDate: modifiedTime,
|
LastModifiedDate: modifiedTime,
|
||||||
ExpireDate: certExpireTime,
|
ExpireDate: certExpireTime,
|
||||||
RemainingDays: expiredIn,
|
RemainingDays: expiredIn,
|
||||||
DNS: certInfo.DNS,
|
UseDNS: useDNSValidation,
|
||||||
}
|
}
|
||||||
|
|
||||||
results = append(results, &thisCertInfo)
|
results = append(results, &thisCertInfo)
|
||||||
|
@ -155,7 +155,7 @@ func GetDefaultRootConfig() (*dynamicproxy.ProxyEndpoint, error) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
func ExportConfigAsZip(w http.ResponseWriter, r *http.Request) {
|
func ExportConfigAsZip(w http.ResponseWriter, r *http.Request) {
|
||||||
includeSysDBRaw, err := utils.GetPara(r, "includeDB")
|
includeSysDBRaw, _ := utils.GetPara(r, "includeDB")
|
||||||
includeSysDB := false
|
includeSysDB := false
|
||||||
if includeSysDBRaw == "true" {
|
if includeSysDBRaw == "true" {
|
||||||
//Include the system database in backup snapshot
|
//Include the system database in backup snapshot
|
||||||
@ -177,7 +177,7 @@ func ExportConfigAsZip(w http.ResponseWriter, r *http.Request) {
|
|||||||
defer zipWriter.Close()
|
defer zipWriter.Close()
|
||||||
|
|
||||||
// Walk through the folder and add files to the zip
|
// 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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
140
src/go.mod
140
src/go.mod
@ -20,15 +20,155 @@ require (
|
|||||||
)
|
)
|
||||||
|
|
||||||
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/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 v2.2.1+incompatible // indirect
|
||||||
github.com/cenkalti/backoff/v4 v4.3.0 // 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-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/css v1.0.1 // indirect
|
||||||
github.com/gorilla/securecookie v1.1.2 // 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/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/crypto v0.21.0 // indirect
|
||||||
golang.org/x/mod v0.16.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/sync v0.6.0 // indirect
|
||||||
|
golang.org/x/time v0.5.0 // indirect
|
||||||
golang.org/x/tools v0.19.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 (
|
var (
|
||||||
name = "Zoraxy"
|
name = "Zoraxy"
|
||||||
version = "3.0.3"
|
version = "3.0.4"
|
||||||
nodeUUID = "generic"
|
nodeUUID = "generic"
|
||||||
development = false //Set this to false to use embedded web fs
|
development = false //Set this to false to use embedded web fs
|
||||||
bootTime = time.Now().Unix()
|
bootTime = time.Now().Unix()
|
||||||
|
@ -33,7 +33,7 @@ type CertificateInfoJSON struct {
|
|||||||
AcmeName string `json:"acme_name"`
|
AcmeName string `json:"acme_name"`
|
||||||
AcmeUrl string `json:"acme_url"`
|
AcmeUrl string `json:"acme_url"`
|
||||||
SkipTLS bool `json:"skip_tls"`
|
SkipTLS bool `json:"skip_tls"`
|
||||||
DNS bool `json:"dns"`
|
UseDNS bool `json:"dns"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ACMEUser represents a user in the ACME system.
|
// 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.
|
// 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...")
|
log.Println("[ACME] Obtaining certificate...")
|
||||||
|
|
||||||
// generate private key
|
// 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.
|
// setup the custom ACME url endpoint.
|
||||||
if caUrl != "" {
|
if caUrl != "" {
|
||||||
config.CADirURL = caUrl
|
config.CADirURL = caUrl
|
||||||
@ -146,7 +151,7 @@ func (a *ACMEHandler) ObtainCert(domains []string, certificateName string, email
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setup how to receive challenge
|
// setup how to receive challenge
|
||||||
if dns {
|
if useDNS {
|
||||||
if !a.Database.TableExists("acme") {
|
if !a.Database.TableExists("acme") {
|
||||||
a.Database.NewTable("acme")
|
a.Database.NewTable("acme")
|
||||||
return false, errors.New("DNS Provider and DNS Credenital configuration required for ACME Provider (Error -1)")
|
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,
|
AcmeName: caName,
|
||||||
AcmeUrl: caUrl,
|
AcmeUrl: caUrl,
|
||||||
SkipTLS: skipTLS,
|
SkipTLS: skipTLS,
|
||||||
DNS: dns,
|
UseDNS: useDNS,
|
||||||
}
|
}
|
||||||
|
|
||||||
certInfoBytes, err := json.Marshal(certInfo)
|
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()))
|
utils.SendErrorResponse(w, jsonEscape(err.Error()))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
//Make sure the wildcard * do not goes into the filename
|
||||||
|
filename = strings.ReplaceAll(filename, "*", "_")
|
||||||
|
|
||||||
email, err := utils.PostPara(r, "email")
|
email, err := utils.PostPara(r, "email")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -1,22 +1,35 @@
|
|||||||
package acme
|
package acme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/go-acme/lego/v4/challenge"
|
"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) {
|
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)
|
setCredentialsIntoEnvironmentVariables(credentials)
|
||||||
|
|
||||||
provider, err := dns.NewDNSChallengeProviderByName(dnsProvider)
|
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) {
|
func setCredentialsIntoEnvironmentVariables(credentials map[string]string) {
|
||||||
for key, value := range credentials {
|
for key, value := range credentials {
|
||||||
err := os.Setenv(key, value)
|
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)
|
result := make(map[string]string)
|
||||||
|
|
||||||
// Split the input string by newline character
|
// Split the input string by newline character
|
||||||
@ -37,7 +50,8 @@ func extractDnsCredentials(input string) map[string]string {
|
|||||||
// Iterate over each line
|
// Iterate over each line
|
||||||
for _, line := range lines {
|
for _, line := range lines {
|
||||||
// Split the line by "=" character
|
// 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
|
// Check if the line is in the correct format
|
||||||
if len(parts) == 2 {
|
if len(parts) == 2 {
|
||||||
@ -46,8 +60,13 @@ func extractDnsCredentials(input string) map[string]string {
|
|||||||
|
|
||||||
// Add the key-value pair to the map
|
// Add the key-value pair to the map
|
||||||
result[key] = value
|
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 {
|
if err != nil {
|
||||||
log.Println("Renew " + fileName + "(" + strings.Join(expiredCert.Domains, ",") + ") failed: " + err.Error())
|
log.Println("Renew " + fileName + "(" + strings.Join(expiredCert.Domains, ",") + ") failed: " + err.Error())
|
||||||
} else {
|
} else {
|
||||||
|
@ -51,8 +51,16 @@ func TestResolveCountryCodeFromIP(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Test an IP address that should return a valid country code
|
// Test an IP address that should return a valid country code
|
||||||
ip := "8.8.8.8"
|
knownIpCountryMap := [][]string{
|
||||||
expected := "US"
|
{"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)
|
info, err := store.ResolveCountryCodeFromIP(ip)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("error resolving country code for IP %s: %v", ip, err)
|
t.Errorf("error resolving country code for IP %s: %v", ip, err)
|
||||||
@ -61,11 +69,12 @@ func TestResolveCountryCodeFromIP(t *testing.T) {
|
|||||||
if info.CountryIsoCode != expected {
|
if info.CountryIsoCode != expected {
|
||||||
t.Errorf("expected country code %s, but got %s for IP %s", expected, info.CountryIsoCode, ip)
|
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
|
// Test an IP address that should return an empty country code
|
||||||
ip = "127.0.0.1"
|
ip := "127.0.0.1"
|
||||||
expected = ""
|
expected := ""
|
||||||
info, err = store.ResolveCountryCodeFromIP(ip)
|
info, err := store.ResolveCountryCodeFromIP(ip)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("error resolving country code for IP %s: %v", ip, err)
|
t.Errorf("error resolving country code for IP %s: %v", ip, err)
|
||||||
return
|
return
|
||||||
|
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.Domain}</td>
|
||||||
<td>${entry.LastModifiedDate}</td>
|
<td>${entry.LastModifiedDate}</td>
|
||||||
<td class="${isExpired?"expired":"valid"} certdate">${entry.ExpireDate} (${!isExpired?entry.RemainingDays+" days left":"Expired"})</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><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.DNS}', this);"><i class="ui green refresh icon"></i></button></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>
|
<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>`);
|
</tr>`);
|
||||||
});
|
});
|
||||||
|
@ -122,146 +122,23 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="field dnsChallengeOnly" style="display:none;">
|
<div class="field dnsChallengeOnly" style="display:none;">
|
||||||
<label>DNS Provider</label>
|
<label>DNS Provider</label>
|
||||||
<div class="ui selection dropdown" id="dnsProvider">
|
<div class="ui search selection dropdown" id="dnsProvider">
|
||||||
<input type="hidden" name="dnsProvider">
|
<input type="hidden" name="dnsProvider" value="">
|
||||||
<i class="dropdown icon"></i>
|
<i class="dropdown icon"></i>
|
||||||
<div class="default text">Please Choose...</div>
|
<div class="default text">Pick a DNS Provider</div>
|
||||||
<div class="menu">
|
<div class="menu" id="dnsProviderList">
|
||||||
<!-- List of supported DNS providers with acme-lego 4.16 -->
|
<!-- Auto populate moved to acmedns module and initDNSProviderList() -->
|
||||||
<!-- 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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field dnsChallengeOnly" style="display:none;">
|
<div class="field dnsChallengeOnly" style="display:none;">
|
||||||
|
<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>
|
<label>Credentials File Content</label>
|
||||||
<textarea id="dnsCredentials" placeholder=""></textarea>
|
<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>
|
<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>
|
||||||
@ -269,6 +146,7 @@
|
|||||||
<i class="icon exclamation triangle"></i>
|
<i class="icon exclamation triangle"></i>
|
||||||
These credentials will be stored as plaintext in the database and in environment variables!
|
These credentials will be stored as plaintext in the database and in environment variables!
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
</div>
|
</div>
|
||||||
<div class="field" id="caInput" style="display:none;">
|
<div class="field" id="caInput" style="display:none;">
|
||||||
<label>ACME Server URL</label>
|
<label>ACME Server URL</label>
|
||||||
@ -478,11 +356,29 @@
|
|||||||
// Button click event handler for obtaining certificate
|
// Button click event handler for obtaining certificate
|
||||||
$("#obtainButton").click(function() {
|
$("#obtainButton").click(function() {
|
||||||
$("#obtainButton").addClass("loading").addClass("disabled");
|
$("#obtainButton").addClass("loading").addClass("disabled");
|
||||||
updateCertificateEAB();
|
updateCertificateEAB(function(succ){
|
||||||
updateCertificateDNS();
|
if (succ){
|
||||||
obtainCertificate();
|
//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() {
|
$("input[name=ca]").on('change', function() {
|
||||||
if(this.value == "Custom ACME Server") {
|
if(this.value == "Custom ACME Server") {
|
||||||
$("#caInput").show();
|
$("#caInput").show();
|
||||||
@ -490,421 +386,71 @@
|
|||||||
$("#hmacInput").show();
|
$("#hmacInput").show();
|
||||||
$("#skipTLS").show();
|
$("#skipTLS").show();
|
||||||
$("#dnsChallenge").hide();
|
$("#dnsChallenge").hide();
|
||||||
|
$(".dnsChallengeOnly").hide();
|
||||||
} else if (this.value == "ZeroSSL") {
|
} else if (this.value == "ZeroSSL") {
|
||||||
$("#kidInput").show();
|
$("#kidInput").show();
|
||||||
$("#hmacInput").show();
|
$("#hmacInput").show();
|
||||||
$("#dnsChallenge").hide();
|
$("#dnsChallenge").hide();
|
||||||
|
$(".dnsChallengeOnly").hide();
|
||||||
|
$("#skipTLS").hide();
|
||||||
} else if (this.value == "Buypass") {
|
} else if (this.value == "Buypass") {
|
||||||
$("#kidInput").show();
|
$("#kidInput").show();
|
||||||
$("#hmacInput").show();
|
$("#hmacInput").show();
|
||||||
$("#dnsChallenge").hide()
|
$("#dnsChallenge").hide();
|
||||||
|
$(".dnsChallengeOnly").hide();
|
||||||
|
$("#skipTLS").hide();
|
||||||
}else {
|
}else {
|
||||||
$("#caInput").hide();
|
$("#caInput").hide();
|
||||||
$("#skipTLS").hide();
|
$("#skipTLS").hide();
|
||||||
$("#kidInput").hide();
|
$("#kidInput").hide();
|
||||||
$("#hmacInput").hide();
|
$("#hmacInput").hide();
|
||||||
$("#dnsChallenge").show();
|
$("#dnsChallenge").show();
|
||||||
|
if ($("#useDnsChallenge")[0].checked){
|
||||||
|
$(".dnsChallengeOnly").show();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
//On DNS provider dropdown change
|
||||||
$("input[name=dnsProvider]").on('change', function() {
|
$("input[name=dnsProvider]").on('change', function() {
|
||||||
// The file proivders-scraper-util.js can be used to generate the list of providers
|
let newProviderName = $("#dnsProvider").find("input").val();
|
||||||
switch(this.value){
|
$.get("/api/acme/dns/providers?name=" + newProviderName, function(data){
|
||||||
case "edgedns":
|
console.log("Loaded required config", data);
|
||||||
$("#dnsCredentials").val("AKAMAI_ACCESS_TOKEN=\nAKAMAI_CLIENT_SECRET=\nAKAMAI_CLIENT_TOKEN=\nAKAMAI_EDGERC=\nAKAMAI_EDGERC_SECTION=\nAKAMAI_HOST=");
|
$("#dnsProviderAPIFields").html("");
|
||||||
break;
|
//Generate a form for this config
|
||||||
case "alidns":
|
let booleanFieldsHTML = "";
|
||||||
$("#dnsCredentials").val("ALICLOUD_ACCESS_KEY=\nALICLOUD_RAM_ROLE=\nALICLOUD_SECRET_KEY=\nALICLOUD_SECURITY_TOKEN=");
|
for (const [key, datatype] of Object.entries(data)) {
|
||||||
break;
|
if (datatype == "int"){
|
||||||
case "allinkl":
|
$("#dnsProviderAPIFields").append(`<div class="ui fluid labeled dnsConfigField input" key="${key}" style="margin-top: 0.2em;">
|
||||||
$("#dnsCredentials").val("ALL_INKL_LOGIN=\nALL_INKL_PASSWORD=");
|
<div class="ui basic blue label" style="font-weight: 300;">
|
||||||
break;
|
${key}
|
||||||
case "lightsail":
|
</div>
|
||||||
$("#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=");
|
<input type="number" value="300">
|
||||||
break;
|
</div>`);
|
||||||
case "route53":
|
}else if (datatype == "bool"){
|
||||||
$("#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=");
|
booleanFieldsHTML += (`<div class="ui checkbox dnsConfigField" key="${key}" style="margin-top: 1em !important; padding-left: 0.4em;">
|
||||||
break;
|
<input type="checkbox">
|
||||||
case "arvancloud":
|
<label>${key}</label>
|
||||||
$("#dnsCredentials").val("ARVANCLOUD_API_KEY=");
|
</div>`);
|
||||||
break;
|
}else{
|
||||||
case "auroradns":
|
//Default to string
|
||||||
$("#dnsCredentials").val("AURORA_API_KEY=\nAURORA_SECRET=");
|
$("#dnsProviderAPIFields").append(`<div class="ui fluid labeled input dnsConfigField" key="${key}" style="margin-top: 0.2em;">
|
||||||
break;
|
<div class="ui basic label" style="font-weight: 300;">
|
||||||
case "autodns":
|
${key}
|
||||||
$("#dnsCredentials").val("AUTODNS_API_PASSWORD=\nAUTODNS_API_USER=");
|
</div>
|
||||||
break;
|
<input type="text">
|
||||||
case "azure":
|
</div>`);
|
||||||
$("#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;
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
|
||||||
|
//Append the boolean fields at the bottom, if exists
|
||||||
|
$("#dnsProviderAPIFields").append(booleanFieldsHTML);
|
||||||
|
if (booleanFieldsHTML != ""){
|
||||||
|
$(".dnsConfigField.checkbox").checkbox();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// Get filename form domains and input
|
// Get filename form domains and input
|
||||||
function getFilename() {
|
function getFilename() {
|
||||||
@ -931,7 +477,7 @@
|
|||||||
|
|
||||||
|
|
||||||
// Update EAB values for autorenewal
|
// Update EAB values for autorenewal
|
||||||
function updateCertificateEAB() {
|
function updateCertificateEAB(callback=undefined) {
|
||||||
var ca = $("#ca").dropdown("get value");
|
var ca = $("#ca").dropdown("get value");
|
||||||
var caURL = "";
|
var caURL = "";
|
||||||
if (ca == "Custom ACME Server") {
|
if (ca == "Custom ACME Server") {
|
||||||
@ -944,6 +490,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(caURL == "") {
|
if(caURL == "") {
|
||||||
|
//Skip update
|
||||||
|
if (callback != undefined){
|
||||||
|
callback(true);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -951,6 +501,10 @@
|
|||||||
var hmac = $("#eab_hmac").val();
|
var hmac = $("#eab_hmac").val();
|
||||||
|
|
||||||
if(kid == "" || hmac == "") {
|
if(kid == "" || hmac == "") {
|
||||||
|
//Skip update
|
||||||
|
if (callback != undefined){
|
||||||
|
callback(true);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -970,6 +524,9 @@
|
|||||||
console.log("Error:", response.error);
|
console.log("Error:", response.error);
|
||||||
// Show error message
|
// Show error message
|
||||||
parent.msgbox(response.error, false, 12000);
|
parent.msgbox(response.error, false, 12000);
|
||||||
|
if (callback != undefined){
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log("Certificate EAB updated successfully");
|
console.log("Certificate EAB updated successfully");
|
||||||
// Show success message
|
// Show success message
|
||||||
@ -977,44 +534,92 @@
|
|||||||
|
|
||||||
// Renew the parent certificate list
|
// Renew the parent certificate list
|
||||||
parent.initManagedDomainCertificateList();
|
parent.initManagedDomainCertificateList();
|
||||||
|
if (callback != undefined){
|
||||||
|
callback(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error: function(error) {
|
error: function(error) {
|
||||||
//$("#obtainButton").removeClass("loading").removeClass("disabled");
|
//$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||||
console.log("Failed to update EAB configuration:", error);
|
console.log("Failed to update EAB configuration:", error);
|
||||||
parent.msgbox("Failed to update EAB configuration");
|
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
|
// Update DNS values for autorenewal
|
||||||
function updateCertificateDNS() {
|
function updateCertificateDNS(callback=undefined) {
|
||||||
var dns = $("#useDnsChallenge")[0].checked;
|
var dns = $("#useDnsChallenge")[0].checked;
|
||||||
var dnsProvider = "";
|
var dnsProvider = "";
|
||||||
var dnsCredentials = "";
|
var dnsCredentials = "";
|
||||||
|
|
||||||
if (dns) {
|
if (!dns) {
|
||||||
|
if (callback != undefined){
|
||||||
|
callback(true);
|
||||||
|
}
|
||||||
|
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");
|
dnsProvider = $("#dnsProvider").dropdown("get value");
|
||||||
dnsCredentials = $("#dnsCredentials").val();
|
|
||||||
|
//dnsCredentials = $("#dnsCredentials").val();
|
||||||
|
dnsCredentials = readDnsCredentials();
|
||||||
|
|
||||||
if(dnsProvider == "") {
|
if(dnsProvider == "") {
|
||||||
parent.msgbox("DNS Provider cannot be empty", false, 5000);
|
parent.msgbox("DNS Provider cannot be empty", false, 5000);
|
||||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||||
return;
|
if (callback != undefined){
|
||||||
|
callback(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(dnsCredentials == "") {
|
|
||||||
parent.msgbox("DNS Credentials cannot be empty", false, 5000);
|
|
||||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var filename = getFilename();
|
var filename = getFilename();
|
||||||
if (filename == '') {
|
if (filename == '') {
|
||||||
|
parent.msgbox("Domain to renew cannot be empty", false, 5000);
|
||||||
|
if (callback != undefined){
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1024,7 +629,7 @@
|
|||||||
data: {
|
data: {
|
||||||
filename: filename,
|
filename: filename,
|
||||||
dnsProvider: dnsProvider,
|
dnsProvider: dnsProvider,
|
||||||
dnsCredentials: dnsCredentials,
|
dnsCredentials: JSON.stringify(dnsCredentials),
|
||||||
},
|
},
|
||||||
success: function(response) {
|
success: function(response) {
|
||||||
//$("#obtainButton").removeClass("loading").removeClass("disabled");
|
//$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||||
@ -1032,31 +637,44 @@
|
|||||||
console.log("Error:", response.error);
|
console.log("Error:", response.error);
|
||||||
// Show error message
|
// Show error message
|
||||||
parent.msgbox(response.error, false, 12000);
|
parent.msgbox(response.error, false, 12000);
|
||||||
|
if (callback != undefined){
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log("Certificate DNS Credentials updated successfully");
|
console.log("Certificate DNS Credentials updated successfully");
|
||||||
// Show success message
|
// Show success message
|
||||||
parent.msgbox("Certificate DNS Credentials updated successfully");
|
parent.msgbox("Certificate DNS Credentials updated successfully");
|
||||||
|
if (callback != undefined){
|
||||||
|
callback(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error: function(error) {
|
error: function(error) {
|
||||||
//$("#obtainButton").removeClass("loading").removeClass("disabled");
|
//$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||||
console.log("Failed to update DNS configuration:", error);
|
console.log("Failed to update DNS configuration:", error);
|
||||||
parent.msgbox("Failed to update DNS configuration");
|
parent.msgbox("Failed to update DNS configuration");
|
||||||
|
if (callback != undefined){
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Obtain certificate from API
|
// Obtain certificate from API
|
||||||
function obtainCertificate() {
|
function obtainCertificate(callback=undefined) {
|
||||||
var domains = $("#domainsInput").val();
|
var domains = $("#domainsInput").val();
|
||||||
var filename = getFilename();
|
var filename = getFilename();
|
||||||
if (filename == '') {
|
if (filename == '') {
|
||||||
|
if (callback != undefined){
|
||||||
|
parent.msgbox("Domain to obtain certificate cannot be empty", false)
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var email = $("#caRegisterEmail").val();
|
var email = $("#caRegisterEmail").val();
|
||||||
if (email == ""){
|
if (email == ""){
|
||||||
parent.msgbox("ACME renew email is not set", false)
|
parent.msgbox("ACME renew email is not set", false)
|
||||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
if (callback != undefined){callback(false);}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1090,6 +708,7 @@
|
|||||||
console.log("Error:", response.error);
|
console.log("Error:", response.error);
|
||||||
// Show error message
|
// Show error message
|
||||||
parent.msgbox(response.error, false, 12000);
|
parent.msgbox(response.error, false, 12000);
|
||||||
|
if (callback != undefined){callback(false);}
|
||||||
} else {
|
} else {
|
||||||
console.log("Certificate renewed successfully");
|
console.log("Certificate renewed successfully");
|
||||||
// Show success message
|
// Show success message
|
||||||
@ -1097,11 +716,14 @@
|
|||||||
|
|
||||||
// Renew the parent certificate list
|
// Renew the parent certificate list
|
||||||
parent.initManagedDomainCertificateList();
|
parent.initManagedDomainCertificateList();
|
||||||
|
|
||||||
|
if (callback != undefined){callback(true);}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error: function(error) {
|
error: function(error) {
|
||||||
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
$("#obtainButton").removeClass("loading").removeClass("disabled");
|
||||||
console.log("Failed to renewed certificate:", error);
|
console.log("Failed to renewed certificate:", error);
|
||||||
|
if (callback != undefined){callback(false);}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -1234,6 +856,34 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//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
|
//Clear up the input field when page load
|
||||||
$("#filenameInput").val("");
|
$("#filenameInput").val("");
|
||||||
</script>
|
</script>
|
||||||
|
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