From 597b4b586e17a61bf588824c640b17e946bb160a Mon Sep 17 00:00:00 2001 From: decentral1se Date: Mon, 18 Oct 2021 22:16:29 +0200 Subject: [PATCH] WIP: domain listing with Gandi Rethinking the interface already. --- cli/cli.go | 2 + cli/domain/domain.go | 32 +++++++++++++++ cli/domain/list.go | 70 ++++++++++++++++++++++++++++++++ cli/internal/common.go | 13 ++++++ cli/server/dns.go | 91 ------------------------------------------ cli/server/server.go | 1 - go.mod | 2 +- pkg/dns/common.go | 28 +++++++++++++ pkg/dns/gandi.go | 52 ------------------------ pkg/dns/gandi/gandi.go | 15 +++++++ 10 files changed, 161 insertions(+), 145 deletions(-) create mode 100644 cli/domain/domain.go create mode 100644 cli/domain/list.go delete mode 100644 cli/server/dns.go create mode 100644 pkg/dns/common.go delete mode 100644 pkg/dns/gandi.go create mode 100644 pkg/dns/gandi/gandi.go diff --git a/cli/cli.go b/cli/cli.go index 557c575a..d1cf1694 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -8,6 +8,7 @@ import ( "coopcloud.tech/abra/cli/app" "coopcloud.tech/abra/cli/catalogue" + "coopcloud.tech/abra/cli/domain" "coopcloud.tech/abra/cli/recipe" "coopcloud.tech/abra/cli/server" "coopcloud.tech/abra/pkg/config" @@ -59,6 +60,7 @@ func RunApp(version, commit string) { server.ServerCommand, recipe.RecipeCommand, catalogue.CatalogueCommand, + domain.DomainCommand, VersionCommand, UpgradeCommand, }, diff --git a/cli/domain/domain.go b/cli/domain/domain.go new file mode 100644 index 00000000..50bb7540 --- /dev/null +++ b/cli/domain/domain.go @@ -0,0 +1,32 @@ +package domain + +import ( + "github.com/urfave/cli/v2" +) + +// DomainCommand supports managing DNS entries. +var DomainCommand = &cli.Command{ + Name: "domain", + Usage: "Manage domains via 3rd party providers", + Aliases: []string{"d"}, + ArgsUsage: "", + Description: ` +This command supports managing DNS records via 3rd party providers such as +Gandi DNS. It supports listing, creating, updating and removing all types of +DNS records that you might need to manage for managing Co-op Cloud apps. + +The following providers are supported: + + Gandi DNS https://www.gandi.net + +Any new provider can be integrated, we welcome change sets. See the underlying +DNS library documentation for more. It supports many existing providers and +allows to implement new provider support easily. + + https://pkg.go.dev/github.com/libdns/libdns + +`, + Subcommands: []*cli.Command{ + DomainListCommand, + }, +} diff --git a/cli/domain/list.go b/cli/domain/list.go new file mode 100644 index 00000000..5503bc62 --- /dev/null +++ b/cli/domain/list.go @@ -0,0 +1,70 @@ +package domain + +import ( + "errors" + "fmt" + "strconv" + + abraFormatter "coopcloud.tech/abra/cli/formatter" + "coopcloud.tech/abra/cli/internal" + gandiPkg "coopcloud.tech/abra/pkg/dns/gandi" + "github.com/libdns/gandi" + "github.com/sirupsen/logrus" + "github.com/urfave/cli/v2" +) + +// DomainListCommand lists domains. +var DomainListCommand = &cli.Command{ + Name: "list", + Usage: "List domains for a server", + Aliases: []string{"ls"}, + ArgsUsage: "", + Flags: []cli.Flag{ + internal.DNSProviderFlag, + }, + Description: ` +`, + Action: func(c *cli.Context) error { + zone := c.Args().First() + if zone == "" { + internal.ShowSubcommandHelpAndError(c, errors.New("no zone provided")) + } + + var err error + var provider gandi.Provider + switch internal.DNSProvider { + case "gandi": + provider, err = gandiPkg.New() + if err != nil { + logrus.Fatal(err) + } + } + + records, err := provider.GetRecords(c.Context, zone) + if err != nil { + logrus.Fatal(err) + } + + tableCol := []string{"type", "name", "value", "TTL", "priority"} + table := abraFormatter.CreateTable(tableCol) + + for _, record := range records { + value := record.Value + if len(record.Value) > 30 { + value = fmt.Sprintf("%s...", record.Value[:30]) + } + + table.Append([]string{ + record.Type, + record.Name, + value, + record.TTL.String(), + strconv.Itoa(record.Priority), + }) + } + + table.Render() + + return nil + }, +} diff --git a/cli/internal/common.go b/cli/internal/common.go index ab136865..b013ff1f 100644 --- a/cli/internal/common.go +++ b/cli/internal/common.go @@ -61,3 +61,16 @@ var ChaosFlag = &cli.BoolFlag{ Usage: "Deploy uncommitted recipes changes. Use with care!", Destination: &Chaos, } + +// DNSProvider specifies a DNS provider. +var DNSProvider string + +// DNSProviderFlag selects a DNS provider. +var DNSProviderFlag = &cli.StringFlag{ + Name: "provider", + Value: "", + Aliases: []string{"p"}, + Usage: "DNS provider", + Destination: &DNSProvider, + Required: true, +} diff --git a/cli/server/dns.go b/cli/server/dns.go deleted file mode 100644 index b3037834..00000000 --- a/cli/server/dns.go +++ /dev/null @@ -1,91 +0,0 @@ -package server - -import ( - "github.com/urfave/cli/v2" -) - -var provider string -var providerFlag = &cli.StringFlag{ - Name: "provider", - Value: "", - Aliases: []string{"p"}, - Usage: "Choose a DNS provider (options: Gandi)", - Destination: &provider, -} - -var serverDnsListCommand = &cli.Command{ - Name: "list", - Usage: "List domains for a server", - Aliases: []string{"ls"}, - ArgsUsage: "", - Flags: []cli.Flag{ - providerFlag, - }, - Description: ` -`, - Action: func(c *cli.Context) error { - // domainName := internal.ValidateDomain(c) - return nil - }, -} - -var serverDnsRemoveCommand = &cli.Command{ - Name: "remove", - Usage: "Remove domains for a server", - Aliases: []string{"rm"}, - ArgsUsage: "", - Flags: []cli.Flag{ - providerFlag, - }, - Description: ` -`, - Action: func(c *cli.Context) error { - // domainName := internal.ValidateDomain(c) - return nil - }, -} - -var serverDnsAddCommand = &cli.Command{ - Name: "add", - Usage: "Add domains for a server", - Aliases: []string{"a"}, - ArgsUsage: "", - Flags: []cli.Flag{ - providerFlag, - }, - Description: ` -`, - Action: func(c *cli.Context) error { - // domainName := internal.ValidateDomain(c) - return nil - }, -} - -var serverDnsUpdateCommand = &cli.Command{ - Name: "update", - Usage: "Update domains for a server", - Aliases: []string{"u"}, - ArgsUsage: "", - Flags: []cli.Flag{ - providerFlag, - }, - Description: ` -`, - Action: func(c *cli.Context) error { - // domainName := internal.ValidateDomain(c) - return nil - }, -} - -var serverDnsCommand = &cli.Command{ - Name: "dns", - Aliases: []string{"d"}, - Usage: "Manage server domains", - ArgsUsage: "", - Subcommands: []*cli.Command{ - serverDnsListCommand, - serverDnsRemoveCommand, - serverDnsAddCommand, - serverDnsUpdateCommand, - }, -} diff --git a/cli/server/server.go b/cli/server/server.go index 02aa0d9f..dca39bad 100644 --- a/cli/server/server.go +++ b/cli/server/server.go @@ -22,6 +22,5 @@ the connections to those servers. serverAddCommand, serverListCommand, serverRemoveCommand, - serverDnsCommand, }, } diff --git a/go.mod b/go.mod index 71ff0428..58d0c09e 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/libdns/gandi v1.0.2 - github.com/libdns/libdns v0.2.1 + github.com/libdns/libdns v0.2.1 // indirect github.com/moby/sys/mount v0.2.0 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/runc v1.0.2 // indirect diff --git a/pkg/dns/common.go b/pkg/dns/common.go new file mode 100644 index 00000000..731f1a83 --- /dev/null +++ b/pkg/dns/common.go @@ -0,0 +1,28 @@ +package dns + +import ( + "fmt" + "os" + + "github.com/AlecAivazis/survey/v2" + "github.com/sirupsen/logrus" +) + +// NewToken constructs a new DNS provider token. +func NewToken(provider, providerTokenEnvVar string) (string, error) { + if token, present := os.LookupEnv(providerTokenEnvVar); present { + return token, nil + } + + logrus.Debugf("no %s in environment, asking via stdin", providerTokenEnvVar) + + var token string + prompt := &survey.Input{ + Message: fmt.Sprintf("%s API token?", provider), + } + if err := survey.AskOne(prompt, &token); err != nil { + return "", err + } + + return token, nil +} diff --git a/pkg/dns/gandi.go b/pkg/dns/gandi.go deleted file mode 100644 index 20cd913e..00000000 --- a/pkg/dns/gandi.go +++ /dev/null @@ -1,52 +0,0 @@ -package gandi - -import ( - "os" - - "github.com/AlecAivazis/survey/v2" - "github.com/libdns/gandi" - "github.com/libdns/libdns" - "github.com/sirupsen/logrus" -) - -func getToken() (string, error) { - if token, present := os.LookupEnv("GANDI_TOKEN"); present { - return token, nil - } - - logrus.Debugf("no GANDI_TOKEN in environment, asking via stdin") - - var token string - prompt := &survey.Input{ - Message: "Gandi API token?", - } - if err := survey.AskOne(prompt, &token); err != nil { - return "", err - } - - return token, nil -} - -func getProvider() (gandi.Provider, error) { - token, err := getToken() - if err != nil { - return gandi.Provider{}, err - } - return gandi.Provider{APIToken: token}, nil -} - -func ListDomains() ([]libdns.Record, error) { - return []libdns.Record{}, nil -} - -func RemoveDomain() (bool, error) { - return false, nil -} - -func AddDomain() (bool, error) { - return false, nil -} - -func UpdateDomain() (bool, error) { - return false, nil -} diff --git a/pkg/dns/gandi/gandi.go b/pkg/dns/gandi/gandi.go new file mode 100644 index 00000000..6049bf92 --- /dev/null +++ b/pkg/dns/gandi/gandi.go @@ -0,0 +1,15 @@ +package gandi + +import ( + "coopcloud.tech/abra/pkg/dns" + "github.com/libdns/gandi" +) + +// New constructs a new DNs provider. +func New() (gandi.Provider, error) { + token, err := dns.NewToken("Gandi", "GANDI_TOKEN") + if err != nil { + return gandi.Provider{}, err + } + return gandi.Provider{APIToken: token}, nil +}