diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bbef688..9025893 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,7 +32,7 @@ jobs: go-version: '1.22' - name: Lint - if: ${{ matrix.os == 'ubuntu-22.04' }} + if: ${{ matrix.os == 'ubuntu-20.04' }} run: make lint - name: Test diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..93b975b --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + true + + \ No newline at end of file diff --git a/README.md b/README.md index c414184..4cba983 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Checksums are signed with the [following GPG key](https://keybase.io/mvisonneau/ ```bash ~$ go install github.com/mvisonneau/vac/cmd/vac@latest +~$ sudo setcap cap_ipc_lock=ep ${GOPATH:-~/go}/bin/vac ``` ### Homebrew @@ -127,6 +128,9 @@ GLOBAL OPTIONS: --state path, -s path state path (default: "~/.vac_state") [$VAC_STATE_PATH] --log-level level log level (debug,info,warn,fatal,panic) (default: "info") [$VAC_LOG_LEVEL] --log-format format log format (json,text) (default: "text") [$VAC_LOG_FORMAT] + --auth value auth method (token, kubernetes) (default: "token") [$VAC_AUTH] + --auth-k8s-role value Kubernetes role to authenticate to (for --auth kubernetes) [$VAC_AUTH_K8S_ROLE] + --auth-k8s-mount value Kubernetes auth mount path (for --auth kubernetes) (default: "kubernetes") [$VAC_AUTH_K8S_MOUNT] --help, -h show help ``` diff --git a/go.mod b/go.mod index 2533958..59e0cd9 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,19 @@ module github.com/mvisonneau/vac -go 1.23 +go 1.24.0 require ( - github.com/gofrs/flock v0.12.1 + github.com/gofrs/flock v0.13.0 github.com/hashicorp/go-secure-stdlib/mlock v0.1.3 - github.com/hashicorp/vault/api v1.16.0 + github.com/hashicorp/vault/api v1.20.0 + github.com/hashicorp/vault/api/auth/kubernetes v0.10.0 github.com/ktr0731/go-fuzzyfinder v0.8.0 github.com/mitchellh/go-homedir v1.1.0 github.com/mvisonneau/go-helpers v0.0.1 github.com/olekukonko/tablewriter v0.0.5 github.com/pkg/errors v0.9.1 github.com/sirupsen/logrus v1.9.3 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 github.com/urfave/cli/v2 v2.27.6 github.com/xeonx/timeago v1.0.0-rc5 @@ -34,7 +35,7 @@ require ( github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-sockaddr v1.0.6 // indirect - github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/hashicorp/hcl v1.0.1-vault-7 // indirect github.com/kr/text v0.2.0 // indirect github.com/ktr0731/go-ansisgr v0.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect @@ -47,11 +48,11 @@ require ( github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/crypto v0.45.0 // indirect + golang.org/x/net v0.47.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect golang.org/x/time v0.5.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 5f1258b..d7db20e 100644 --- a/go.sum +++ b/go.sum @@ -19,8 +19,8 @@ github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3 github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= -github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= +github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -46,10 +46,12 @@ github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9 github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= -github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= -github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= -github.com/hashicorp/vault/api v1.16.0 h1:nbEYGJiAPGzT9U4oWgaaB0g+Rj8E59QuHKyA5LhwQN4= -github.com/hashicorp/vault/api v1.16.0/go.mod h1:KhuUhzOD8lDSk29AtzNjgAu2kxRA9jL9NAbkFlqvkBA= +github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I= +github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/hashicorp/vault/api v1.20.0 h1:KQMHElgudOsr+IbJgmbjHnCTxEpKs9LnozA1D3nozU4= +github.com/hashicorp/vault/api v1.20.0/go.mod h1:GZ4pcjfzoOWpkJ3ijHNpEoAxKEsBJnVljyTe3jM2Sms= +github.com/hashicorp/vault/api/auth/kubernetes v0.10.0 h1:5rqWmUFxnu3S7XYq9dafURwBgabYDFzo2Wv+AMopPHs= +github.com/hashicorp/vault/api/auth/kubernetes v0.10.0/go.mod h1:cZZmhF6xboMDmDbMY52oj2DKW6gS0cQ9g0pJ5XIXQ5U= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -101,8 +103,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g= @@ -114,16 +116,19 @@ github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBi github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -137,21 +142,24 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/internal/cli/cli.go b/internal/cli/cli.go index 5183f3f..c8c6af2 100644 --- a/internal/cli/cli.go +++ b/internal/cli/cli.go @@ -34,6 +34,9 @@ func NewApp(version string, start time.Time) (app *cli.App) { flags.LogLevel, flags.Role, flags.State, + flags.Auth, + flags.AuthK8sRole, + flags.AuthK8sMount, } app.Action = cmd.ExecWrapper(cmd.Switch) diff --git a/internal/cli/flags/flags.go b/internal/cli/flags/flags.go index 0ceedaf..aced7b6 100644 --- a/internal/cli/flags/flags.go +++ b/internal/cli/flags/flags.go @@ -60,4 +60,24 @@ var ( Usage: "ttl `duration`", Value: 0, } + + Auth = &cli.StringFlag{ + Name: "auth", + EnvVars: []string{"VAC_AUTH"}, + Usage: "auth method (token, kubernetes)", + Value: "token", + } + + AuthK8sRole = &cli.StringFlag{ + Name: "auth-k8s-role", + EnvVars: []string{"VAC_AUTH_K8S_ROLE"}, + Usage: "Kubernetes role to authenticate to (for --auth kubernetes)", + } + + AuthK8sMount = &cli.StringFlag{ + Name: "auth-k8s-mount", + EnvVars: []string{"VAC_AUTH_K8S_MOUNT"}, + Usage: "Kubernetes auth mount path (for --auth kubernetes)", + Value: "kubernetes", + } ) diff --git a/internal/cmd/get.go b/internal/cmd/get.go index 076c231..99bb42f 100644 --- a/internal/cmd/get.go +++ b/internal/cmd/get.go @@ -61,6 +61,11 @@ func Get(ctx *cli.Context) (int, error) { defer unlock() } + err = vac.Authenticate(cfg.AuthInfo) + if err != nil { + return 1, err + } + s, err := state.Read(cfg.StatePath) if err != nil { return 1, err diff --git a/internal/cmd/status.go b/internal/cmd/status.go index 32904ec..7485a01 100644 --- a/internal/cmd/status.go +++ b/internal/cmd/status.go @@ -33,6 +33,11 @@ func Status(ctx *cli.Context) (int, error) { defer unlock() } + err = vac.Authenticate(cfg.AuthInfo) + if err != nil { + return 1, err + } + s, err := state.Read(cfg.StatePath) if err != nil { return 1, err diff --git a/internal/cmd/switch.go b/internal/cmd/switch.go index 6f02fff..473cae8 100644 --- a/internal/cmd/switch.go +++ b/internal/cmd/switch.go @@ -29,6 +29,11 @@ func Switch(ctx *cli.Context) (int, error) { defer unlock() } + err = vac.Authenticate(cfg.AuthInfo) + if err != nil { + return 1, err + } + s, err := state.Read(cfg.StatePath) if err != nil { return 1, err diff --git a/internal/cmd/utils.go b/internal/cmd/utils.go index 7d0bf76..926aa4c 100644 --- a/internal/cmd/utils.go +++ b/internal/cmd/utils.go @@ -13,6 +13,7 @@ import ( "github.com/mvisonneau/go-helpers/logger" "github.com/mvisonneau/vac/internal/cli/flags" + "github.com/mvisonneau/vac/pkg/client" ) var start time.Time @@ -23,6 +24,8 @@ type Config struct { Role string StatePath string LockPath string + + AuthInfo client.AuthInfo } func configure(ctx *cli.Context) (*Config, error) { @@ -45,6 +48,12 @@ func configure(ctx *cli.Context) (*Config, error) { Role: flags.Role.Get(ctx), StatePath: statePath, LockPath: fmt.Sprintf("%s.lock", statePath), + + AuthInfo: client.AuthInfo{ + Method: ctx.String("auth"), + MountPath: ctx.String("auth-k8s-mount"), + RoleName: ctx.String("auth-k8s-role"), + }, }, nil } diff --git a/pkg/client/vault.go b/pkg/client/vault.go index 430c168..f33b3ca 100644 --- a/pkg/client/vault.go +++ b/pkg/client/vault.go @@ -1,14 +1,15 @@ package client import ( + "context" "fmt" - "io/ioutil" "os" "path/filepath" "strings" "time" vault "github.com/hashicorp/vault/api" + k8sauth "github.com/hashicorp/vault/api/auth/kubernetes" "github.com/mitchellh/go-homedir" ) @@ -38,22 +39,47 @@ func getVaultClient() (*vault.Client, error) { return nil, fmt.Errorf("error settings vault client addr: %w", err) } - token := os.Getenv("VAULT_TOKEN") - if len(token) == 0 { - home, _ := homedir.Dir() - f, err := ioutil.ReadFile(filepath.Clean(home + "/.vault-token")) + return c, nil +} + +type AuthInfo struct { + Method string + + MountPath string + RoleName string +} + +func (c *Client) Authenticate(info AuthInfo) error { + switch info.Method { + case "kubernetes": + authMethod, err := k8sauth.NewKubernetesAuth(info.RoleName, k8sauth.WithMountPath(info.MountPath)) if err != nil { - return nil, fmt.Errorf("Vault token is not defined (VAULT_TOKEN or ~/.vault-token)") + return err } + _, err = c.Auth().Login(context.Background(), authMethod) + if err != nil { + return err + } + return nil + case "token", "": + // Vault SDK automatically handle the envars + if c.Token() == "" { + home, _ := homedir.Dir() + f, err := os.ReadFile(filepath.Clean(home + "/.vault-token")) + if err != nil { + return fmt.Errorf("Vault token is not defined (%s or ~/.vault-token)", vault.EnvVaultToken) + } - // The vault client does not handle a trailing newline, so we ensure it - // has been removed - token = strings.TrimSuffix(string(f), "\n") - } - - c.SetToken(token) + // The vault client does not handle a trailing newline, so we ensure it + // has been removed + token := strings.TrimSuffix(string(f), "\n") + c.SetToken(token) + } - return c, nil + return nil + default: + return fmt.Errorf("unknown Vault authentication method '%s'", info.Method) + } } // ListAWSSecretEngines ..