diff --git a/docs/_providers/cloudflare.md b/docs/_providers/cloudflare.md index 6676bd71d..c36f99709 100644 --- a/docs/_providers/cloudflare.md +++ b/docs/_providers/cloudflare.md @@ -49,9 +49,9 @@ D("example.tld", REG_NAMECOM, DnsProvider(CFLARE), DNSControl depends on a Cloudflare Global API Key that's available under "My Settings". - ## New domains If a domain does not exist in your CloudFlare account, DNSControl will *not* automatically add it. You'll need to do that via the -control panel manually. +control panel manually or via the command `dnscontrol create-domains` +-command. diff --git a/providers/cloudflare/cloudflareProvider.go b/providers/cloudflare/cloudflareProvider.go index 1cc81dbf5..895eff201 100644 --- a/providers/cloudflare/cloudflareProvider.go +++ b/providers/cloudflare/cloudflareProvider.go @@ -227,6 +227,11 @@ func newCloudflare(m map[string]string, metadata json.RawMessage) (providers.DNS return nil, fmt.Errorf("Cloudflare apikey and apiuser must be provided.") } + err := api.fetchDomainList() + if err != nil { + return nil, err + } + if len(metadata) > 0 { parsedMeta := &struct { IPConversions string `json:"ip_conversions"` @@ -300,3 +305,13 @@ func getProxyMetadata(r *models.RecordConfig) map[string]string { "proxy": fmt.Sprint(proxied), } } + +func (c *CloudflareApi) EnsureDomainExists(domain string) error { + if _, ok := c.domainIndex[domain]; ok { + return nil + } + var id string + id, err := c.createZone(domain) + fmt.Printf("Added zone for %s to Cloudflare account: %s\n", domain, id) + return err +} diff --git a/providers/cloudflare/rest.go b/providers/cloudflare/rest.go index 88fbc15f4..3a9e58ceb 100644 --- a/providers/cloudflare/rest.go +++ b/providers/cloudflare/rest.go @@ -88,6 +88,27 @@ func (c *CloudflareApi) deleteRec(rec *cfRecord, domainID string) *models.Correc } } +func (c *CloudflareApi) createZone(domainName string) (string, error) { + type createZone struct { + Name string `json:"name"` + } + var id string + cz := &createZone{ + Name: domainName} + buf := &bytes.Buffer{} + encoder := json.NewEncoder(buf) + if err := encoder.Encode(cz); err != nil { + return "", err + } + req, err := http.NewRequest("POST", zonesURL, buf) + if err != nil { + return "", err + } + c.setHeaders(req) + id, err = handleActionResponse(http.DefaultClient.Do(req)) + return id, err +} + func (c *CloudflareApi) createRec(rec *models.RecordConfig, domainID string) []*models.Correction { type createRecord struct { Name string `json:"name"`