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

@ -101,7 +101,7 @@ func getProviderSpec(c *gin.Context) {
src := c.MustGet("providertype").(happydns.Provider)
c.JSON(http.StatusOK, viewProviderSpec{
Fields: forms.GenStructFields(src),
//Capabilities: providers.GetProviderCapabilities(src),
Fields: forms.GenStructFields(src),
Capabilities: providers.GetProviderCapabilities(src),
})
}

View File

@ -37,6 +37,7 @@ import (
"net/http"
"strconv"
dnscontrol "github.com/StackExchange/dnscontrol/v3/providers"
"github.com/gin-gonic/gin"
"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.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.POST("/api/providers/:sid/domains_with_actions", apiAuthHandler(providerHandler(doDomainsWithActionsHostedByProvider)))
@ -161,3 +162,27 @@ func addProvider(c *gin.Context) {
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.
type Provider interface {
NewDNSServiceProvider() (providers.DNSServiceProvider, error)
DNSControlName() string
}
// 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"]
}
return providers.CreateDNSProvider("AXFRDDNS", config, nil)
return providers.CreateDNSProvider(s.DNSControlName(), config, nil)
}
func (s *DDNSServer) DNSControlName() string {
return "AXFRDDNS"
}
func init() {

View File

@ -55,7 +55,11 @@ func (s *OVHAPI) NewDNSServiceProvider() (providers.DNSServiceProvider, error) {
"app-secret-key": appSecret,
"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() {

View File

@ -36,6 +36,8 @@ import (
"log"
"reflect"
"github.com/StackExchange/dnscontrol/v3/providers"
"git.happydns.org/happydns/model"
)
@ -69,6 +71,8 @@ func RegisterProvider(creator ProviderCreator, infos ProviderInfos) {
name := baseType.Name()
log.Println("Registering new provider:", name)
infos.Capabilities = GetProviderCapabilities(creator())
providersList[name] = Provider{
creator,
infos,
@ -89,3 +93,12 @@ func FindProvider(name string) (happydns.Provider, error) {
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
}