From 3ab61bca31db971f46cfc711e26ad01b57a25c38 Mon Sep 17 00:00:00 2001 From: Fernandez Ludovic Date: Sat, 20 Apr 2019 17:57:11 +0200 Subject: [PATCH] feat(kv): watch support. --- cmd/kv.go | 7 ++++--- dumper/kv/config.go | 1 + dumper/kv/kv.go | 36 ++++++++++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/cmd/kv.go b/cmd/kv.go index 86b5395..1e11408 100644 --- a/cmd/kv.go +++ b/cmd/kv.go @@ -23,11 +23,12 @@ func init() { kvCmd.PersistentFlags().String("prefix", "traefik", "Prefix used for KV store.") kvCmd.PersistentFlags().String("password", "", "Password for connection.") kvCmd.PersistentFlags().String("username", "", "Username for connection.") + kvCmd.PersistentFlags().Bool("watch", false, "Enable watching changes.") // FIXME review TLS parts - kvCmd.PersistentFlags().Bool("tls.enable", false, "Enable TLS encryption.") - kvCmd.PersistentFlags().Bool("tls.insecureskipverify", false, "Trust unverified certificates if TLS is enabled.") - kvCmd.PersistentFlags().String("tls.ca-cert-file", "", "Root CA file for certificate verification if TLS is enabled.") + // kvCmd.PersistentFlags().Bool("tls.enable", false, "Enable TLS encryption.") + // kvCmd.PersistentFlags().Bool("tls.insecureskipverify", false, "Trust unverified certificates if TLS is enabled.") + // kvCmd.PersistentFlags().String("tls.ca-cert-file", "", "Root CA file for certificate verification if TLS is enabled.") } func getKvConfig(cmd *cobra.Command) (*kv.Config, error) { diff --git a/dumper/kv/config.go b/dumper/kv/config.go index 98a2f89..8c3072a 100644 --- a/dumper/kv/config.go +++ b/dumper/kv/config.go @@ -7,5 +7,6 @@ type Config struct { Backend store.Backend Prefix string Endpoints []string + Watch bool Options *store.Config } diff --git a/dumper/kv/kv.go b/dumper/kv/kv.go index 6b74399..f2e41f5 100644 --- a/dumper/kv/kv.go +++ b/dumper/kv/kv.go @@ -4,6 +4,7 @@ import ( "bytes" "compress/gzip" "encoding/json" + "fmt" "io/ioutil" "github.com/abronan/valkeyrie" @@ -11,7 +12,7 @@ import ( "github.com/ldez/traefik-certs-dumper/dumper" ) -const storeKey = "/acme/account/object" +const storeKeySuffix = "/acme/account/object" // Dump FIXME func Dump(config *Config, baseConfig *dumper.BaseConfig) error { @@ -20,11 +21,42 @@ func Dump(config *Config, baseConfig *dumper.BaseConfig) error { return err } - pair, err := kvStore.Get(config.Prefix+storeKey, nil) + storeKey := config.Prefix + storeKeySuffix + + if config.Watch { + return watch(kvStore, storeKey, baseConfig) + } + + pair, err := kvStore.Get(storeKey, nil) if err != nil { return err } + return dumpPair(pair, baseConfig) +} + +func watch(kvStore store.Store, storeKey string, baseConfig *dumper.BaseConfig) error { + stopCh := make(<-chan struct{}) + + pairs, err := kvStore.Watch(storeKey, stopCh, nil) + if err != nil { + return err + } + + for { + pair := <-pairs + if pair == nil { + return fmt.Errorf("could not fetch Key/Value pair for key %v", storeKey) + } + + err = dumpPair(pair, baseConfig) + if err != nil { + return err + } + } +} + +func dumpPair(pair *store.KVPair, baseConfig *dumper.BaseConfig) error { data, err := getStoredDataFromGzip(pair) if err != nil { return err