From d6b191bae4890de98e9e43ee1d00dc430328c920 Mon Sep 17 00:00:00 2001 From: Tom Limoncelli Date: Tue, 24 Nov 2020 10:30:21 -0500 Subject: [PATCH] CLOUDFLARE: get-zones now outputs "orange cloud" status (#952) * CLOUDFLARE: get-zones now outputs "orange cloud" status --- commands/getZones.go | 24 ++++++++++++++++++---- docs/get-zones.md | 1 + pkg/prettyzone/prettyzone.go | 12 +++++++++-- providers/cloudflare/cloudflareProvider.go | 8 ++++++++ 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/commands/getZones.go b/commands/getZones.go index a0dd225ea..b22578a1c 100644 --- a/commands/getZones.go +++ b/commands/getZones.go @@ -50,6 +50,7 @@ The columns in --format=tsv are: TTL Record Type (A, AAAA, CNAME, etc.) Target and arguments (quoted like in a zonefile) + Either empty or a comma-separated list of properties like "cloudflare_proxy=true" The --ttl flag only applies to zone/js/djs formats. @@ -93,7 +94,7 @@ ARGUMENTS: provider: The name of the provider (second parameter to NewDnsProvider() in dnsconfig.js) EXAMPLES: - dnscontrol get-zones myr53 ROUTE53 + dnscontrol get-zones myr53 ROUTE53 dnscontrol get-zones --out=/dev/null myr53 ROUTE53`, } }()) @@ -229,8 +230,16 @@ func GetZone(args GetZoneArgs) error { case "tsv": for _, rec := range recs { - fmt.Fprintf(w, "%s\t%s\t%d\tIN\t%s\t%s\n", - rec.NameFQDN, rec.Name, rec.TTL, rec.Type, rec.GetTargetCombined()) + + cfproxy := "" + if cp, ok := rec.Metadata["cloudflare_proxy"]; ok { + if cp == "true" { + cfproxy = "\tcloudflare_proxy=true" + } + } + + fmt.Fprintf(w, "%s\t%s\t%d\tIN\t%s\t%s%s\n", + rec.NameFQDN, rec.Name, rec.TTL, rec.Type, rec.GetTargetCombined(), cfproxy) } default: @@ -251,6 +260,13 @@ func formatDsl(zonename string, rec *models.RecordConfig, defaultTTL uint32) str ttlop = fmt.Sprintf(", TTL(%d)", ttl) } + cfproxy := "" + if cp, ok := rec.Metadata["cloudflare_proxy"]; ok { + if cp == "true" { + cfproxy = ", CF_PROXY_ON" + } + } + switch rec.Type { // #rtype_variations case "CAA": return makeCaa(rec, ttlop) @@ -286,7 +302,7 @@ func formatDsl(zonename string, rec *models.RecordConfig, defaultTTL uint32) str target = "'" + target + "'" } - return fmt.Sprintf("%s('%s', %s%s)", rec.Type, rec.Name, target, ttlop) + return fmt.Sprintf("%s('%s', %s%s%s)", rec.Type, rec.Name, target, cfproxy, ttlop) } func makeCaa(rec *models.RecordConfig, ttlop string) string { diff --git a/docs/get-zones.md b/docs/get-zones.md index fd39be826..f2b584f5b 100644 --- a/docs/get-zones.md +++ b/docs/get-zones.md @@ -82,6 +82,7 @@ The columns in `--format=tsv` are: TTL Record Type (A, AAAA, CNAME, etc.) Target and arguments (quoted like in a zonefile) + Either empty or a comma-separated list of properties like "cloudflare_proxy=true" The `--ttl` flag only applies to zone/js/djs formats. diff --git a/pkg/prettyzone/prettyzone.go b/pkg/prettyzone/prettyzone.go index 109d27d30..ea0245d97 100644 --- a/pkg/prettyzone/prettyzone.go +++ b/pkg/prettyzone/prettyzone.go @@ -134,8 +134,16 @@ func (z *ZoneGenData) generateZoneFileHelper(w io.Writer) error { // the remaining line target := rr.GetTargetCombined() - fmt.Fprintf(w, "%s%s\n", - prefix, formatLine([]int{10, 5, 2, 5, 0}, []string{name, ttl, "IN", typeStr, target})) + // comment + comment := "" + if cp, ok := rr.Metadata["cloudflare_proxy"]; ok { + if cp == "true" { + comment = " ; CF_PROXY_ON" + } + } + + fmt.Fprintf(w, "%s%s%s\n", + prefix, formatLine([]int{10, 5, 2, 5, 0}, []string{name, ttl, "IN", typeStr, target}), comment) } return nil } diff --git a/providers/cloudflare/cloudflareProvider.go b/providers/cloudflare/cloudflareProvider.go index bbc57a847..b3b7e7f7a 100644 --- a/providers/cloudflare/cloudflareProvider.go +++ b/providers/cloudflare/cloudflareProvider.go @@ -121,6 +121,14 @@ func (c *cloudflareProvider) GetZoneRecords(domain string) (models.Records, erro if rec.TTL == 1 { rec.TTL = 0 } + // Store the proxy status ("orange cloud") for use by get-zones: + m := getProxyMetadata(rec) + if p, ok := m["proxy"]; ok { + if rec.Metadata == nil { + rec.Metadata = map[string]string{} + } + rec.Metadata["cloudflare_proxy"] = p + } } return records, nil }