diff --git a/cmd/boltdb.go b/cmd/boltdb.go index 1e22d08..ce7d44b 100644 --- a/cmd/boltdb.go +++ b/cmd/boltdb.go @@ -1,8 +1,6 @@ package cmd import ( - "strconv" - "github.com/abronan/valkeyrie/store" "github.com/abronan/valkeyrie/store/boltdb" "github.com/ldez/traefik-certs-dumper/dumper" @@ -15,7 +13,7 @@ var boltdbCmd = &cobra.Command{ Use: "boltdb", Short: "TODO", Long: `TODO`, - RunE: boltdbRun, + RunE: runE(boltdbRun), } func init() { @@ -25,25 +23,8 @@ func init() { boltdbCmd.Flags().String("bucket", "traefik", "Bucket for boltdb.") } -func boltdbRun(cmd *cobra.Command, _ []string) error { - // FIXME shared with file and all KVs - dumpPath := cmd.Flag("dest").Value.String() - - crtInfo := dumper.FileInfo{ - Name: cmd.Flag("crt-name").Value.String(), - Ext: cmd.Flag("crt-ext").Value.String(), - } - - keyInfo := dumper.FileInfo{ - Name: cmd.Flag("key-name").Value.String(), - Ext: cmd.Flag("key-ext").Value.String(), - } - - subDir, _ := strconv.ParseBool(cmd.Flag("domain-subdir").Value.String()) - - // --- - - config, err := getBaseConfig(cmd) +func boltdbRun(baseConfig *dumper.BaseConfig, cmd *cobra.Command) error { + config, err := getKvConfig(cmd) if err != nil { return err } @@ -54,5 +35,5 @@ func boltdbRun(cmd *cobra.Command, _ []string) error { config.Backend = store.BOLTDB boltdb.Register() - return kv.Dump(config, dumpPath, crtInfo, keyInfo, subDir) + return kv.Dump(config, baseConfig) } diff --git a/cmd/consul.go b/cmd/consul.go index 27825b2..a5e536a 100644 --- a/cmd/consul.go +++ b/cmd/consul.go @@ -1,8 +1,6 @@ package cmd import ( - "strconv" - "github.com/abronan/valkeyrie/store" "github.com/abronan/valkeyrie/store/consul" "github.com/ldez/traefik-certs-dumper/dumper" @@ -15,7 +13,7 @@ var consulCmd = &cobra.Command{ Use: "consul", Short: "TODO", Long: `TODO`, - RunE: consulRun, + RunE: runE(consulRun), } func init() { @@ -24,25 +22,8 @@ func init() { consulCmd.Flags().String("token", "", "Token for consul.") } -func consulRun(cmd *cobra.Command, _ []string) error { - // FIXME shared with file and all KVs - dumpPath := cmd.Flag("dest").Value.String() - - crtInfo := dumper.FileInfo{ - Name: cmd.Flag("crt-name").Value.String(), - Ext: cmd.Flag("crt-ext").Value.String(), - } - - keyInfo := dumper.FileInfo{ - Name: cmd.Flag("key-name").Value.String(), - Ext: cmd.Flag("key-ext").Value.String(), - } - - subDir, _ := strconv.ParseBool(cmd.Flag("domain-subdir").Value.String()) - - // --- - - config, err := getBaseConfig(cmd) +func consulRun(baseConfig *dumper.BaseConfig, cmd *cobra.Command) error { + config, err := getKvConfig(cmd) if err != nil { return err } @@ -52,5 +33,5 @@ func consulRun(cmd *cobra.Command, _ []string) error { config.Backend = store.CONSUL consul.Register() - return kv.Dump(config, dumpPath, crtInfo, keyInfo, subDir) + return kv.Dump(config, baseConfig) } diff --git a/cmd/etcd.go b/cmd/etcd.go index 3c08ce1..70d19e2 100644 --- a/cmd/etcd.go +++ b/cmd/etcd.go @@ -1,7 +1,6 @@ package cmd import ( - "strconv" "time" "github.com/abronan/valkeyrie/store" @@ -16,7 +15,7 @@ var etcdCmd = &cobra.Command{ Use: "etcd", Short: "TODO", Long: `TODO`, - RunE: etcdRun, + RunE: runE(etcdRun), } func init() { @@ -25,25 +24,8 @@ func init() { etcdCmd.Flags().Int("sync-period", 0, "Sync period for etcd in seconds.") } -func etcdRun(cmd *cobra.Command, _ []string) error { - // FIXME shared with file and all KVs - dumpPath := cmd.Flag("dest").Value.String() - - crtInfo := dumper.FileInfo{ - Name: cmd.Flag("crt-name").Value.String(), - Ext: cmd.Flag("crt-ext").Value.String(), - } - - keyInfo := dumper.FileInfo{ - Name: cmd.Flag("key-name").Value.String(), - Ext: cmd.Flag("key-ext").Value.String(), - } - - subDir, _ := strconv.ParseBool(cmd.Flag("domain-subdir").Value.String()) - - // --- - - config, err := getBaseConfig(cmd) +func etcdRun(baseConfig *dumper.BaseConfig, cmd *cobra.Command) error { + config, err := getKvConfig(cmd) if err != nil { return err } @@ -57,5 +39,5 @@ func etcdRun(cmd *cobra.Command, _ []string) error { config.Backend = store.ETCD etcd.Register() - return kv.Dump(config, dumpPath, crtInfo, keyInfo, subDir) + return kv.Dump(config, baseConfig) } diff --git a/cmd/file.go b/cmd/file.go index 06d040b..cc19b9c 100644 --- a/cmd/file.go +++ b/cmd/file.go @@ -1,8 +1,6 @@ package cmd import ( - "strconv" - "github.com/ldez/traefik-certs-dumper/dumper" "github.com/ldez/traefik-certs-dumper/dumper/file" "github.com/spf13/cobra" @@ -13,33 +11,11 @@ var fileCmd = &cobra.Command{ Use: "file", Short: `Dump the content of the "acme.json" file.`, Long: `Dump the content of the "acme.json" file from Traefik to certificates.`, - RunE: func(cmd *cobra.Command, _ []string) error { - // FIXME shared with KV - dumpPath := cmd.Flag("dest").Value.String() - - crtInfo := dumper.FileInfo{ - Name: cmd.Flag("crt-name").Value.String(), - Ext: cmd.Flag("crt-ext").Value.String(), - } - - keyInfo := dumper.FileInfo{ - Name: cmd.Flag("key-name").Value.String(), - Ext: cmd.Flag("key-ext").Value.String(), - } - - subDir, _ := strconv.ParseBool(cmd.Flag("domain-subdir").Value.String()) - - // --- - + RunE: runE(func(baseConfig *dumper.BaseConfig, cmd *cobra.Command) error { acmeFile := cmd.Flag("source").Value.String() - err := file.Dump(acmeFile, dumpPath, crtInfo, keyInfo, subDir) - if err != nil { - return err - } - - return dumper.Tree(dumpPath, "") - }, + return file.Dump(acmeFile, baseConfig) + }), } func init() { diff --git a/cmd/kv.go b/cmd/kv.go index 580ea5e..9661c40 100644 --- a/cmd/kv.go +++ b/cmd/kv.go @@ -29,7 +29,7 @@ func init() { kvCmd.PersistentFlags().String("tls.ca-cert-file", "", "Root CA file for certificate verification if TLS is enabled.") } -func getBaseConfig(cmd *cobra.Command) (*kv.BaseConfig, error) { +func getKvConfig(cmd *cobra.Command) (*kv.Config, error) { endpoints, err := cmd.Flags().GetStringSlice("endpoints") if err != nil { return nil, err @@ -50,7 +50,7 @@ func getBaseConfig(cmd *cobra.Command) (*kv.BaseConfig, error) { return nil, err } - return &kv.BaseConfig{ + return &kv.Config{ Endpoints: endpoints, Options: &store.Config{ ClientTLS: nil, diff --git a/cmd/root.go b/cmd/root.go index 5632bd2..af5439e 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -5,6 +5,7 @@ import ( "os" "strconv" + "github.com/ldez/traefik-certs-dumper/dumper" homedir "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -82,3 +83,39 @@ func initConfig() { fmt.Println("Using config file:", viper.ConfigFileUsed()) } } + +func getBaseConfig(cmd *cobra.Command) (*dumper.BaseConfig, error) { + subDir, err := strconv.ParseBool(cmd.Flag("domain-subdir").Value.String()) + if err != nil { + return nil, err + } + + return &dumper.BaseConfig{ + DumpPath: cmd.Flag("dest").Value.String(), + CrtInfo: dumper.FileInfo{ + Name: cmd.Flag("crt-name").Value.String(), + Ext: cmd.Flag("crt-ext").Value.String(), + }, + KeyInfo: dumper.FileInfo{ + Name: cmd.Flag("key-name").Value.String(), + Ext: cmd.Flag("key-ext").Value.String(), + }, + DomainSubDir: subDir, + }, nil +} + +func runE(apply func(*dumper.BaseConfig, *cobra.Command) error) func(*cobra.Command, []string) error { + return func(cmd *cobra.Command, _ []string) error { + baseConfig, err := getBaseConfig(cmd) + if err != nil { + return err + } + + err = apply(baseConfig, cmd) + if err != nil { + return err + } + + return dumper.Tree(baseConfig.DumpPath, "") + } +} diff --git a/cmd/zookeeper.go b/cmd/zookeeper.go index 3743a8e..f537461 100644 --- a/cmd/zookeeper.go +++ b/cmd/zookeeper.go @@ -1,8 +1,6 @@ package cmd import ( - "strconv" - "github.com/abronan/valkeyrie/store" "github.com/abronan/valkeyrie/store/zookeeper" "github.com/ldez/traefik-certs-dumper/dumper" @@ -15,32 +13,15 @@ var zookeeperCmd = &cobra.Command{ Use: "zookeeper", Short: "TODO", Long: `TODO`, - RunE: zookeeperRun, + RunE: runE(zookeeperRun), } func init() { kvCmd.AddCommand(zookeeperCmd) } -func zookeeperRun(cmd *cobra.Command, _ []string) error { - // FIXME shared with file and all KVs - dumpPath := cmd.Flag("dest").Value.String() - - crtInfo := dumper.FileInfo{ - Name: cmd.Flag("crt-name").Value.String(), - Ext: cmd.Flag("crt-ext").Value.String(), - } - - keyInfo := dumper.FileInfo{ - Name: cmd.Flag("key-name").Value.String(), - Ext: cmd.Flag("key-ext").Value.String(), - } - - subDir, _ := strconv.ParseBool(cmd.Flag("domain-subdir").Value.String()) - - // --- - - config, err := getBaseConfig(cmd) +func zookeeperRun(baseConfig *dumper.BaseConfig, cmd *cobra.Command) error { + config, err := getKvConfig(cmd) if err != nil { return err } @@ -48,5 +29,5 @@ func zookeeperRun(cmd *cobra.Command, _ []string) error { config.Backend = store.ZK zookeeper.Register() - return kv.Dump(config, dumpPath, crtInfo, keyInfo, subDir) + return kv.Dump(config, baseConfig) } diff --git a/dumper/config.go b/dumper/config.go new file mode 100644 index 0000000..bf8a860 --- /dev/null +++ b/dumper/config.go @@ -0,0 +1,9 @@ +package dumper + +// BaseConfig FIXME +type BaseConfig struct { + DumpPath string + CrtInfo FileInfo + KeyInfo FileInfo + DomainSubDir bool +} diff --git a/dumper/dumper.go b/dumper/dumper.go index 910183b..9944737 100644 --- a/dumper/dumper.go +++ b/dumper/dumper.go @@ -21,34 +21,34 @@ type FileInfo struct { } // Dump FIXME -func Dump(data *StoredData, dumpPath string, crtInfo, keyInfo FileInfo, domainSubDir bool) error { - if err := os.RemoveAll(dumpPath); err != nil { +func Dump(data *StoredData, baseConfig *BaseConfig) error { + if err := os.RemoveAll(baseConfig.DumpPath); err != nil { return err } - if !domainSubDir { - if err := os.MkdirAll(filepath.Join(dumpPath, certsSubDir), 0755); err != nil { + if !baseConfig.DomainSubDir { + if err := os.MkdirAll(filepath.Join(baseConfig.DumpPath, certsSubDir), 0755); err != nil { return err } } - if err := os.MkdirAll(filepath.Join(dumpPath, keysSubDir), 0755); err != nil { + if err := os.MkdirAll(filepath.Join(baseConfig.DumpPath, keysSubDir), 0755); err != nil { return err } privateKeyPem := extractPEMPrivateKey(data.Account) - err := ioutil.WriteFile(filepath.Join(dumpPath, keysSubDir, "letsencrypt"+keyInfo.Ext), privateKeyPem, 0666) + err := ioutil.WriteFile(filepath.Join(baseConfig.DumpPath, keysSubDir, "letsencrypt"+baseConfig.KeyInfo.Ext), privateKeyPem, 0666) if err != nil { return err } for _, cert := range data.Certificates { - err := writeCert(dumpPath, cert, crtInfo, domainSubDir) + err := writeCert(baseConfig.DumpPath, cert, baseConfig.CrtInfo, baseConfig.DomainSubDir) if err != nil { return err } - err = writeKey(dumpPath, cert, keyInfo, domainSubDir) + err = writeKey(baseConfig.DumpPath, cert, baseConfig.KeyInfo, baseConfig.DomainSubDir) if err != nil { return err } diff --git a/dumper/file/file.go b/dumper/file/file.go index daa0b71..83a165a 100644 --- a/dumper/file/file.go +++ b/dumper/file/file.go @@ -8,13 +8,13 @@ import ( ) // Dump FIXME -func Dump(acmeFile, dumpPath string, crtInfo, keyInfo dumper.FileInfo, domainSubDir bool) error { +func Dump(acmeFile string, baseConfig *dumper.BaseConfig) error { data, err := readFile(acmeFile) if err != nil { return err } - return dumper.Dump(data, dumpPath, crtInfo, keyInfo, domainSubDir) + return dumper.Dump(data, baseConfig) } func readFile(acmeFile string) (*dumper.StoredData, error) { diff --git a/dumper/kv/config.go b/dumper/kv/config.go new file mode 100644 index 0000000..1b24deb --- /dev/null +++ b/dumper/kv/config.go @@ -0,0 +1,10 @@ +package kv + +import "github.com/abronan/valkeyrie/store" + +// Config FIXME +type Config struct { + Backend store.Backend + Endpoints []string + Options *store.Config +} diff --git a/dumper/kv/kv.go b/dumper/kv/kv.go index 54937f8..ae879d9 100644 --- a/dumper/kv/kv.go +++ b/dumper/kv/kv.go @@ -14,15 +14,8 @@ import ( // FIXME prefix const storeKey = "traefik/acme/account/object" -// BaseConfig FIXME -type BaseConfig struct { - Backend store.Backend - Endpoints []string - Options *store.Config -} - // Dump FIXME -func Dump(config *BaseConfig, dumpPath string, crtInfo, keyInfo dumper.FileInfo, domainSubDir bool) error { +func Dump(config *Config, baseConfig *dumper.BaseConfig) error { kvStore, err := valkeyrie.NewStore(config.Backend, config.Endpoints, config.Options) if err != nil { return err @@ -38,7 +31,7 @@ func Dump(config *BaseConfig, dumpPath string, crtInfo, keyInfo dumper.FileInfo, return err } - return dumper.Dump(data, dumpPath, crtInfo, keyInfo, domainSubDir) + return dumper.Dump(data, baseConfig) } func getStoredDataFromGzip(pair *store.KVPair) (*dumper.StoredData, error) {