diff --git a/api/provider_specs.go b/api/provider_specs.go index 6d762b9..0b1d167 100644 --- a/api/provider_specs.go +++ b/api/provider_specs.go @@ -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), }) } diff --git a/api/providers.go b/api/providers.go index 2107d5d..e0d404b 100644 --- a/api/providers.go +++ b/api/providers.go @@ -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) +} diff --git a/model/provider.go b/model/provider.go index 08efe40..e9a6ffc 100644 --- a/model/provider.go +++ b/model/provider.go @@ -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. diff --git a/providers/axfrddns.go b/providers/axfrddns.go index 3e65f5d..b9e8fc8 100644 --- a/providers/axfrddns.go +++ b/providers/axfrddns.go @@ -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() { diff --git a/providers/ovh.go b/providers/ovh.go index 5fcf430..dd0b16f 100644 --- a/providers/ovh.go +++ b/providers/ovh.go @@ -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() { diff --git a/providers/providers.go b/providers/providers.go index b2f9141..c32a7b4 100644 --- a/providers/providers.go +++ b/providers/providers.go @@ -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 +}