mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-11-10 17:26:10 +08:00
get-zones: new output format nameonly; remove tsvfqdn (#644)
* Add nameonly; remove tsvfqdn * document tsv fields
This commit is contained in:
parent
1ec696e4fa
commit
3c507d6b77
2 changed files with 43 additions and 27 deletions
|
@ -38,10 +38,10 @@ ARGUMENTS:
|
||||||
zone: One or more zones (domains) to download; or "all".
|
zone: One or more zones (domains) to download; or "all".
|
||||||
|
|
||||||
FORMATS:
|
FORMATS:
|
||||||
--format=dsl dnsconfig.js format (a decent first draft)
|
--format=dsl dnsconfig.js format (not perfect, but a decent first draft)
|
||||||
--format=pretty BIND Zonefile format
|
--format=nameonly Just print the zone names
|
||||||
--format=tsv TAB separated value (useful for AWK)
|
--format=pretty BIND Zonefile format
|
||||||
--format=tsvfqdn tsv with FQDNs (useful for multiple zones)
|
--format=tsv TAB separated value (useful for AWK)
|
||||||
|
|
||||||
EXAMPLES:
|
EXAMPLES:
|
||||||
dnscontrol get-zones myr53 ROUTE53 example.com
|
dnscontrol get-zones myr53 ROUTE53 example.com
|
||||||
|
@ -69,7 +69,7 @@ func (args *GetZoneArgs) flags() []cli.Flag {
|
||||||
Name: "format",
|
Name: "format",
|
||||||
Destination: &args.OutputFormat,
|
Destination: &args.OutputFormat,
|
||||||
Value: "pretty",
|
Value: "pretty",
|
||||||
Usage: `Output format: dsl pretty tsv tsvfqdn`,
|
Usage: `Output format: dsl pretty tsv nameonly`,
|
||||||
})
|
})
|
||||||
flags = append(flags, &cli.StringFlag{
|
flags = append(flags, &cli.StringFlag{
|
||||||
Name: "out",
|
Name: "out",
|
||||||
|
@ -113,6 +113,23 @@ func GetZone(args GetZoneArgs) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// first open output stream and print initial header (if applicable)
|
||||||
|
w := os.Stdout
|
||||||
|
if args.OutputFile != "" {
|
||||||
|
w, err = os.Create(args.OutputFile)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer w.Close()
|
||||||
|
|
||||||
|
if args.OutputFormat == "nameonly" {
|
||||||
|
for _, zone := range zones {
|
||||||
|
fmt.Fprintln(w, zone)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// actually fetch all of the records
|
// actually fetch all of the records
|
||||||
zoneRecs := make([]models.Records, len(zones))
|
zoneRecs := make([]models.Records, len(zones))
|
||||||
for i, zone := range zones {
|
for i, zone := range zones {
|
||||||
|
@ -125,23 +142,15 @@ func GetZone(args GetZoneArgs) error {
|
||||||
|
|
||||||
// Write it out:
|
// Write it out:
|
||||||
|
|
||||||
// first open output stream and print initial header (if applicable)
|
|
||||||
w := os.Stdout
|
|
||||||
if args.OutputFile != "" {
|
|
||||||
w, err = os.Create(args.OutputFile)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer w.Close()
|
|
||||||
if args.OutputFormat == "dsl" {
|
if args.OutputFormat == "dsl" {
|
||||||
fmt.Fprintf(w, `var %s = NewDnsProvider("%s", "%s");`+"\n",
|
fmt.Fprintf(w, `var %s = NewDnsProvider("%s", "%s");`+"\n",
|
||||||
args.CredName, args.CredName, args.ProviderName)
|
args.CredName, args.CredName, args.ProviderName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// now print all zones
|
||||||
for i, recs := range zoneRecs {
|
for i, recs := range zoneRecs {
|
||||||
zoneName := zones[i]
|
zoneName := zones[i]
|
||||||
// now print all zones
|
|
||||||
z := prettyzone.PrettySort(recs, zoneName, 0)
|
z := prettyzone.PrettySort(recs, zoneName, 0)
|
||||||
switch args.OutputFormat {
|
switch args.OutputFormat {
|
||||||
case "pretty":
|
case "pretty":
|
||||||
|
@ -159,14 +168,8 @@ func GetZone(args GetZoneArgs) error {
|
||||||
case "tsv":
|
case "tsv":
|
||||||
for _, rec := range recs {
|
for _, rec := range recs {
|
||||||
fmt.Fprintf(w,
|
fmt.Fprintf(w,
|
||||||
fmt.Sprintf("%s\t%d\tIN\t%s\t%s\n",
|
fmt.Sprintf("%s\t%s\t%d\tIN\t%s\t%s\n",
|
||||||
rec.Name, rec.TTL, rec.Type, rec.GetTargetCombined()))
|
rec.NameFQDN, rec.Name, rec.TTL, rec.Type, rec.GetTargetCombined()))
|
||||||
}
|
|
||||||
case "tsvfqdn":
|
|
||||||
for _, rec := range recs {
|
|
||||||
fmt.Fprintf(w,
|
|
||||||
fmt.Sprintf("%s\t%d\tIN\t%s\t%s\n",
|
|
||||||
rec.NameFQDN, rec.TTL, rec.Type, rec.GetTargetCombined()))
|
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("format %q unknown", args.OutputFile)
|
return fmt.Errorf("format %q unknown", args.OutputFile)
|
||||||
|
|
|
@ -19,7 +19,7 @@ Syntax:
|
||||||
dnscontrol get-zones [command options] credkey provider zone [...]
|
dnscontrol get-zones [command options] credkey provider zone [...]
|
||||||
|
|
||||||
--creds value Provider credentials JSON file (default: "creds.json")
|
--creds value Provider credentials JSON file (default: "creds.json")
|
||||||
--format value Output format: dsl tsv pretty (default: "pretty")
|
--format value Output format: pretty dsl tsv nameonly (default: "pretty")
|
||||||
--out value Instead of stdout, write to this file
|
--out value Instead of stdout, write to this file
|
||||||
|
|
||||||
ARGUMENTS:
|
ARGUMENTS:
|
||||||
|
@ -27,6 +27,19 @@ ARGUMENTS:
|
||||||
provider: The name of the provider (second parameter to NewDnsProvider() in dnsconfig.js)
|
provider: The name of the provider (second parameter to NewDnsProvider() in dnsconfig.js)
|
||||||
zone: One or more zones (domains) to download; or "all".
|
zone: One or more zones (domains) to download; or "all".
|
||||||
|
|
||||||
|
FORMATS:
|
||||||
|
--format=dsl dnsconfig.js format (not perfect, but a decent first draft)
|
||||||
|
--format=nameonly Just print the zone names
|
||||||
|
--format=pretty BIND Zonefile format
|
||||||
|
--format=tsv TAB separated value (useful for AWK)
|
||||||
|
|
||||||
|
When using `tsv`, the columns are:
|
||||||
|
FQDN (the label with the domain)
|
||||||
|
ShortName (just the label, "@" if it is the naked domain)
|
||||||
|
TTL
|
||||||
|
Record Type (A, AAAA, CNAME, etc.)
|
||||||
|
Target and arguments (quoted like in a zonefile)
|
||||||
|
|
||||||
EXAMPLES:
|
EXAMPLES:
|
||||||
dnscontrol get-zones myr53 ROUTE53 example.com
|
dnscontrol get-zones myr53 ROUTE53 example.com
|
||||||
dnscontrol get-zones gmain GANDI_V5 example.comn other.com
|
dnscontrol get-zones gmain GANDI_V5 example.comn other.com
|
||||||
|
@ -76,9 +89,9 @@ Once that is done the `get-zone` subcommand should work.
|
||||||
|
|
||||||
4. Optionally implemement the `ListZones` function
|
4. Optionally implemement the `ListZones` function
|
||||||
|
|
||||||
If the `ListZones` function is implemented, the command will activate
|
If the `ListZones` function is implemented, the "all" special case
|
||||||
the ability to specify `all` as the zone, at which point all zones
|
will be activated. In this case, listing a single zone named `all`
|
||||||
will be downloaded.
|
will query the provider for the list of zones.
|
||||||
|
|
||||||
(Technically what is happening is by implementing the `ListZones`
|
(Technically what is happening is by implementing the `ListZones`
|
||||||
function, you are completing the `ZoneLister` interface for that
|
function, you are completing the `ZoneLister` interface for that
|
||||||
|
|
Loading…
Reference in a new issue