Implement domains discovery through dnscontrol

This commit is contained in:
nemunaire 2021-05-22 01:06:23 +02:00
parent b32c50b5bd
commit 7c05c6199c
6 changed files with 52 additions and 5 deletions

View File

@ -102,6 +102,6 @@ func getProviderSpec(c *gin.Context) {
c.JSON(http.StatusOK, viewProviderSpec{ c.JSON(http.StatusOK, viewProviderSpec{
Fields: forms.GenStructFields(src), Fields: forms.GenStructFields(src),
//Capabilities: providers.GetProviderCapabilities(src), Capabilities: providers.GetProviderCapabilities(src),
}) })
} }

View File

@ -37,6 +37,7 @@ import (
"net/http" "net/http"
"strconv" "strconv"
dnscontrol "github.com/StackExchange/dnscontrol/v3/providers"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"git.happydns.org/happydns/config" "git.happydns.org/happydns/config"
@ -56,7 +57,7 @@ func declareProvidersRoutes(cfg *config.Options, router *gin.RouterGroup) {
//router.PUT("/api/providers/:sid", apiAuthHandler(providerHandler(updateProvider))) //router.PUT("/api/providers/:sid", apiAuthHandler(providerHandler(updateProvider)))
//router.DELETE("/api/providers/:sid", apiAuthHandler(providerMetaHandler(deleteProvider))) //router.DELETE("/api/providers/:sid", apiAuthHandler(providerMetaHandler(deleteProvider)))
//router.GET("/api/providers/:sid/domains", apiAuthHandler(providerHandler(getDomainsHostedByProvider))) apiProviderRoutes.GET("/domains", getDomainsHostedByProvider)
//router.GET("/api/providers/:sid/domains_with_actions", apiAuthHandler(providerHandler(getDomainsWithActionsHostedByProvider))) //router.GET("/api/providers/:sid/domains_with_actions", apiAuthHandler(providerHandler(getDomainsWithActionsHostedByProvider)))
//router.POST("/api/providers/:sid/domains_with_actions", apiAuthHandler(providerHandler(doDomainsWithActionsHostedByProvider))) //router.POST("/api/providers/:sid/domains_with_actions", apiAuthHandler(providerHandler(doDomainsWithActionsHostedByProvider)))
@ -161,3 +162,27 @@ func addProvider(c *gin.Context) {
c.JSON(http.StatusOK, s) c.JSON(http.StatusOK, s)
} }
func getDomainsHostedByProvider(c *gin.Context) {
provider := c.MustGet("provider").(*happydns.ProviderCombined)
p, err := provider.NewDNSServiceProvider()
if err != nil {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": fmt.Sprintf("Unable to instantiate the provider: %s", err.Error())})
return
}
sr, ok := p.(dnscontrol.ZoneLister)
if !ok {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": "Provider doesn't support domain listing."})
return
}
domains, err := sr.ListZones()
if err != nil {
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()})
return
}
c.JSON(http.StatusOK, domains)
}

View File

@ -43,6 +43,7 @@ import (
// Provider is where Domains and Zones can be managed. // Provider is where Domains and Zones can be managed.
type Provider interface { type Provider interface {
NewDNSServiceProvider() (providers.DNSServiceProvider, error) NewDNSServiceProvider() (providers.DNSServiceProvider, error)
DNSControlName() string
} }
// ProviderMeta holds the metadata associated to a Provider. // ProviderMeta holds the metadata associated to a Provider.

View File

@ -58,7 +58,11 @@ func (s *DDNSServer) NewDNSServiceProvider() (providers.DNSServiceProvider, erro
config["update-key"] = config["transfer-key"] config["update-key"] = config["transfer-key"]
} }
return providers.CreateDNSProvider("AXFRDDNS", config, nil) return providers.CreateDNSProvider(s.DNSControlName(), config, nil)
}
func (s *DDNSServer) DNSControlName() string {
return "AXFRDDNS"
} }
func init() { func init() {

View File

@ -55,7 +55,11 @@ func (s *OVHAPI) NewDNSServiceProvider() (providers.DNSServiceProvider, error) {
"app-secret-key": appSecret, "app-secret-key": appSecret,
"consumer-key": s.ConsumerKey, "consumer-key": s.ConsumerKey,
} }
return providers.CreateDNSProvider("OVH", config, nil) return providers.CreateDNSProvider(s.DNSControlName(), config, nil)
}
func (s *OVHAPI) DNSControlName() string {
return "OVH"
} }
func init() { func init() {

View File

@ -36,6 +36,8 @@ import (
"log" "log"
"reflect" "reflect"
"github.com/StackExchange/dnscontrol/v3/providers"
"git.happydns.org/happydns/model" "git.happydns.org/happydns/model"
) )
@ -69,6 +71,8 @@ func RegisterProvider(creator ProviderCreator, infos ProviderInfos) {
name := baseType.Name() name := baseType.Name()
log.Println("Registering new provider:", name) log.Println("Registering new provider:", name)
infos.Capabilities = GetProviderCapabilities(creator())
providersList[name] = Provider{ providersList[name] = Provider{
creator, creator,
infos, infos,
@ -89,3 +93,12 @@ func FindProvider(name string) (happydns.Provider, error) {
return src.Creator(), nil return src.Creator(), nil
} }
// GetProviderCapabilities lists available capabilities for the given Provider.
func GetProviderCapabilities(prvd happydns.Provider) (caps []string) {
if providers.ProviderHasCapability(prvd.DNSControlName(), providers.CanGetZones) {
caps = append(caps, "ListDomains")
}
return
}