DNS Provider Agnostic Solution

This commit is contained in:
Linard Schwendener
2024-05-03 17:23:23 +02:00
parent dc069f3c57
commit 75ebd0ffbe
6 changed files with 972 additions and 12 deletions

View File

@@ -24,7 +24,6 @@ import (
"github.com/go-acme/lego/v4/certificate"
"github.com/go-acme/lego/v4/challenge/http01"
"github.com/go-acme/lego/v4/lego"
"github.com/go-acme/lego/v4/providers/dns/dynu"
"github.com/go-acme/lego/v4/registration"
"imuslab.com/zoraxy/mod/database"
"imuslab.com/zoraxy/mod/utils"
@@ -159,16 +158,19 @@ func (a *ACMEHandler) ObtainCert(domains []string, certificateName string, email
var dnsCredentials string
err := a.Database.Read("acme", certificateName+"_dns_credentials", &dnsCredentials)
if err != nil {
log.Println(err)
return false, err
}
dynuConfig := dynu.NewDefaultConfig()
dynuConfig.APIKey = dnsCredentials
var dnsProvider string
err = a.Database.Read("acme", certificateName+"_dns_provider", &dnsProvider)
if err != nil {
log.Println(err)
return false, err
}
provider, err := dynu.NewDNSProviderConfig(dynuConfig)
provider, err := GetDnsChallengeProviderByName(dnsProvider, dnsCredentials)
if err != nil {
log.Fatal(err)
}

51
src/mod/acme/acme_dns.go Normal file
View File

@@ -0,0 +1,51 @@
package acme
import (
"log"
"os"
"strings"
"github.com/go-acme/lego/v4/challenge"
"github.com/go-acme/lego/v4/providers/dns"
)
func GetDnsChallengeProviderByName(dnsProvider string, dnsCredentials string) (challenge.Provider, error) {
credentials := extractDnsCredentials(dnsCredentials)
setCredentialsIntoEnvironmentVariables(credentials)
provider, err := dns.NewDNSChallengeProviderByName(dnsProvider)
return provider, err
}
func setCredentialsIntoEnvironmentVariables(credentials map[string]string) {
for key, value := range credentials {
err := os.Setenv(key, value)
if err != nil {
log.Printf("Failed to set environment variable %s: %v", key, err)
}
}
}
func extractDnsCredentials(input string) map[string]string {
result := make(map[string]string)
// Split the input string by newline character
lines := strings.Split(input, "\n")
// Iterate over each line
for _, line := range lines {
// Split the line by "=" character
parts := strings.Split(line, "=")
// Check if the line is in the correct format
if len(parts) == 2 {
key := strings.TrimSpace(parts[0])
value := strings.TrimSpace(parts[1])
// Add the key-value pair to the map
result[key] = value
}
}
return result
}

View File

@@ -405,7 +405,6 @@ func (a *AutoRenewer) HanldeSetEAB(w http.ResponseWriter, r *http.Request) {
}
// Handle update auto renew DNS configuration
func (a *AutoRenewer) HanldeSetDNS(w http.ResponseWriter, r *http.Request) {
dnsProvider, err := utils.PostPara(r, "dnsProvider")