Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
## Descrição
<!-- Descreva as suas mudanças em detalhes. -->

## Motivação e contexto
<!-- Por quê essa mudança é necessária? Quais problemas ela resolve? -->

## Testes
<!-- Descreva como pode ser realizado os testes -->

## Tipo de mudança
<!-- Que tipo de mudança seu código introduz? -->
<!-- Coloque um `[x]` em qualquer opção aplicável: -->
- [ ] Correção de bug
- [ ] Nova funcionalidade
- [ ] Melhorias na implementação
- [ ] Atualização de dependências
- [ ] Testes automatizados
- [ ] Documentação
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
secrets-init
dist/
*credentials*
.idea
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ This is a simple CLI that reads secrets from Secrets Manager. It's a perfect "in
## CLI

```sh
./secrets-init \
./secrets-init sync \
--provider YOUR_CLOUD_PROVIDER \
--project YOUR_PROJECT_ID \
--filter YOUR_FILTER \
Expand All @@ -29,7 +29,7 @@ Given a secret called `myapp` with the content below:
Running secrets-init with the flags:

```bash
./secrets-init \
./secrets-init sync \
--provider gcp \
--project myproject \
--filter=^myapp*" \
Expand Down
63 changes: 63 additions & 0 deletions cmd/root.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package cmd

import (
"fmt"
"os"

"github.com/spf13/cobra"
)

type rootCmd struct {
cmd *cobra.Command
}

type data struct {
version string
commit string
date string
}

func (r *rootCmd) execute() {
if err := r.cmd.Execute(); err != nil {
_, _ = fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}

func newRootCmd(data *data) *rootCmd {
root := &rootCmd{}
cmd := &cobra.Command{
Version: data.version,
Use: "secret-init",
Short: "Read external secrets from some providers",
Long: `
This is a simple CLI that reads secrets from Secrets Manager, like:
- AWS
- GCP
It's a perfect "init" container in Kubernetes.
it can create a file on a shared volume so the other containers can use that file.
secrets-init can filter one or more secrets by name using a regular expression.
it also parses the secret content as plain text or json.
`,
SilenceUsage: true,
SilenceErrors: true,
Args: cobra.NoArgs,
ValidArgsFunction: cobra.NoFileCompletions,
}

cmd.AddCommand(
newSyncCmd(data).cmd,
newVersionCmd(data).cmd,
)
root.cmd = cmd
return root
}

func Execute(version, commit, date string) {
newRootCmd(&data{
version: version,
commit: commit,
date: date,
}).execute()

}
59 changes: 59 additions & 0 deletions cmd/sync.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package cmd

import (
"fmt"
"github.com/leocomelli/secrets-init/internal/secrets"
"github.com/leocomelli/secrets-init/pkg/provider/common"
"github.com/spf13/cobra"
"go.uber.org/zap"
"os"
)

type syncCmd struct {
cmd *cobra.Command
}

func (r *syncCmd) execute() {
if err := r.cmd.Execute(); err != nil {
_, _ = fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}

func newSyncCmd(data *data) *syncCmd {
sync := &syncCmd{}
secretOpts := &common.SecretsOpts{}

cmd := &cobra.Command{
Version: data.version,
Use: "sync",
Aliases: []string{"s"},
Short: "Sync external secrets to a container init",
SilenceUsage: true,
SilenceErrors: true,
Args: cobra.NoArgs,
ValidArgsFunction: cobra.NoFileCompletions,
RunE: func(cmd *cobra.Command, args []string) error {

fetch, err := secrets.New(secretOpts)
if err != nil {
common.Logger.Fatal("error getting the secrets", zap.Error(err))
return err
}

return fetch.Secrets()
},
}

sync.cmd = cmd

sync.cmd.Flags().StringVarP(&secretOpts.Provider, "provider", "e", "gcp", "name of the provider that manages the secrets")
sync.cmd.Flags().StringVarP(&secretOpts.AssumeRole, "assume-role", "a", "", "role to assume when using aws provider")
sync.cmd.Flags().StringVarP(&secretOpts.Project, "project", "p", "", "gcp project that contains the secrets")
sync.cmd.Flags().StringVarP(&secretOpts.Filter, "filter", "f", "", "regex to filter secrets by name")
sync.cmd.Flags().StringVarP(&secretOpts.Parser, "data-parser", "d", "plaintext", "parse secret based on data type")
sync.cmd.Flags().StringVarP(&secretOpts.Template, "template", "t", "", "template to render secret data")
sync.cmd.Flags().StringVarP(&secretOpts.Output, "output", "o", "", "path to write output file to")

return sync
}
36 changes: 36 additions & 0 deletions cmd/version.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package cmd

import (
"fmt"
"github.com/spf13/cobra"
"os"
)

type versionCmd struct {
cmd *cobra.Command
}

func (r *versionCmd) execute() {
if err := r.cmd.Execute(); err != nil {
_, _ = fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}

func newVersionCmd(data *data) *versionCmd {
sync := &versionCmd{}
cmd := &cobra.Command{
Version: data.version,
Use: "version",
Aliases: []string{"v"},
Short: "Return the current version of secret init",
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Build Date:", data.date)
fmt.Println("Git Commit:", data.commit)
fmt.Println("Version:", data.version)
},
}

sync.cmd = cmd
return sync
}
67 changes: 36 additions & 31 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,54 @@ module github.com/leocomelli/secrets-init
go 1.19

require (
cloud.google.com/go/secretmanager v1.11.1
github.com/aws/aws-sdk-go-v2 v1.19.1
github.com/aws/aws-sdk-go-v2/config v1.18.15
github.com/aws/aws-sdk-go-v2/credentials v1.13.15
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.18.7
github.com/aws/aws-sdk-go-v2/service/sts v1.18.6
cloud.google.com/go/secretmanager v1.11.4
github.com/aws/aws-sdk-go-v2 v1.23.5
github.com/aws/aws-sdk-go-v2/config v1.25.11
github.com/aws/aws-sdk-go-v2/credentials v1.16.9
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.25.2
github.com/aws/aws-sdk-go-v2/service/sts v1.26.2
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.8.4
go.uber.org/zap v1.26.0
google.golang.org/api v0.126.0
google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc
google.golang.org/api v0.152.0
google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17
)

require (
cloud.google.com/go/compute v1.19.3 // indirect
cloud.google.com/go/compute v1.23.3 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
cloud.google.com/go/iam v1.1.0 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.23 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.30 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.24 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.30 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.24 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.12.4 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.4 // indirect
github.com/aws/smithy-go v1.13.5 // indirect
cloud.google.com/go/iam v1.1.5 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.9 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.8 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.8 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.3 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.8 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.18.2 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.2 // indirect
github.com/aws/smithy-go v1.18.1 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/s2a-go v0.1.4 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect
github.com/googleapis/gax-go/v2 v2.11.0 // indirect
github.com/google/s2a-go v0.1.7 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
go.opencensus.io v0.24.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/oauth2 v0.8.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
golang.org/x/crypto v0.15.0 // indirect
golang.org/x/net v0.18.0 // indirect
golang.org/x/oauth2 v0.14.0 // indirect
golang.org/x/sync v0.5.0 // indirect
golang.org/x/sys v0.14.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.5.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect
google.golang.org/grpc v1.55.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect
google.golang.org/grpc v1.59.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Loading