From 4ee95971af27f4e7017faf3d76446feb5c1478ae Mon Sep 17 00:00:00 2001 From: Shibly Meeran Date: Thu, 16 Jan 2025 11:59:43 +0530 Subject: [PATCH] minor changes along with xipher and other dependency upgrades --- go.mod | 78 +++--- go.sum | 166 ++++++------- internal/cli/commands/cmdenv/add.go | 79 +++---- internal/cli/commands/cmdenv/commons.go | 7 +- internal/cli/commands/cmdenv/const.go | 3 - internal/cli/commands/cmdenv/delete.go | 73 +++--- internal/cli/commands/cmdenv/env.go | 33 ++- internal/cli/commands/cmdenv/new.go | 223 +++++++++--------- internal/cli/commands/cmdenv/searchlist.go | 63 +++-- internal/cli/commands/cmdenv/set.go | 55 +++-- internal/cli/commands/cmdenv/show.go | 160 ++++++------- internal/cli/commands/cmdprofile/commons.go | 1 - internal/cli/commands/cmdprofile/default.go | 45 ++-- internal/cli/commands/cmdprofile/delete.go | 35 ++- internal/cli/commands/cmdprofile/list.go | 37 ++- internal/cli/commands/cmdprofile/new.go | 43 ++-- internal/cli/commands/cmdprofile/profile.go | 33 ++- internal/cli/commands/cmdprofile/sync.go | 64 +++-- internal/cli/commands/cmdsystem/commons.go | 1 - internal/cli/commands/cmdsystem/reset.go | 61 +++-- internal/cli/commands/cmdsystem/system.go | 23 +- internal/cli/commands/cmdvault/access.go | 145 ++++++------ internal/cli/commands/cmdvault/const.go | 2 +- internal/cli/commands/cmdvault/delete.go | 51 ++-- internal/cli/commands/cmdvault/deref.go | 61 +++-- internal/cli/commands/cmdvault/get.go | 107 +++++---- internal/cli/commands/cmdvault/k8s.go | 45 ++-- internal/cli/commands/cmdvault/new.go | 63 +++-- internal/cli/commands/cmdvault/put.go | 127 +++++----- internal/cli/commands/cmdvault/ref.go | 85 ++++--- internal/cli/commands/cmdvault/run.go | 126 ++++++++++ internal/cli/commands/cmdvault/shell.go | 103 -------- internal/cli/commands/cmdvault/vault.go | 61 +++-- internal/cli/slv.go | 39 ++- internal/cli/version.go | 17 +- internal/core/crypto/keys.go | 2 +- .../core/environments/providers/password.go | 2 +- 37 files changed, 1152 insertions(+), 1167 deletions(-) create mode 100644 internal/cli/commands/cmdvault/run.go delete mode 100644 internal/cli/commands/cmdvault/shell.go diff --git a/go.mod b/go.mod index 076cc2a..bedb023 100644 --- a/go.mod +++ b/go.mod @@ -5,44 +5,46 @@ go 1.23.0 toolchain go1.23.4 require ( - dev.shib.me/xipher v1.8.0 - github.com/aws/aws-sdk-go v1.55.5 + github.com/aws/aws-sdk-go v1.55.6 github.com/fatih/color v1.18.0 - github.com/go-git/go-git/v5 v5.12.0 + github.com/go-git/go-git/v5 v5.13.1 github.com/go-logr/logr v1.4.2 github.com/olekukonko/tablewriter v0.0.5 - github.com/onsi/ginkgo/v2 v2.22.0 - github.com/onsi/gomega v1.35.1 + github.com/onsi/ginkgo/v2 v2.22.2 + github.com/onsi/gomega v1.36.2 github.com/spf13/cobra v1.8.1 github.com/zalando/go-keyring v0.2.6 - golang.org/x/crypto v0.31.0 - golang.org/x/term v0.27.0 + golang.org/x/crypto v0.32.0 + golang.org/x/term v0.28.0 gopkg.in/yaml.v3 v3.0.1 - k8s.io/api v0.32.0 - k8s.io/apimachinery v0.32.0 - k8s.io/client-go v0.32.0 - sigs.k8s.io/controller-runtime v0.19.3 + k8s.io/api v0.32.1 + k8s.io/apimachinery v0.32.1 + k8s.io/client-go v0.32.1 + sigs.k8s.io/controller-runtime v0.19.4 + xipher.org/xipher v1.9.0 ) require ( al.essio.dev/pkg/shellescape v1.5.1 // indirect - cloud.google.com/go v0.116.0 // indirect - cloud.google.com/go/auth v0.12.1 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect + cloud.google.com/go v0.118.0 // indirect + cloud.google.com/go/auth v0.14.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.3.0 // indirect - cloud.google.com/go/longrunning v0.6.3 // indirect + cloud.google.com/go/iam v1.3.1 // indirect + cloud.google.com/go/longrunning v0.6.4 // indirect github.com/danieljoos/wincred v1.2.2 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/google/s2a-go v0.1.8 // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.14.0 // indirect + github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/klauspost/compress v1.17.11 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mmcloughlin/avo v0.6.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect @@ -52,29 +54,29 @@ require ( go.opentelemetry.io/otel/metric v1.33.0 // indirect go.opentelemetry.io/otel/trace v1.33.0 // indirect golang.org/x/sync v0.10.0 // indirect - google.golang.org/api v0.211.0 // indirect - google.golang.org/genproto v0.0.0-20241209162323-e6fa225c2576 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect - google.golang.org/grpc v1.69.0 // indirect + google.golang.org/api v0.217.0 // indirect + google.golang.org/genproto v0.0.0-20250115164207-1a7da9e5054f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect + google.golang.org/grpc v1.69.4 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect ) require ( - cloud.google.com/go/kms v1.20.2 + cloud.google.com/go/kms v1.20.5 dario.cat/mergo v1.0.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/ProtonMail/go-crypto v1.1.3 // indirect + github.com/ProtonMail/go-crypto v1.1.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.5.0 // indirect - github.com/cyphar/filepath-securejoin v0.3.5 // indirect + github.com/cyphar/filepath-securejoin v0.4.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/evanphx/json-patch/v5 v5.9.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.6.0 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect @@ -93,13 +95,13 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/kevinburke/ssh_config v1.2.0 - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mailru/easyjson v0.9.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pjbgf/sha1cd v0.3.1 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect @@ -111,19 +113,19 @@ require ( github.com/xanzy/ssh-agent v0.3.3 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/exp v0.0.0-20241210194714-1829a127f884 // indirect + golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect golang.org/x/mod v0.22.0 - golang.org/x/net v0.32.0 // indirect - golang.org/x/oauth2 v0.24.0 // indirect - golang.org/x/sys v0.28.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/oauth2 v0.25.0 // indirect + golang.org/x/sys v0.29.0 // indirect golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.8.0 // indirect - golang.org/x/tools v0.28.0 // indirect + golang.org/x/time v0.9.0 // indirect + golang.org/x/tools v0.29.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/protobuf v1.35.2 // indirect + google.golang.org/protobuf v1.36.3 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - k8s.io/apiextensions-apiserver v0.32.0 // indirect + k8s.io/apiextensions-apiserver v0.32.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 // indirect k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect diff --git a/go.sum b/go.sum index 5669d8e..2c2e370 100644 --- a/go.sum +++ b/go.sum @@ -1,34 +1,32 @@ al.essio.dev/pkg/shellescape v1.5.1 h1:86HrALUujYS/h+GtqoB26SBEdkWfmMI6FubjXlsXyho= al.essio.dev/pkg/shellescape v1.5.1/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890= -cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= -cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= -cloud.google.com/go/auth v0.12.1 h1:n2Bj25BUMM0nvE9D2XLTiImanwZhO3DkfWSYS/SAJP4= -cloud.google.com/go/auth v0.12.1/go.mod h1:BFMu+TNpF3DmvfBO9ClqTR/SiqVIm7LukKF9mbendF4= -cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= -cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go v0.118.0 h1:tvZe1mgqRxpiVa3XlIGMiPcEUbP1gNXELgD4y/IXmeQ= +cloud.google.com/go v0.118.0/go.mod h1:zIt2pkedt/mo+DQjcT4/L3NDxzHPR29j5HcclNH+9PM= +cloud.google.com/go/auth v0.14.0 h1:A5C4dKV/Spdvxcl0ggWwWEzzP7AZMJSEIgrkngwhGYM= +cloud.google.com/go/auth v0.14.0/go.mod h1:CYsoRL1PdiDuqeQpZE0bP2pnPrGqFcOkI0nldEQis+A= +cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= +cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= -cloud.google.com/go/iam v1.3.0 h1:4Wo2qTaGKFtajbLpF6I4mywg900u3TLlHDb6mriLDPU= -cloud.google.com/go/iam v1.3.0/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= -cloud.google.com/go/kms v1.20.2 h1:NGTHOxAyhDVUGVU5KngeyGScrg2D39X76Aphe6NC7S0= -cloud.google.com/go/kms v1.20.2/go.mod h1:LywpNiVCvzYNJWS9JUcGJSVTNSwPwi0vBAotzDqn2nc= -cloud.google.com/go/longrunning v0.6.3 h1:A2q2vuyXysRcwzqDpMMLSI6mb6o39miS52UEG/Rd2ng= -cloud.google.com/go/longrunning v0.6.3/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/iam v1.3.1 h1:KFf8SaT71yYq+sQtRISn90Gyhyf4X8RGgeAVC8XGf3E= +cloud.google.com/go/iam v1.3.1/go.mod h1:3wMtuyT4NcbnYNPLMBzYRFiEfjKfJlLVLrisE7bwm34= +cloud.google.com/go/kms v1.20.5 h1:aQQ8esAIVZ1atdJRxihhdxGQ64/zEbJoJnCz/ydSmKg= +cloud.google.com/go/kms v1.20.5/go.mod h1:C5A8M1sv2YWYy1AE6iSrnddSG9lRGdJq5XEdBy28Lmw= +cloud.google.com/go/longrunning v0.6.4 h1:3tyw9rO3E2XVXzSApn1gyEEnH2K9SynNQjMlBi3uHLg= +cloud.google.com/go/longrunning v0.6.4/go.mod h1:ttZpLCe6e7EXvn9OxpBRx7kZEB0efv8yBO6YnVMfhJs= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dev.shib.me/xipher v1.8.0 h1:gjaCkxzRXzEa/6lf0y+xmqHOyGd13p8VkPwl/acK4OI= -dev.shib.me/xipher v1.8.0/go.mod h1:hNYB+2SqI2NG0rGy9Ez7/tt9Zl8nltsdXSl+HaDbxGk= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= -github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/ProtonMail/go-crypto v1.1.5 h1:eoAQfK2dwL+tFSFpr7TbOaPNUbPiJj4fLYwwGE1FQO4= +github.com/ProtonMail/go-crypto v1.1.5/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= -github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= +github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= @@ -36,16 +34,16 @@ github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys= github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cyphar/filepath-securejoin v0.3.5 h1:L81NHjquoQmcPgXcttUS9qTSR/+bXry6pbSINQGpjj4= -github.com/cyphar/filepath-securejoin v0.3.5/go.mod h1:edhVd3c6OXKjUmSrVa/tGJRS9joFTxlslFCAyaxigkE= +github.com/cyphar/filepath-securejoin v0.4.0 h1:PioTG9TBRSApBpYGnDU8HC+miIsX8vitBH9LGNNMoLQ= +github.com/cyphar/filepath-securejoin v0.4.0/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/danieljoos/wincred v1.2.2 h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0= github.com/danieljoos/wincred v1.2.2/go.mod h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy v1.2.3 h1:xwIyKHbaP5yfT6O9KIeYJR5549MXRQkoQMRXGztz8YQ= +github.com/elazarl/goproxy v1.2.3/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -58,18 +56,20 @@ github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= -github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8= -github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= -github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY= +github.com/go-git/go-git/v5 v5.13.1 h1:DAQ9APonnlvSWpvolXWIuV6Q6zXy2wHbN4cVlNR5Q+M= +github.com/go-git/go-git/v5 v5.13.1/go.mod h1:qryJB4cSBoq3FRoBRf5A77joojuBcmPJ0qu3XXXVixc= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -103,16 +103,16 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= -github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= -github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= -github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= -github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= +github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -140,16 +140,17 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mmcloughlin/avo v0.6.0 h1:QH6FU8SKoTLaVs80GA8TJuLNkUYl4VokHKlPhVDg4YY= +github.com/mmcloughlin/avo v0.6.0/go.mod h1:8CoAGaCSYXtCPR+8y18Y9aB/kxb8JSS6FRI7mSkvD+8= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -159,12 +160,12 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg= -github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= -github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= -github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= +github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/pjbgf/sha1cd v0.3.1 h1:Dh2GYdpJnO84lIw0LJwTFXjcNbasP/bklicSznyAaPI= +github.com/pjbgf/sha1cd v0.3.1/go.mod h1:Y8t7jSB/dEI/lQE04A1HVKteqjj9bX5O4+Cex0TCu8s= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -237,10 +238,10 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20241210194714-1829a127f884 h1:Y/Mj/94zIQQGHVSv1tTtQBDaQaJe62U9bkDZKKyhPCU= -golang.org/x/exp v0.0.0-20241210194714-1829a127f884/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c= +golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 h1:yqrTHse8TCMW1M1ZCP+VAR/l0kKxwaAIqN/il7x4voA= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= @@ -250,10 +251,10 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI= -golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= -golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= -golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +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/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70= +golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -268,44 +269,43 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.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/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +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/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.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 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/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= -golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= -golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= +golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= +golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw= gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= -google.golang.org/api v0.211.0 h1:IUpLjq09jxBSV1lACO33CGY3jsRcbctfGzhj+ZSE/Bg= -google.golang.org/api v0.211.0/go.mod h1:XOloB4MXFH4UTlQSGuNUxw0UT74qdENK8d6JNsXKLi0= -google.golang.org/genproto v0.0.0-20241209162323-e6fa225c2576 h1:k48HcZ4FE6in0o8IflZCkc1lTc2u37nhGd8P+fo4r24= -google.golang.org/genproto v0.0.0-20241209162323-e6fa225c2576/go.mod h1:DV2u3tCn/AcVjjmGYZKt6HyvY4w4y3ipAdHkMbe/0i4= -google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= -google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= -google.golang.org/grpc v1.69.0 h1:quSiOM1GJPmPH5XtU+BCoVXcDVJJAzNcoyfC2cCjGkI= -google.golang.org/grpc v1.69.0/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= -google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/api v0.217.0 h1:GYrUtD289o4zl1AhiTZL0jvQGa2RDLyC+kX1N/lfGOU= +google.golang.org/api v0.217.0/go.mod h1:qMc2E8cBAbQlRypBTBWHklNJlaZZJBwDv81B1Iu8oSI= +google.golang.org/genproto v0.0.0-20250115164207-1a7da9e5054f h1:387Y+JbxF52bmesc8kq1NyYIp33dnxCw6eiA7JMsTmw= +google.golang.org/genproto v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:0joYwWwLQh18AOj8zMYeZLjzuqcYTU3/nC5JdCvC3JI= +google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= +google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= +google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= @@ -322,25 +322,27 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.32.0 h1:OL9JpbvAU5ny9ga2fb24X8H6xQlVp+aJMFlgtQjR9CE= -k8s.io/api v0.32.0/go.mod h1:4LEwHZEf6Q/cG96F3dqR965sYOfmPM7rq81BLgsE0p0= -k8s.io/apiextensions-apiserver v0.32.0 h1:S0Xlqt51qzzqjKPxfgX1xh4HBZE+p8KKBq+k2SWNOE0= -k8s.io/apiextensions-apiserver v0.32.0/go.mod h1:86hblMvN5yxMvZrZFX2OhIHAuFIMJIZ19bTvzkP+Fmw= -k8s.io/apimachinery v0.32.0 h1:cFSE7N3rmEEtv4ei5X6DaJPHHX0C+upp+v5lVPiEwpg= -k8s.io/apimachinery v0.32.0/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.0 h1:DimtMcnN/JIKZcrSrstiwvvZvLjG0aSxy8PxN8IChp8= -k8s.io/client-go v0.32.0/go.mod h1:boDWvdM1Drk4NJj/VddSLnx59X3OPgwrOo0vGbtq9+8= +k8s.io/api v0.32.1 h1:f562zw9cy+GvXzXf0CKlVQ7yHJVYzLfL6JAS4kOAaOc= +k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k= +k8s.io/apiextensions-apiserver v0.32.1 h1:hjkALhRUeCariC8DiVmb5jj0VjIc1N0DREP32+6UXZw= +k8s.io/apiextensions-apiserver v0.32.1/go.mod h1:sxWIGuGiYov7Io1fAS2X06NjMIk5CbRHc2StSmbaQto= +k8s.io/apimachinery v0.32.1 h1:683ENpaCBjma4CYqsmZyhEzrGz6cjn1MY/X2jB2hkZs= +k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.32.1 h1:otM0AxdhdBIaQh7l1Q0jQpmo7WOFIk5FFa4bg6YMdUU= +k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 h1:hcha5B1kVACrLujCKLbr8XWMxCxzQx42DY8QKYJrDLg= k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7/go.mod h1:GewRfANuJ70iYzvn+i4lezLDAFzvjxZYK1gn1lWcfas= k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/controller-runtime v0.19.3 h1:XO2GvC9OPftRst6xWCpTgBZO04S2cbp0Qqkj8bX1sPw= -sigs.k8s.io/controller-runtime v0.19.3/go.mod h1:j4j87DqtsThvwTv5/Tc5NFRyyF/RF0ip4+62tbTSIUM= +sigs.k8s.io/controller-runtime v0.19.4 h1:SUmheabttt0nx8uJtoII4oIP27BVVvAKFvdvGFwV/Qo= +sigs.k8s.io/controller-runtime v0.19.4/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk= sigs.k8s.io/structured-merge-diff/v4 v4.5.0/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +xipher.org/xipher v1.9.0 h1:dLh9WJG6EgITfaKFghQsNqSAJt5oLyqtKRkQYJz+WCM= +xipher.org/xipher v1.9.0/go.mod h1:z7oGg1snIZvLO+rFDWDY82N8ngzeMdV0ooC+jELYNDA= diff --git a/internal/cli/commands/cmdenv/add.go b/internal/cli/commands/cmdenv/add.go index c94a128..3b94725 100644 --- a/internal/cli/commands/cmdenv/add.go +++ b/internal/cli/commands/cmdenv/add.go @@ -11,50 +11,49 @@ import ( ) func envAddCommand() *cobra.Command { - if envAddCmd != nil { - return envAddCmd - } - envAddCmd = &cobra.Command{ - Use: "add", - Aliases: []string{"set", "put", "store", "a"}, - Short: "Adds an environment to the current profile", - Run: func(cmd *cobra.Command, args []string) { - envdefs, err := cmd.Flags().GetStringSlice(envDefFlag.Name) - if err != nil { - utils.ExitOnError(err) - } - profile, err := profiles.GetDefaultProfile() - if err != nil { - utils.ExitOnError(err) - } - setAsRoot, _ := cmd.Flags().GetBool(envSetRootFlag.Name) - if setAsRoot && len(envdefs) > 1 { - utils.ExitOnError(fmt.Errorf("cannot set more than one environment as root")) - } - var successMessage string - for _, envdef := range envdefs { - var env *environments.Environment - if env, err = environments.FromEnvDef(envdef); err == nil && env != nil { - if setAsRoot { - err = profile.SetRoot(env) - successMessage = fmt.Sprintf("Successfully set %s as root environment for profile %s", color.GreenString(env.Name), color.GreenString(profile.Name())) - } else { - err = profile.PutEnv(env) - } + if envAddCmd == nil { + envAddCmd = &cobra.Command{ + Use: "add", + Aliases: []string{"set", "put", "store", "a"}, + Short: "Adds an environment to the current profile", + Run: func(cmd *cobra.Command, args []string) { + envdefs, err := cmd.Flags().GetStringSlice(envDefFlag.Name) + if err != nil { + utils.ExitOnError(err) } + profile, err := profiles.GetDefaultProfile() if err != nil { utils.ExitOnError(err) } - } - if successMessage == "" { - successMessage = fmt.Sprintf("Successfully added %d environments to profile %s", len(envdefs), color.GreenString(profile.Name())) - } - fmt.Println(successMessage) - utils.SafeExit() - }, + setAsRoot, _ := cmd.Flags().GetBool(envSetRootFlag.Name) + if setAsRoot && len(envdefs) > 1 { + utils.ExitOnError(fmt.Errorf("cannot set more than one environment as root")) + } + var successMessage string + for _, envdef := range envdefs { + var env *environments.Environment + if env, err = environments.FromEnvDef(envdef); err == nil && env != nil { + if setAsRoot { + err = profile.SetRoot(env) + successMessage = fmt.Sprintf("Successfully set %s as root environment for profile %s", color.GreenString(env.Name), color.GreenString(profile.Name())) + } else { + err = profile.PutEnv(env) + } + } + if err != nil { + utils.ExitOnError(err) + } + } + if successMessage == "" { + successMessage = fmt.Sprintf("Successfully added %d environments to profile %s", len(envdefs), color.GreenString(profile.Name())) + } + fmt.Println(successMessage) + utils.SafeExit() + }, + } + envAddCmd.Flags().StringSliceP(envDefFlag.Name, envDefFlag.Shorthand, []string{}, envDefFlag.Usage) + envAddCmd.Flags().Bool(envSetRootFlag.Name, false, envSetRootFlag.Usage) + envAddCmd.MarkFlagRequired(envDefFlag.Name) } - envAddCmd.Flags().StringSliceP(envDefFlag.Name, envDefFlag.Shorthand, []string{}, envDefFlag.Usage) - envAddCmd.Flags().Bool(envSetRootFlag.Name, false, envSetRootFlag.Usage) - envAddCmd.MarkFlagRequired(envDefFlag.Name) return envAddCmd } diff --git a/internal/cli/commands/cmdenv/commons.go b/internal/cli/commands/cmdenv/commons.go index 78ce107..4246437 100644 --- a/internal/cli/commands/cmdenv/commons.go +++ b/internal/cli/commands/cmdenv/commons.go @@ -24,11 +24,8 @@ func GetPublicKeys(cmd *cobra.Command, root, pq bool) (publicKeys []*crypto.Publ shareWithSelf, _ := cmd.Flags().GetBool(EnvSelfFlag.Name) shareWithK8s, _ := cmd.Flags().GetBool(EnvK8sFlag.Name) if len(publicKeyStrings) == 0 && len(queries) == 0 && !shareWithSelf && !shareWithK8s { - return nil, fmt.Errorf("Specify atleast one of the following flags:\n" + - " --" + EnvSearchFlag.Name + " [search keyword]\n" + - " --" + EnvPublicKeysFlag.Name + " [env public key]\n" + - " --" + EnvSelfFlag.Name + "\n" + - " --" + EnvK8sFlag.Name) + return nil, fmt.Errorf("specify at least one of the following flags:\n --%s [search keyword]\n --%s [env public key]\n --%s\n --%s", + EnvSearchFlag.Name, EnvPublicKeysFlag.Name, EnvSelfFlag.Name, EnvK8sFlag.Name) } for _, pubKeyStr := range publicKeyStrings { publicKey, err := crypto.PublicKeyFromString(pubKeyStr) diff --git a/internal/cli/commands/cmdenv/const.go b/internal/cli/commands/cmdenv/const.go index 6a121db..d778418 100644 --- a/internal/cli/commands/cmdenv/const.go +++ b/internal/cli/commands/cmdenv/const.go @@ -6,7 +6,6 @@ import ( ) var ( - // Commands envCmd *cobra.Command envNewCmd *cobra.Command envNewServiceCmd *cobra.Command @@ -22,8 +21,6 @@ var ( ) var ( - // Flags - envNameFlag = utils.FlagDef{ Name: "name", Shorthand: "n", diff --git a/internal/cli/commands/cmdenv/delete.go b/internal/cli/commands/cmdenv/delete.go index 6881ebe..0134b12 100644 --- a/internal/cli/commands/cmdenv/delete.go +++ b/internal/cli/commands/cmdenv/delete.go @@ -10,51 +10,50 @@ import ( ) func envDeleteCommand() *cobra.Command { - if envDeleteCmd != nil { - return envDeleteCmd - } - envDeleteCmd = &cobra.Command{ - Use: "del", - Aliases: []string{"delete", "rm", "remove"}, - Short: "Deletes an environment from current profile", - Run: func(cmd *cobra.Command, args []string) { - profile, err := profiles.GetDefaultProfile() - if err != nil { - utils.ExitOnError(err) - } - queries, err := cmd.Flags().GetStringSlice(EnvSearchFlag.Name) - if err != nil { - utils.ExitOnError(err) - } - envs, err := profile.SearchEnvs(queries) - if err != nil { - utils.ExitOnError(err) - } - if envs != nil { - for _, env := range envs { - ShowEnv(*env, false, false) - fmt.Println() + if envDeleteCmd == nil { + envDeleteCmd = &cobra.Command{ + Use: "del", + Aliases: []string{"delete", "rm", "remove"}, + Short: "Deletes an environment from current profile", + Run: func(cmd *cobra.Command, args []string) { + profile, err := profiles.GetDefaultProfile() + if err != nil { + utils.ExitOnError(err) + } + queries, err := cmd.Flags().GetStringSlice(EnvSearchFlag.Name) + if err != nil { + utils.ExitOnError(err) } - confirm, err := input.GetConfirmation("Are you sure you wish to delete the above environment(s) [yes/no]: ", "yes") + envs, err := profile.SearchEnvs(queries) if err != nil { utils.ExitOnError(err) } - if confirm { + if envs != nil { for _, env := range envs { - if profile.DeleteEnv(env.PublicKey); err != nil { - utils.ExitOnError(err) + ShowEnv(*env, false, false) + fmt.Println() + } + confirm, err := input.GetConfirmation("Are you sure you wish to delete the above environment(s) [yes/no]: ", "yes") + if err != nil { + utils.ExitOnError(err) + } + if confirm { + for _, env := range envs { + if profile.DeleteEnv(env.PublicKey); err != nil { + utils.ExitOnError(err) + } + fmt.Printf("Environment %s deleted successfully\n", env.Name) } - fmt.Printf("Environment %s deleted successfully\n", env.Name) } } - } - utils.SafeExit() - }, + utils.SafeExit() + }, + } + envDeleteCmd.Flags().StringSliceP(EnvSearchFlag.Name, EnvSearchFlag.Shorthand, []string{}, EnvSearchFlag.Usage) + envDeleteCmd.Flags().StringSliceP(EnvPublicKeysFlag.Name, EnvPublicKeysFlag.Shorthand, []string{}, EnvPublicKeysFlag.Usage) + envDeleteCmd.Flags().BoolP(EnvSelfFlag.Name, EnvSelfFlag.Shorthand, false, EnvSelfFlag.Usage) + envDeleteCmd.Flags().BoolP(EnvK8sFlag.Name, EnvK8sFlag.Shorthand, false, EnvK8sFlag.Usage) + envDeleteCmd.Flags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage) } - envDeleteCmd.Flags().StringSliceP(EnvSearchFlag.Name, EnvSearchFlag.Shorthand, []string{}, EnvSearchFlag.Usage) - envDeleteCmd.Flags().StringSliceP(EnvPublicKeysFlag.Name, EnvPublicKeysFlag.Shorthand, []string{}, EnvPublicKeysFlag.Usage) - envDeleteCmd.Flags().BoolP(EnvSelfFlag.Name, EnvSelfFlag.Shorthand, false, EnvSelfFlag.Usage) - envDeleteCmd.Flags().BoolP(EnvK8sFlag.Name, EnvK8sFlag.Shorthand, false, EnvK8sFlag.Usage) - envDeleteCmd.Flags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage) return envDeleteCmd } diff --git a/internal/cli/commands/cmdenv/env.go b/internal/cli/commands/cmdenv/env.go index 46731ac..39f065e 100644 --- a/internal/cli/commands/cmdenv/env.go +++ b/internal/cli/commands/cmdenv/env.go @@ -5,23 +5,22 @@ import ( ) func EnvCommand() *cobra.Command { - if envCmd != nil { - return envCmd + if envCmd == nil { + envCmd = &cobra.Command{ + Use: "env", + Aliases: []string{"envs", "environment", "environments"}, + Short: "Environment operations", + Long: `Environment operations in SLV`, + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + envCmd.AddCommand(envNewCommand()) + envCmd.AddCommand(envAddCommand()) + envCmd.AddCommand(envListSearchCommand()) + envCmd.AddCommand(envDeleteCommand()) + envCmd.AddCommand(envSetSelfCommand()) + envCmd.AddCommand(envShowCommand()) } - envCmd = &cobra.Command{ - Use: "env", - Aliases: []string{"envs", "environment", "environments"}, - Short: "Environment operations", - Long: `Environment operations in SLV`, - Run: func(cmd *cobra.Command, args []string) { - cmd.Help() - }, - } - envCmd.AddCommand(envNewCommand()) - envCmd.AddCommand(envAddCommand()) - envCmd.AddCommand(envListSearchCommand()) - envCmd.AddCommand(envDeleteCommand()) - envCmd.AddCommand(envSetSelfCommand()) - envCmd.AddCommand(envShowCommand()) return envCmd } diff --git a/internal/cli/commands/cmdenv/new.go b/internal/cli/commands/cmdenv/new.go index c7c6da9..4a8e737 100644 --- a/internal/cli/commands/cmdenv/new.go +++ b/internal/cli/commands/cmdenv/new.go @@ -14,144 +14,141 @@ import ( ) func envNewCommand() *cobra.Command { - if envNewCmd != nil { - return envNewCmd + if envNewCmd == nil { + envNewCmd = &cobra.Command{ + Use: "new", + Short: "Create a new environment", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + envNewCmd.PersistentFlags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage) + envNewCmd.AddCommand(envNewServiceCommand()) + envNewCmd.AddCommand(envNewUserCommand()) } - envNewCmd = &cobra.Command{ - Use: "new", - Short: "Create a new environment", - Run: func(cmd *cobra.Command, args []string) { - cmd.Help() - }, - } - envNewCmd.PersistentFlags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage) - envNewCmd.AddCommand(envNewServiceCommand()) - envNewCmd.AddCommand(envNewUserCommand()) return envNewCmd } func envNewServiceCommand() *cobra.Command { - if envNewServiceCmd != nil { - return envNewServiceCmd - } - envNewServiceCmd = &cobra.Command{ - Use: "service", - Aliases: []string{"serv", "svc", "s"}, - Short: "Creates a new service environment", - Run: func(cmd *cobra.Command, args []string) { - name, _ := cmd.Flags().GetString(envNameFlag.Name) - email, _ := cmd.Flags().GetString(envEmailFlag.Name) - tags, err := cmd.Flags().GetStringSlice(envTagsFlag.Name) - if err != nil { - utils.ExitOnError(err) - } - var env *environments.Environment - var secretKey *crypto.SecretKey - pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) - env, secretKey, err = environments.NewEnvironment(name, environments.SERVICE, pq) - if err != nil { - utils.ExitOnError(err) - } - env.SetEmail(email) - env.AddTags(tags...) - ShowEnv(*env, true, false) - if secretKey != nil { - fmt.Println("\nSecret Key:\t", color.HiBlackString(secretKey.String())) - } - addToProfileFlag, _ := cmd.Flags().GetBool(envAddFlag.Name) - if addToProfileFlag { - profile, err := profiles.GetDefaultProfile() + if envNewServiceCmd == nil { + envNewServiceCmd = &cobra.Command{ + Use: "service", + Aliases: []string{"serv", "svc", "s"}, + Short: "Creates a new service environment", + Run: func(cmd *cobra.Command, args []string) { + name, _ := cmd.Flags().GetString(envNameFlag.Name) + email, _ := cmd.Flags().GetString(envEmailFlag.Name) + tags, err := cmd.Flags().GetStringSlice(envTagsFlag.Name) if err != nil { utils.ExitOnError(err) } - err = profile.PutEnv(env) + var env *environments.Environment + var secretKey *crypto.SecretKey + pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) + env, secretKey, err = environments.NewEnvironment(name, environments.SERVICE, pq) if err != nil { utils.ExitOnError(err) } - } - utils.SafeExit() - }, + env.SetEmail(email) + env.AddTags(tags...) + ShowEnv(*env, true, false) + if secretKey != nil { + fmt.Println("\nSecret Key:\t", color.HiBlackString(secretKey.String())) + } + addToProfileFlag, _ := cmd.Flags().GetBool(envAddFlag.Name) + if addToProfileFlag { + profile, err := profiles.GetDefaultProfile() + if err != nil { + utils.ExitOnError(err) + } + err = profile.PutEnv(env) + if err != nil { + utils.ExitOnError(err) + } + } + utils.SafeExit() + }, + } + envNewServiceCmd.Flags().StringP(envNameFlag.Name, envNameFlag.Shorthand, "", envNameFlag.Usage) + envNewServiceCmd.Flags().StringP(envEmailFlag.Name, envEmailFlag.Shorthand, "", envEmailFlag.Usage) + envNewServiceCmd.Flags().StringSliceP(envTagsFlag.Name, envTagsFlag.Shorthand, []string{}, envTagsFlag.Usage) + envNewServiceCmd.Flags().BoolP(envAddFlag.Name, envAddFlag.Shorthand, false, envAddFlag.Usage) + envNewServiceCmd.MarkFlagRequired(envNameFlag.Name) + envNewServiceCmd.AddCommand(newKMSEnvCommand("aws", "Create a service environment for AWS KMS", awsARNFlag)) + envNewServiceCmd.AddCommand(newKMSEnvCommand("gcp", "Create a service environment for GCP KMS", gcpKmsResNameFlag)) } - envNewServiceCmd.Flags().StringP(envNameFlag.Name, envNameFlag.Shorthand, "", envNameFlag.Usage) - envNewServiceCmd.Flags().StringP(envEmailFlag.Name, envEmailFlag.Shorthand, "", envEmailFlag.Usage) - envNewServiceCmd.Flags().StringSliceP(envTagsFlag.Name, envTagsFlag.Shorthand, []string{}, envTagsFlag.Usage) - envNewServiceCmd.Flags().BoolP(envAddFlag.Name, envAddFlag.Shorthand, false, envAddFlag.Usage) - envNewServiceCmd.MarkFlagRequired(envNameFlag.Name) - envNewServiceCmd.AddCommand(newKMSEnvCommand("aws", "Create a service environment for AWS KMS", awsARNFlag)) - envNewServiceCmd.AddCommand(newKMSEnvCommand("gcp", "Create a service environment for GCP KMS", gcpKmsResNameFlag)) return envNewServiceCmd } func envNewUserCommand() *cobra.Command { - if envNewUserCmd != nil { - return envNewUserCmd - } - envNewUserCmd = &cobra.Command{ - Use: "self", - Aliases: []string{"user", "usr", "u"}, - Short: "Register as a new user environment", - Run: func(cmd *cobra.Command, args []string) { - selfEnv := environments.GetSelf() - if selfEnv != nil { - ShowEnv(*selfEnv, true, true) - confirmed, err := input.GetConfirmation("You are already registered as an environment, "+ - "this will replace the existing environment. Proceed? (yes/no): ", "yes") + if envNewUserCmd == nil { + envNewUserCmd = &cobra.Command{ + Use: "self", + Aliases: []string{"user", "usr", "u"}, + Short: "Register as a new user environment", + Run: func(cmd *cobra.Command, args []string) { + selfEnv := environments.GetSelf() + if selfEnv != nil { + ShowEnv(*selfEnv, true, true) + confirmed, err := input.GetConfirmation("You are already registered as an environment, "+ + "this will replace the existing environment. Proceed? (yes/no): ", "yes") + if err != nil { + utils.ExitOnError(err) + } + if !confirmed { + fmt.Println(color.YellowString("Operation aborted")) + utils.SafeExit() + } + } + envName, _ := cmd.Flags().GetString(envNameFlag.Name) + envEmail, _ := cmd.Flags().GetString(envEmailFlag.Name) + envTags, err := cmd.Flags().GetStringSlice(envTagsFlag.Name) if err != nil { utils.ExitOnError(err) } - if !confirmed { - fmt.Println(color.YellowString("Operation aborted")) - utils.SafeExit() - } - } - envName, _ := cmd.Flags().GetString(envNameFlag.Name) - envEmail, _ := cmd.Flags().GetString(envEmailFlag.Name) - envTags, err := cmd.Flags().GetStringSlice(envTagsFlag.Name) - if err != nil { - utils.ExitOnError(err) - } - inputs := make(map[string][]byte) - password, err := input.NewPasswordFromUser(input.DefaultPasswordPolicy()) - if err != nil { - utils.ExitOnError(err) - } - inputs["password"] = password - var env *environments.Environment - pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) - env, err = providers.NewEnvForProvider("password", envName, environments.USER, inputs, pq) - if err != nil { - utils.ExitOnError(err) - } - env.SetEmail(envEmail) - env.AddTags(envTags...) - if err = env.MarkAsSelf(); err != nil { - utils.ExitOnError(err) - } - secretBinding := env.SecretBinding - ShowEnv(*env, true, true) - addToProfileFlag, _ := cmd.Flags().GetBool(envAddFlag.Name) - if addToProfileFlag { - profile, err := profiles.GetDefaultProfile() + inputs := make(map[string][]byte) + password, err := input.NewPasswordFromUser(input.DefaultPasswordPolicy()) if err != nil { utils.ExitOnError(err) } - err = profile.PutEnv(env) + inputs["password"] = password + var env *environments.Environment + pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) + env, err = providers.NewEnvForProvider("password", envName, environments.USER, inputs, pq) if err != nil { utils.ExitOnError(err) } - } - fmt.Println(color.GreenString("Successfully registered as self environment")) - if secretBinding != "" { - fmt.Println(color.YellowString("Please note down the \"Secret Binding\" somewhere safe so that you don't lose it.\n" + - "It is required to access your registered environment.")) - } - utils.SafeExit() - }, + env.SetEmail(envEmail) + env.AddTags(envTags...) + if err = env.MarkAsSelf(); err != nil { + utils.ExitOnError(err) + } + secretBinding := env.SecretBinding + ShowEnv(*env, true, true) + addToProfileFlag, _ := cmd.Flags().GetBool(envAddFlag.Name) + if addToProfileFlag { + profile, err := profiles.GetDefaultProfile() + if err != nil { + utils.ExitOnError(err) + } + err = profile.PutEnv(env) + if err != nil { + utils.ExitOnError(err) + } + } + fmt.Println(color.GreenString("Successfully registered as self environment")) + if secretBinding != "" { + fmt.Println(color.YellowString("Please note down the \"Secret Binding\" somewhere safe so that you don't lose it.\n" + + "It is required to access your registered environment.")) + } + utils.SafeExit() + }, + } + envNewUserCmd.Flags().StringP(envNameFlag.Name, envNameFlag.Shorthand, "", envNameFlag.Usage) + envNewUserCmd.Flags().StringP(envEmailFlag.Name, envEmailFlag.Shorthand, "", envEmailFlag.Usage) + envNewUserCmd.Flags().StringSliceP(envTagsFlag.Name, envTagsFlag.Shorthand, []string{}, envTagsFlag.Usage) + envNewUserCmd.Flags().BoolP(envAddFlag.Name, envAddFlag.Shorthand, false, envAddFlag.Usage) + envNewUserCmd.MarkFlagRequired(envNameFlag.Name) } - envNewUserCmd.Flags().StringP(envNameFlag.Name, envNameFlag.Shorthand, "", envNameFlag.Usage) - envNewUserCmd.Flags().StringP(envEmailFlag.Name, envEmailFlag.Shorthand, "", envEmailFlag.Usage) - envNewUserCmd.Flags().StringSliceP(envTagsFlag.Name, envTagsFlag.Shorthand, []string{}, envTagsFlag.Usage) - envNewUserCmd.Flags().BoolP(envAddFlag.Name, envAddFlag.Shorthand, false, envAddFlag.Usage) - envNewUserCmd.MarkFlagRequired(envNameFlag.Name) return envNewUserCmd } diff --git a/internal/cli/commands/cmdenv/searchlist.go b/internal/cli/commands/cmdenv/searchlist.go index 3153a4b..931b89b 100644 --- a/internal/cli/commands/cmdenv/searchlist.go +++ b/internal/cli/commands/cmdenv/searchlist.go @@ -10,38 +10,37 @@ import ( ) func envListSearchCommand() *cobra.Command { - if envListSearchCmd != nil { - return envListSearchCmd + if envListSearchCmd == nil { + envListSearchCmd = &cobra.Command{ + Use: "get", + Aliases: []string{"list", "ls", "search", "find"}, + Short: "List/Search environments from profile", + Run: func(cmd *cobra.Command, args []string) { + profile, err := profiles.GetDefaultProfile() + if err != nil { + utils.ExitOnError(err) + } + queries, err := cmd.Flags().GetStringSlice(EnvSearchFlag.Name) + if err != nil { + utils.ExitOnError(err) + } + var envs []*environments.Environment + if len(queries) == 0 { + envs, err = profile.ListEnvs() + } else { + envs, err = profile.SearchEnvs(queries) + } + if err != nil { + utils.ExitOnError(err) + } + for _, env := range envs { + ShowEnv(*env, false, false) + fmt.Println() + } + utils.SafeExit() + }, + } + envListSearchCmd.Flags().StringSliceP(EnvSearchFlag.Name, EnvSearchFlag.Shorthand, []string{}, EnvSearchFlag.Usage) } - envListSearchCmd = &cobra.Command{ - Use: "get", - Aliases: []string{"list", "ls", "search", "find"}, - Short: "List/Search environments from profile", - Run: func(cmd *cobra.Command, args []string) { - profile, err := profiles.GetDefaultProfile() - if err != nil { - utils.ExitOnError(err) - } - queries, err := cmd.Flags().GetStringSlice(EnvSearchFlag.Name) - if err != nil { - utils.ExitOnError(err) - } - var envs []*environments.Environment - if len(queries) == 0 { - envs, err = profile.ListEnvs() - } else { - envs, err = profile.SearchEnvs(queries) - } - if err != nil { - utils.ExitOnError(err) - } - for _, env := range envs { - ShowEnv(*env, false, false) - fmt.Println() - } - utils.SafeExit() - }, - } - envListSearchCmd.Flags().StringSliceP(EnvSearchFlag.Name, EnvSearchFlag.Shorthand, []string{}, EnvSearchFlag.Usage) return envListSearchCmd } diff --git a/internal/cli/commands/cmdenv/set.go b/internal/cli/commands/cmdenv/set.go index 155b15e..caf1e95 100644 --- a/internal/cli/commands/cmdenv/set.go +++ b/internal/cli/commands/cmdenv/set.go @@ -11,37 +11,36 @@ import ( ) func envSetSelfCommand() *cobra.Command { - if envSetSelfSCmd != nil { - return envSetSelfSCmd - } - envSetSelfSCmd = &cobra.Command{ - Use: "set-self", - Aliases: []string{"self-set", "register-self", "self-register", "register"}, - Short: "Sets a given environment as self", - Run: func(cmd *cobra.Command, args []string) { - envDef := cmd.Flag(envDefFlag.Name).Value.String() - env, err := environments.FromEnvDef(envDef) - if err != nil { - utils.ExitOnError(err) - } - if env.EnvType != environments.USER { - utils.ExitOnError(fmt.Errorf("only user environments can be registered as self")) - } - if env.SecretBinding == "" { - secretBinding, err := input.GetVisibleInput("Enter the secret binding: ") + if envSetSelfSCmd == nil { + envSetSelfSCmd = &cobra.Command{ + Use: "set-self", + Aliases: []string{"self-set", "register-self", "self-register", "register"}, + Short: "Sets a given environment as self", + Run: func(cmd *cobra.Command, args []string) { + envDef := cmd.Flag(envDefFlag.Name).Value.String() + env, err := environments.FromEnvDef(envDef) if err != nil { utils.ExitOnError(err) } - env.SecretBinding = secretBinding - } - if err = env.MarkAsSelf(); err != nil { - utils.ExitOnError(err) - } - ShowEnv(*env, true, true) - fmt.Println(color.GreenString("Successfully registered self environment")) - }, + if env.EnvType != environments.USER { + utils.ExitOnError(fmt.Errorf("only user environments can be registered as self")) + } + if env.SecretBinding == "" { + secretBinding, err := input.GetVisibleInput("Enter the secret binding: ") + if err != nil { + utils.ExitOnError(err) + } + env.SecretBinding = secretBinding + } + if err = env.MarkAsSelf(); err != nil { + utils.ExitOnError(err) + } + ShowEnv(*env, true, true) + fmt.Println(color.GreenString("Successfully registered self environment")) + }, + } + envSetSelfSCmd.Flags().StringP(envDefFlag.Name, envDefFlag.Shorthand, "", envDefFlag.Usage) + envSetSelfSCmd.MarkFlagRequired(envDefFlag.Name) } - envSetSelfSCmd.Flags().StringP(envDefFlag.Name, envDefFlag.Shorthand, "", envDefFlag.Usage) - envSetSelfSCmd.MarkFlagRequired(envDefFlag.Name) return envSetSelfSCmd } diff --git a/internal/cli/commands/cmdenv/show.go b/internal/cli/commands/cmdenv/show.go index 36c1d6d..da1a35f 100644 --- a/internal/cli/commands/cmdenv/show.go +++ b/internal/cli/commands/cmdenv/show.go @@ -38,103 +38,99 @@ func ShowEnv(env environments.Environment, includeEDS, excludeBindingFromEds boo } func envShowCommand() *cobra.Command { - if envShowCmd != nil { - return envShowCmd - } - envShowCmd = &cobra.Command{ - Use: "show", - Aliases: []string{"desc", "describe", "view", "display"}, - Short: "Shows the requested environment", - Run: func(cmd *cobra.Command, args []string) { - cmd.Help() - }, + if envShowCmd == nil { + envShowCmd = &cobra.Command{ + Use: "show", + Aliases: []string{"desc", "describe", "view", "display"}, + Short: "Shows the requested environment", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + envShowCmd.AddCommand(envShowRootCommand()) + envShowCmd.AddCommand(envShowSelfCommand()) + envShowCmd.AddCommand(envShowK8sCommand()) } - envShowCmd.AddCommand(envShowRootCommand()) - envShowCmd.AddCommand(envShowSelfCommand()) - envShowCmd.AddCommand(envShowK8sCommand()) return envShowCmd } func envShowRootCommand() *cobra.Command { - if envShowRootCmd != nil { - return envShowRootCmd - } - envShowRootCmd = &cobra.Command{ - Use: "root", - Short: "Shows the current root environment from the profile if registered", - Run: func(cmd *cobra.Command, args []string) { - profile, err := profiles.GetDefaultProfile() - if err != nil { - utils.ExitOnError(err) - } - env, err := profile.GetRoot() - if err != nil { - utils.ExitOnError(err) - } - if env == nil { - fmt.Println("No environment registered as root.") - } else { - ShowEnv(*env, true, false) - } - }, + if envShowRootCmd == nil { + envShowRootCmd = &cobra.Command{ + Use: "root", + Short: "Shows the current root environment from the profile if registered", + Run: func(cmd *cobra.Command, args []string) { + profile, err := profiles.GetDefaultProfile() + if err != nil { + utils.ExitOnError(err) + } + env, err := profile.GetRoot() + if err != nil { + utils.ExitOnError(err) + } + if env == nil { + fmt.Println("No environment registered as root.") + } else { + ShowEnv(*env, true, false) + } + }, + } } return envShowRootCmd } func envShowSelfCommand() *cobra.Command { - if envShowSelfCmd != nil { - return envShowSelfCmd - } - envShowSelfCmd = &cobra.Command{ - Use: "self", - Aliases: []string{"user", "me", "my", "current"}, - Short: "Shows the current user environment if registered in the host", - Run: func(cmd *cobra.Command, args []string) { - env := environments.GetSelf() - if env == nil { - fmt.Println("No environment registered as self.") - } else { - ShowEnv(*env, true, true) - } - }, + if envShowSelfCmd == nil { + envShowSelfCmd = &cobra.Command{ + Use: "self", + Aliases: []string{"user", "me", "my", "current"}, + Short: "Shows the current user environment if registered in the host", + Run: func(cmd *cobra.Command, args []string) { + env := environments.GetSelf() + if env == nil { + fmt.Println("No environment registered as self.") + } else { + ShowEnv(*env, true, true) + } + }, + } } return envShowSelfCmd } func envShowK8sCommand() *cobra.Command { - if envShowK8sCmd != nil { - return envShowK8sCmd - } - envShowK8sCmd = &cobra.Command{ - Use: "k8s", - Aliases: []string{"k8s-cluster"}, - Short: "Shows the environment registered with the accessible k8s cluster", - Run: func(cmd *cobra.Command, args []string) { - name, address, user, err := k8sutils.GetClusterInfo() - if err != nil { - utils.ExitOnError(err) - } - pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) - pk, err := k8sutils.GetPublicKeyFromK8s(config.AppNameLowerCase, pq) - if err != nil { - utils.ExitOnError(err) - } - var env *environments.Environment - profile, err := profiles.GetDefaultProfile() - if err == nil { - env, _ = profile.GetEnv(pk) - } - if env == nil { - fmt.Printf("Public Key: %s\n", pk) - } else { - ShowEnv(*env, false, false) - } - fmt.Println("\nK8s Cluster Info:") - fmt.Printf("Name : %s\n", name) - fmt.Printf("Address: %s\n", address) - fmt.Printf("User : %s\n", user) - }, + if envShowK8sCmd == nil { + envShowK8sCmd = &cobra.Command{ + Use: "k8s", + Aliases: []string{"k8s-cluster"}, + Short: "Shows the environment registered with the accessible k8s cluster", + Run: func(cmd *cobra.Command, args []string) { + name, address, user, err := k8sutils.GetClusterInfo() + if err != nil { + utils.ExitOnError(err) + } + pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) + pk, err := k8sutils.GetPublicKeyFromK8s(config.AppNameLowerCase, pq) + if err != nil { + utils.ExitOnError(err) + } + var env *environments.Environment + profile, err := profiles.GetDefaultProfile() + if err == nil { + env, _ = profile.GetEnv(pk) + } + if env == nil { + fmt.Printf("Public Key: %s\n", pk) + } else { + ShowEnv(*env, false, false) + } + fmt.Println("\nK8s Cluster Info:") + fmt.Printf("Name : %s\n", name) + fmt.Printf("Address: %s\n", address) + fmt.Printf("User : %s\n", user) + }, + } + envShowK8sCmd.Flags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage) } - envShowK8sCmd.Flags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage) return envShowK8sCmd } diff --git a/internal/cli/commands/cmdprofile/commons.go b/internal/cli/commands/cmdprofile/commons.go index 8228aac..7071a3e 100644 --- a/internal/cli/commands/cmdprofile/commons.go +++ b/internal/cli/commands/cmdprofile/commons.go @@ -6,7 +6,6 @@ import ( ) var ( - // Commands profileCmd *cobra.Command profileNewCmd *cobra.Command profileListCmd *cobra.Command diff --git a/internal/cli/commands/cmdprofile/default.go b/internal/cli/commands/cmdprofile/default.go index 07222d0..3136140 100644 --- a/internal/cli/commands/cmdprofile/default.go +++ b/internal/cli/commands/cmdprofile/default.go @@ -10,30 +10,29 @@ import ( ) func profileDefaultCommand() *cobra.Command { - if profileSetCmd != nil { - return profileSetCmd - } - profileSetCmd = &cobra.Command{ - Use: "set", - Aliases: []string{"set-default", "default"}, - Short: "Set a profile as default", - Run: func(cmd *cobra.Command, args []string) { - profileNames, err := profiles.List() - if err != nil { - utils.ExitOnError(err) - } - name, _ := cmd.Flags().GetString(profileNameFlag.Name) - for _, profileName := range profileNames { - if profileName == name { - profiles.SetDefault(name) - fmt.Printf("Successfully set %s as default profile\n", color.GreenString(name)) - utils.SafeExit() + if profileSetCmd == nil { + profileSetCmd = &cobra.Command{ + Use: "set", + Aliases: []string{"set-default", "default"}, + Short: "Set a profile as default", + Run: func(cmd *cobra.Command, args []string) { + profileNames, err := profiles.List() + if err != nil { + utils.ExitOnError(err) + } + name, _ := cmd.Flags().GetString(profileNameFlag.Name) + for _, profileName := range profileNames { + if profileName == name { + profiles.SetDefault(name) + fmt.Printf("Successfully set %s as default profile\n", color.GreenString(name)) + utils.SafeExit() + } } - } - utils.ExitOnError(fmt.Errorf("profile %s not found", name)) - }, + utils.ExitOnError(fmt.Errorf("profile %s not found", name)) + }, + } + profileSetCmd.Flags().StringP(profileNameFlag.Name, profileNameFlag.Shorthand, "", profileNameFlag.Usage) + profileSetCmd.MarkFlagRequired(profileNameFlag.Name) } - profileSetCmd.Flags().StringP(profileNameFlag.Name, profileNameFlag.Shorthand, "", profileNameFlag.Usage) - profileSetCmd.MarkFlagRequired(profileNameFlag.Name) return profileSetCmd } diff --git a/internal/cli/commands/cmdprofile/delete.go b/internal/cli/commands/cmdprofile/delete.go index fde09d6..4a55609 100644 --- a/internal/cli/commands/cmdprofile/delete.go +++ b/internal/cli/commands/cmdprofile/delete.go @@ -10,24 +10,23 @@ import ( ) func profileDeleteCommand() *cobra.Command { - if profileDelCmd != nil { - return profileDelCmd + if profileDelCmd == nil { + profileDelCmd = &cobra.Command{ + Use: "delete", + Aliases: []string{"del", "rm", "remove"}, + Short: "Deletes a profile", + Run: func(cmd *cobra.Command, args []string) { + name, _ := cmd.Flags().GetString(profileNameFlag.Name) + if err := profiles.Delete(name); err != nil { + utils.ExitOnError(err) + } else { + fmt.Println("Deleted profile: ", color.GreenString(name)) + utils.SafeExit() + } + }, + } + profileDelCmd.Flags().StringP(profileNameFlag.Name, profileNameFlag.Shorthand, "", profileNameFlag.Usage) + profileDelCmd.MarkFlagRequired(profileNameFlag.Name) } - profileDelCmd = &cobra.Command{ - Use: "delete", - Aliases: []string{"del", "rm", "remove"}, - Short: "Deletes a profile", - Run: func(cmd *cobra.Command, args []string) { - name, _ := cmd.Flags().GetString(profileNameFlag.Name) - if err := profiles.Delete(name); err != nil { - utils.ExitOnError(err) - } else { - fmt.Println("Deleted profile: ", color.GreenString(name)) - utils.SafeExit() - } - }, - } - profileDelCmd.Flags().StringP(profileNameFlag.Name, profileNameFlag.Shorthand, "", profileNameFlag.Usage) - profileDelCmd.MarkFlagRequired(profileNameFlag.Name) return profileDelCmd } diff --git a/internal/cli/commands/cmdprofile/list.go b/internal/cli/commands/cmdprofile/list.go index 859ad56..71979b3 100644 --- a/internal/cli/commands/cmdprofile/list.go +++ b/internal/cli/commands/cmdprofile/list.go @@ -10,27 +10,26 @@ import ( ) func profileListCommand() *cobra.Command { - if profileListCmd != nil { - return profileListCmd - } - profileListCmd = &cobra.Command{ - Use: "list", - Short: "Lists all profiles", - Run: func(cmd *cobra.Command, args []string) { - profileNames, err := profiles.List() - if err != nil { - utils.ExitOnError(err) - } else { - defaultProfileName, _ := profiles.GetDefaultProfileName() - for _, profileName := range profileNames { - if profileName == defaultProfileName { - fmt.Println("*", color.GreenString(profileName)) - } else { - fmt.Println(" ", profileName) + if profileListCmd == nil { + profileListCmd = &cobra.Command{ + Use: "list", + Short: "Lists all profiles", + Run: func(cmd *cobra.Command, args []string) { + profileNames, err := profiles.List() + if err != nil { + utils.ExitOnError(err) + } else { + defaultProfileName, _ := profiles.GetDefaultProfileName() + for _, profileName := range profileNames { + if profileName == defaultProfileName { + fmt.Println("*", color.GreenString(profileName)) + } else { + fmt.Println(" ", profileName) + } } } - } - }, + }, + } } return profileListCmd } diff --git a/internal/cli/commands/cmdprofile/new.go b/internal/cli/commands/cmdprofile/new.go index 65e05fd..b2ecd71 100644 --- a/internal/cli/commands/cmdprofile/new.go +++ b/internal/cli/commands/cmdprofile/new.go @@ -10,28 +10,27 @@ import ( ) func profileNewCommand() *cobra.Command { - if profileNewCmd != nil { - return profileNewCmd + if profileNewCmd == nil { + profileNewCmd = &cobra.Command{ + Use: "new", + Short: "Creates a new profile", + Run: func(cmd *cobra.Command, args []string) { + name, _ := cmd.Flags().GetString(profileNameFlag.Name) + gitURI, _ := cmd.Flags().GetString(profileGitURI.Name) + gitBranch, _ := cmd.Flags().GetString(profileGitBranch.Name) + err := profiles.New(name, gitURI, gitBranch) + if err == nil { + fmt.Println("Created profile: ", color.GreenString(name)) + utils.SafeExit() + } else { + utils.ExitOnError(err) + } + }, + } + profileNewCmd.Flags().StringP(profileNameFlag.Name, profileNameFlag.Shorthand, "", profileNameFlag.Usage) + profileNewCmd.Flags().StringP(profileGitURI.Name, profileGitURI.Shorthand, "", profileGitURI.Usage) + profileNewCmd.Flags().StringP(profileGitBranch.Name, profileGitBranch.Shorthand, "", profileGitBranch.Usage) + profileNewCmd.MarkFlagRequired(profileNameFlag.Name) } - profileNewCmd = &cobra.Command{ - Use: "new", - Short: "Creates a new profile", - Run: func(cmd *cobra.Command, args []string) { - name, _ := cmd.Flags().GetString(profileNameFlag.Name) - gitURI, _ := cmd.Flags().GetString(profileGitURI.Name) - gitBranch, _ := cmd.Flags().GetString(profileGitBranch.Name) - err := profiles.New(name, gitURI, gitBranch) - if err == nil { - fmt.Println("Created profile: ", color.GreenString(name)) - utils.SafeExit() - } else { - utils.ExitOnError(err) - } - }, - } - profileNewCmd.Flags().StringP(profileNameFlag.Name, profileNameFlag.Shorthand, "", profileNameFlag.Usage) - profileNewCmd.Flags().StringP(profileGitURI.Name, profileGitURI.Shorthand, "", profileGitURI.Usage) - profileNewCmd.Flags().StringP(profileGitBranch.Name, profileGitBranch.Shorthand, "", profileGitBranch.Usage) - profileNewCmd.MarkFlagRequired(profileNameFlag.Name) return profileNewCmd } diff --git a/internal/cli/commands/cmdprofile/profile.go b/internal/cli/commands/cmdprofile/profile.go index eda8b8d..baa73a2 100644 --- a/internal/cli/commands/cmdprofile/profile.go +++ b/internal/cli/commands/cmdprofile/profile.go @@ -5,23 +5,22 @@ import ( ) func ProfileCommand() *cobra.Command { - if profileCmd != nil { - return profileCmd + if profileCmd == nil { + profileCmd = &cobra.Command{ + Use: "profile", + Aliases: []string{"profiles"}, + Short: "Manage profiles and components within them", + Long: `Profile management along with environments and preferences within profiles are handled in this command`, + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + profileCmd.AddCommand(profileNewCommand()) + profileCmd.AddCommand(profileDefaultCommand()) + profileCmd.AddCommand(profileListCommand()) + profileCmd.AddCommand(profileDeleteCommand()) + profileCmd.AddCommand(profilePullCommand()) + profileCmd.AddCommand(profilePushCommand()) } - profileCmd = &cobra.Command{ - Use: "profile", - Aliases: []string{"profiles"}, - Short: "Manage profiles and components within them", - Long: `Profile management along with environments and preferences within profiles are handled in this command`, - Run: func(cmd *cobra.Command, args []string) { - cmd.Help() - }, - } - profileCmd.AddCommand(profileNewCommand()) - profileCmd.AddCommand(profileDefaultCommand()) - profileCmd.AddCommand(profileListCommand()) - profileCmd.AddCommand(profileDeleteCommand()) - profileCmd.AddCommand(profilePullCommand()) - profileCmd.AddCommand(profilePushCommand()) return profileCmd } diff --git a/internal/cli/commands/cmdprofile/sync.go b/internal/cli/commands/cmdprofile/sync.go index 6057659..6613db1 100644 --- a/internal/cli/commands/cmdprofile/sync.go +++ b/internal/cli/commands/cmdprofile/sync.go @@ -10,44 +10,42 @@ import ( ) func profilePullCommand() *cobra.Command { - if profilePullCmd != nil { - return profilePullCmd - } - profilePullCmd = &cobra.Command{ - Use: "pull", - Aliases: []string{"sync"}, - Short: "Pulls the latest changes for the current profile from remote repository", - Run: func(cmd *cobra.Command, args []string) { - profile, err := profiles.GetDefaultProfile() - if err != nil { - utils.ExitOnError(err) - } - if err = profile.Pull(); err != nil { - utils.ExitOnError(err) - } - fmt.Printf("Successfully pulled changes into profile: %s\n", color.GreenString(profile.Name())) - }, + if profilePullCmd == nil { + profilePullCmd = &cobra.Command{ + Use: "pull", + Aliases: []string{"sync"}, + Short: "Pulls the latest changes for the current profile from remote repository", + Run: func(cmd *cobra.Command, args []string) { + profile, err := profiles.GetDefaultProfile() + if err != nil { + utils.ExitOnError(err) + } + if err = profile.Pull(); err != nil { + utils.ExitOnError(err) + } + fmt.Printf("Successfully pulled changes into profile: %s\n", color.GreenString(profile.Name())) + }, + } } return profilePullCmd } func profilePushCommand() *cobra.Command { - if profilePushCmd != nil { - return profilePushCmd - } - profilePushCmd = &cobra.Command{ - Use: "push", - Short: "Pushes the changes in the current profile to the pre-configured remote repository", - Run: func(cmd *cobra.Command, args []string) { - profile, err := profiles.GetDefaultProfile() - if err != nil { - utils.ExitOnError(err) - } - if err = profile.Push(); err != nil { - utils.ExitOnError(err) - } - fmt.Printf("Successfully pushed changes from profile: %s\n", color.GreenString(profile.Name())) - }, + if profilePushCmd == nil { + profilePushCmd = &cobra.Command{ + Use: "push", + Short: "Pushes the changes in the current profile to the pre-configured remote repository", + Run: func(cmd *cobra.Command, args []string) { + profile, err := profiles.GetDefaultProfile() + if err != nil { + utils.ExitOnError(err) + } + if err = profile.Push(); err != nil { + utils.ExitOnError(err) + } + fmt.Printf("Successfully pushed changes from profile: %s\n", color.GreenString(profile.Name())) + }, + } } return profilePushCmd } diff --git a/internal/cli/commands/cmdsystem/commons.go b/internal/cli/commands/cmdsystem/commons.go index bacb7da..d6ac96e 100644 --- a/internal/cli/commands/cmdsystem/commons.go +++ b/internal/cli/commands/cmdsystem/commons.go @@ -11,7 +11,6 @@ var ( ) var ( - // Common Flags yesFlag = utils.FlagDef{ Name: "yes", Shorthand: "y", diff --git a/internal/cli/commands/cmdsystem/reset.go b/internal/cli/commands/cmdsystem/reset.go index 4ba6a17..7f501d4 100644 --- a/internal/cli/commands/cmdsystem/reset.go +++ b/internal/cli/commands/cmdsystem/reset.go @@ -13,40 +13,39 @@ import ( ) func systemResetCommand() *cobra.Command { - if systemResetCmd != nil { - return systemResetCmd - } - systemResetCmd = &cobra.Command{ - Use: "reset", - Aliases: []string{"reset", "pruge", "prune", "clean", "clear"}, - Short: "Reset the system", - Long: `Cleans all existing profiles and any other data`, - Run: func(cmd *cobra.Command, args []string) { - selfEnv := environments.GetSelf() - confirm, _ := cmd.Flags().GetBool(yesFlag.Name) - if !confirm || selfEnv != nil { - if selfEnv != nil { - fmt.Println(color.YellowString("You have a configured environment which you might have to consider backing up:")) - cmdenv.ShowEnv(*selfEnv, true, true) - } - var err error - if confirm, err = input.GetConfirmation("Are you sure you wish to proceed? (yes/no): ", "yes"); err != nil { - utils.ExitOnError(err) + if systemResetCmd == nil { + systemResetCmd = &cobra.Command{ + Use: "reset", + Aliases: []string{"reset", "pruge", "prune", "clean", "clear"}, + Short: "Reset the system", + Long: `Cleans all existing profiles and any other data`, + Run: func(cmd *cobra.Command, args []string) { + selfEnv := environments.GetSelf() + confirm, _ := cmd.Flags().GetBool(yesFlag.Name) + if !confirm || selfEnv != nil { + if selfEnv != nil { + fmt.Println(color.YellowString("You have a configured environment which you might have to consider backing up:")) + cmdenv.ShowEnv(*selfEnv, true, true) + } + var err error + if confirm, err = input.GetConfirmation("Are you sure you wish to proceed? (yes/no): ", "yes"); err != nil { + utils.ExitOnError(err) + } } - } - if confirm { - err := config.ResetAppDataDir() - if err == nil { - fmt.Println(color.GreenString("System reset successful")) + if confirm { + err := config.ResetAppDataDir() + if err == nil { + fmt.Println(color.GreenString("System reset successful")) + } else { + utils.ExitOnError(err) + } } else { - utils.ExitOnError(err) + fmt.Println(color.YellowString("System reset aborted")) } - } else { - fmt.Println(color.YellowString("System reset aborted")) - } - utils.SafeExit() - }, + utils.SafeExit() + }, + } + systemResetCmd.Flags().BoolP(yesFlag.Name, yesFlag.Shorthand, false, yesFlag.Usage) } - systemResetCmd.Flags().BoolP(yesFlag.Name, yesFlag.Shorthand, false, yesFlag.Usage) return systemResetCmd } diff --git a/internal/cli/commands/cmdsystem/system.go b/internal/cli/commands/cmdsystem/system.go index c0b0dc5..7061bf4 100644 --- a/internal/cli/commands/cmdsystem/system.go +++ b/internal/cli/commands/cmdsystem/system.go @@ -5,18 +5,17 @@ import ( ) func SystemCommand() *cobra.Command { - if systemCmd != nil { - return systemCmd + if systemCmd == nil { + systemCmd = &cobra.Command{ + Use: "system", + Aliases: []string{"systems"}, + Short: "System level commands", + Long: `System level operations can be carried out using this command`, + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + systemCmd.AddCommand(systemResetCommand()) } - systemCmd = &cobra.Command{ - Use: "system", - Aliases: []string{"systems"}, - Short: "System level commands", - Long: `System level operations can be carried out using this command`, - Run: func(cmd *cobra.Command, args []string) { - cmd.Help() - }, - } - systemCmd.AddCommand(systemResetCommand()) return systemCmd } diff --git a/internal/cli/commands/cmdvault/access.go b/internal/cli/commands/cmdvault/access.go index 69a2a8b..342e4a2 100644 --- a/internal/cli/commands/cmdvault/access.go +++ b/internal/cli/commands/cmdvault/access.go @@ -12,98 +12,95 @@ import ( ) func vaultAccessCommand() *cobra.Command { - if vaultAccessCmd != nil { - return vaultAccessCmd + if vaultAccessCmd == nil { + vaultAccessCmd = &cobra.Command{ + Use: "access", + Aliases: []string{"rights", "privilege", "permission", "permissions"}, + Short: "Managing access to a vault", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + vaultAccessCmd.PersistentFlags().StringSliceP(cmdenv.EnvPublicKeysFlag.Name, cmdenv.EnvPublicKeysFlag.Shorthand, []string{}, cmdenv.EnvPublicKeysFlag.Usage) + vaultAccessCmd.PersistentFlags().StringSliceP(cmdenv.EnvSearchFlag.Name, cmdenv.EnvSearchFlag.Shorthand, []string{}, cmdenv.EnvSearchFlag.Usage) + vaultAccessCmd.PersistentFlags().BoolP(cmdenv.EnvSelfFlag.Name, cmdenv.EnvSelfFlag.Shorthand, false, cmdenv.EnvSelfFlag.Usage) + vaultAccessCmd.PersistentFlags().BoolP(cmdenv.EnvK8sFlag.Name, cmdenv.EnvK8sFlag.Shorthand, false, cmdenv.EnvK8sFlag.Usage) + vaultAccessCmd.PersistentFlags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage+" (used with k8s environment)") + vaultAccessCmd.AddCommand(vaultAccessAddCommand()) + vaultAccessCmd.AddCommand(vaultAccessRemoveCommand()) } - vaultAccessCmd = &cobra.Command{ - Use: "access", - Aliases: []string{"rights", "privilege", "permission", "permissions"}, - Short: "Managing access to a vault", - Run: func(cmd *cobra.Command, args []string) { - cmd.Help() - }, - } - vaultAccessCmd.PersistentFlags().StringSliceP(cmdenv.EnvPublicKeysFlag.Name, cmdenv.EnvPublicKeysFlag.Shorthand, []string{}, cmdenv.EnvPublicKeysFlag.Usage) - vaultAccessCmd.PersistentFlags().StringSliceP(cmdenv.EnvSearchFlag.Name, cmdenv.EnvSearchFlag.Shorthand, []string{}, cmdenv.EnvSearchFlag.Usage) - vaultAccessCmd.PersistentFlags().BoolP(cmdenv.EnvSelfFlag.Name, cmdenv.EnvSelfFlag.Shorthand, false, cmdenv.EnvSelfFlag.Usage) - vaultAccessCmd.PersistentFlags().BoolP(cmdenv.EnvK8sFlag.Name, cmdenv.EnvK8sFlag.Shorthand, false, cmdenv.EnvK8sFlag.Usage) - vaultAccessCmd.PersistentFlags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage+" (used with k8s environment)") - vaultAccessCmd.AddCommand(vaultAccessAddCommand()) - vaultAccessCmd.AddCommand(vaultAccessRemoveCommand()) return vaultAccessCmd } func vaultAccessAddCommand() *cobra.Command { - if vaultAccessAddCmd != nil { - return vaultAccessAddCmd - } - vaultAccessAddCmd = &cobra.Command{ - Use: "add", - Aliases: []string{"allow", "grant", "share"}, - Short: "Adds access to a vault for the given environments/public keys", - Run: func(cmd *cobra.Command, args []string) { - envSecretKey, err := secretkey.Get() - if err != nil { - utils.ExitOnError(err) - } - vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() - k8sPQ, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) - publicKeys, err := cmdenv.GetPublicKeys(cmd, true, k8sPQ) - if err != nil { - utils.ExitOnError(err) - } - vault, err := getVault(vaultFile) - if err == nil { - err = vault.Unlock(envSecretKey) + if vaultAccessAddCmd == nil { + vaultAccessAddCmd = &cobra.Command{ + Use: "add", + Aliases: []string{"allow", "grant", "share"}, + Short: "Adds access to a vault for the given environments/public keys", + Run: func(cmd *cobra.Command, args []string) { + envSecretKey, err := secretkey.Get() + if err != nil { + utils.ExitOnError(err) + } + vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() + k8sPQ, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) + publicKeys, err := cmdenv.GetPublicKeys(cmd, true, k8sPQ) + if err != nil { + utils.ExitOnError(err) + } + vault, err := getVault(vaultFile) if err == nil { - for _, publicKey := range publicKeys { - if _, err = vault.Share(publicKey); err != nil { - break - } - } + err = vault.Unlock(envSecretKey) if err == nil { - fmt.Println("Shared vault:", color.GreenString(vaultFile)) - utils.SafeExit() + for _, publicKey := range publicKeys { + if _, err = vault.Share(publicKey); err != nil { + break + } + } + if err == nil { + fmt.Println("Shared vault:", color.GreenString(vaultFile)) + utils.SafeExit() + } } } - } - utils.ExitOnError(err) - }, + utils.ExitOnError(err) + }, + } } return vaultAccessAddCmd } func vaultAccessRemoveCommand() *cobra.Command { - if vaultAccessRemoveCmd != nil { - return vaultAccessRemoveCmd - } - vaultAccessRemoveCmd = &cobra.Command{ - Use: "remove", - Aliases: []string{"rm", "deny", "revoke", "restrict", "delete", "del"}, - Short: "Remove access to a vault for the given environments/public keys", - Run: func(cmd *cobra.Command, args []string) { - vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() - k8sPQ, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) - publicKeys, err := cmdenv.GetPublicKeys(cmd, false, k8sPQ) - if err != nil { - utils.ExitOnError(err) - } - vault, err := getVault(vaultFile) - if err == nil { - var envSecretKey *crypto.SecretKey - if envSecretKey, err = secretkey.Get(); err == nil { - err = vault.Unlock(envSecretKey) + if vaultAccessRemoveCmd == nil { + vaultAccessRemoveCmd = &cobra.Command{ + Use: "remove", + Aliases: []string{"rm", "deny", "revoke", "restrict", "delete", "del"}, + Short: "Remove access to a vault for the given environments/public keys", + Run: func(cmd *cobra.Command, args []string) { + vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() + k8sPQ, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) + publicKeys, err := cmdenv.GetPublicKeys(cmd, false, k8sPQ) + if err != nil { + utils.ExitOnError(err) } + vault, err := getVault(vaultFile) if err == nil { - pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) - if err = vault.Revoke(publicKeys, pq); err == nil { - fmt.Println("Shared vault:", color.GreenString(vaultFile)) - utils.SafeExit() + var envSecretKey *crypto.SecretKey + if envSecretKey, err = secretkey.Get(); err == nil { + err = vault.Unlock(envSecretKey) + } + if err == nil { + pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) + if err = vault.Revoke(publicKeys, pq); err == nil { + fmt.Println("Shared vault:", color.GreenString(vaultFile)) + utils.SafeExit() + } } } - } - utils.ExitOnError(err) - }, + utils.ExitOnError(err) + }, + } } return vaultAccessRemoveCmd } diff --git a/internal/cli/commands/cmdvault/const.go b/internal/cli/commands/cmdvault/const.go index 27d506c..bed43a8 100644 --- a/internal/cli/commands/cmdvault/const.go +++ b/internal/cli/commands/cmdvault/const.go @@ -16,7 +16,7 @@ var ( vaultPutCmd *cobra.Command vaultDeleteCmd *cobra.Command vaultGetCmd *cobra.Command - vaultShellCmd *cobra.Command + vaultRunCmd *cobra.Command vaultRefCmd *cobra.Command vaultDerefCmd *cobra.Command ) diff --git a/internal/cli/commands/cmdvault/delete.go b/internal/cli/commands/cmdvault/delete.go index bf5f57f..f725397 100644 --- a/internal/cli/commands/cmdvault/delete.go +++ b/internal/cli/commands/cmdvault/delete.go @@ -9,36 +9,35 @@ import ( ) func vaultDeleteCommand() *cobra.Command { - if vaultDeleteCmd != nil { - return vaultDeleteCmd - } - vaultDeleteCmd = &cobra.Command{ - Use: "rm", - Aliases: []string{"del", "remove", "delete", "destroy", "erase"}, - Short: "Removes secret from the vault", - Run: func(cmd *cobra.Command, args []string) { - vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() - vault, err := getVault(vaultFile) - if err != nil { - utils.ExitOnError(err) - } - secretNames, err := cmd.Flags().GetStringSlice(itemNameFlag.Name) - if err != nil { - utils.ExitOnError(err) - } - if len(secretNames) == 0 { - if err = vault.Delete(); err != nil { + if vaultDeleteCmd == nil { + vaultDeleteCmd = &cobra.Command{ + Use: "rm", + Aliases: []string{"del", "remove", "delete", "destroy", "erase"}, + Short: "Removes secret from the vault", + Run: func(cmd *cobra.Command, args []string) { + vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() + vault, err := getVault(vaultFile) + if err != nil { utils.ExitOnError(err) } - fmt.Printf(color.GreenString("Successfully deleted the vault: %s\n"), vaultFile) - } else { - if err = vault.DeleteItems(secretNames); err != nil { + secretNames, err := cmd.Flags().GetStringSlice(itemNameFlag.Name) + if err != nil { utils.ExitOnError(err) } - fmt.Printf(color.GreenString("Successfully deleted the secrets: %v from the vault: %s\n"), secretNames, vaultFile) - } - }, + if len(secretNames) == 0 { + if err = vault.Delete(); err != nil { + utils.ExitOnError(err) + } + fmt.Printf(color.GreenString("Successfully deleted the vault: %s\n"), vaultFile) + } else { + if err = vault.DeleteItems(secretNames); err != nil { + utils.ExitOnError(err) + } + fmt.Printf(color.GreenString("Successfully deleted the secrets: %v from the vault: %s\n"), secretNames, vaultFile) + } + }, + } + vaultDeleteCmd.Flags().StringSliceP(itemNameFlag.Name, itemNameFlag.Shorthand, []string{}, itemNameFlag.Usage) } - vaultDeleteCmd.Flags().StringSliceP(itemNameFlag.Name, itemNameFlag.Shorthand, []string{}, itemNameFlag.Usage) return vaultDeleteCmd } diff --git a/internal/cli/commands/cmdvault/deref.go b/internal/cli/commands/cmdvault/deref.go index e2d88b3..b63d96e 100644 --- a/internal/cli/commands/cmdvault/deref.go +++ b/internal/cli/commands/cmdvault/deref.go @@ -10,46 +10,45 @@ import ( ) func vaultDerefCommand() *cobra.Command { - if vaultDerefCmd != nil { - return vaultDerefCmd - } - vaultDerefCmd = &cobra.Command{ - Use: "deref", - Short: "Dereferences and updates secrets from a vault to a given yaml or json file", - Run: func(cmd *cobra.Command, args []string) { - envSecretKey, err := secretkey.Get() - if err != nil { - utils.ExitOnError(err) - } - vaultFiles, err := cmd.Flags().GetStringSlice(vaultFileFlag.Name) - if err != nil { - utils.ExitOnError(err) - } - paths, err := cmd.Flags().GetStringSlice(vaultDerefPathFlag.Name) - if err != nil { - utils.ExitOnError(err) - } - for _, vaultFile := range vaultFiles { - vault, err := getVault(vaultFile) + if vaultDerefCmd == nil { + vaultDerefCmd = &cobra.Command{ + Use: "deref", + Short: "Dereferences and updates secrets from a vault to a given yaml or json file", + Run: func(cmd *cobra.Command, args []string) { + envSecretKey, err := secretkey.Get() + if err != nil { + utils.ExitOnError(err) + } + vaultFiles, err := cmd.Flags().GetStringSlice(vaultFileFlag.Name) if err != nil { utils.ExitOnError(err) } - err = vault.Unlock(envSecretKey) + paths, err := cmd.Flags().GetStringSlice(vaultDerefPathFlag.Name) if err != nil { utils.ExitOnError(err) } - for _, path := range paths { - if err = vault.DeRefSecrets(path); err != nil { + for _, vaultFile := range vaultFiles { + vault, err := getVault(vaultFile) + if err != nil { utils.ExitOnError(err) } - fmt.Println("Dereferenced", color.GreenString(path), "with the vault", color.GreenString(vaultFile)) + err = vault.Unlock(envSecretKey) + if err != nil { + utils.ExitOnError(err) + } + for _, path := range paths { + if err = vault.DeRefSecrets(path); err != nil { + utils.ExitOnError(err) + } + fmt.Println("Dereferenced", color.GreenString(path), "with the vault", color.GreenString(vaultFile)) + } } - } - utils.SafeExit() - }, + utils.SafeExit() + }, + } + vaultDerefCmd.Flags().StringSliceP(vaultFileFlag.Name, vaultFileFlag.Shorthand, []string{}, vaultFileFlag.Usage) + vaultDerefCmd.Flags().StringSliceP(vaultDerefPathFlag.Name, vaultDerefPathFlag.Shorthand, []string{}, vaultDerefPathFlag.Usage) + vaultDerefCmd.MarkFlagRequired(vaultDerefPathFlag.Name) } - vaultDerefCmd.Flags().StringSliceP(vaultFileFlag.Name, vaultFileFlag.Shorthand, []string{}, vaultFileFlag.Usage) - vaultDerefCmd.Flags().StringSliceP(vaultDerefPathFlag.Name, vaultDerefPathFlag.Shorthand, []string{}, vaultDerefPathFlag.Usage) - vaultDerefCmd.MarkFlagRequired(vaultDerefPathFlag.Name) return vaultDerefCmd } diff --git a/internal/cli/commands/cmdvault/get.go b/internal/cli/commands/cmdvault/get.go index 44029b0..93858d4 100644 --- a/internal/cli/commands/cmdvault/get.go +++ b/internal/cli/commands/cmdvault/get.go @@ -62,71 +62,70 @@ func getDecryptedDataMap(vault *vaults.Vault, itemName string, encodeToBase64, w } func vaultGetCommand() *cobra.Command { - if vaultGetCmd != nil { - return vaultGetCmd - } - vaultGetCmd = &cobra.Command{ - Use: "get", - Aliases: []string{"show", "view", "read", "export", "dump"}, - Short: "Get a secret from the vault", - Run: func(cmd *cobra.Command, args []string) { - envSecretKey, err := secretkey.Get() - if err != nil { - utils.ExitOnError(err) - } - vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() - itemName := cmd.Flag(itemNameFlag.Name).Value.String() - vault, err := getVault(vaultFile) - if err != nil { - utils.ExitOnError(err) - } - err = vault.Unlock(envSecretKey) - if err != nil { - utils.ExitOnError(err) - } - encodeToBase64, _ := cmd.Flags().GetBool(valueEncodeBase64Flag.Name) - withMetadata, _ := cmd.Flags().GetBool(valueWithMetadata.Name) - exportFormat := cmd.Flag(vaultExportFormatFlag.Name).Value.String() - switch exportFormat { - case "json": - dataMap := getDecryptedDataMap(vault, itemName, encodeToBase64, withMetadata) - jsonData, err := json.MarshalIndent(dataMap, "", " ") + if vaultGetCmd == nil { + vaultGetCmd = &cobra.Command{ + Use: "get", + Aliases: []string{"show", "view", "read", "export", "dump"}, + Short: "Get a secret from the vault", + Run: func(cmd *cobra.Command, args []string) { + envSecretKey, err := secretkey.Get() if err != nil { utils.ExitOnError(err) } - fmt.Println(string(jsonData)) - case "yaml", "yml": - dataMap := getDecryptedDataMap(vault, itemName, encodeToBase64, withMetadata) - yamlData, err := yaml.Marshal(dataMap) + vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() + itemName := cmd.Flag(itemNameFlag.Name).Value.String() + vault, err := getVault(vaultFile) if err != nil { utils.ExitOnError(err) } - fmt.Println(string(yamlData)) - case "envars", "envar", "env", ".env": - dataMap := getDecryptedDataMap(vault, itemName, encodeToBase64, false) - for key, value := range dataMap { - strValue := value.(string) - strValue = strings.ReplaceAll(strValue, "\\", "\\\\") - strValue = strings.ReplaceAll(strValue, "\"", "\\\"") - fmt.Printf("%s=\"%s\"\n", key, strValue) + err = vault.Unlock(envSecretKey) + if err != nil { + utils.ExitOnError(err) } - default: - if itemName == "" { - showVaultData(vault) - } else { - if item, err := vault.Get(itemName); err != nil { + encodeToBase64, _ := cmd.Flags().GetBool(valueEncodeBase64Flag.Name) + withMetadata, _ := cmd.Flags().GetBool(valueWithMetadata.Name) + exportFormat := cmd.Flag(vaultExportFormatFlag.Name).Value.String() + switch exportFormat { + case "json": + dataMap := getDecryptedDataMap(vault, itemName, encodeToBase64, withMetadata) + jsonData, err := json.MarshalIndent(dataMap, "", " ") + if err != nil { utils.ExitOnError(err) + } + fmt.Println(string(jsonData)) + case "yaml", "yml": + dataMap := getDecryptedDataMap(vault, itemName, encodeToBase64, withMetadata) + yamlData, err := yaml.Marshal(dataMap) + if err != nil { + utils.ExitOnError(err) + } + fmt.Println(string(yamlData)) + case "envars", "envar", "env", ".env": + dataMap := getDecryptedDataMap(vault, itemName, encodeToBase64, false) + for key, value := range dataMap { + strValue := value.(string) + strValue = strings.ReplaceAll(strValue, "\\", "\\\\") + strValue = strings.ReplaceAll(strValue, "\"", "\\\"") + fmt.Printf("%s=\"%s\"\n", key, strValue) + } + default: + if itemName == "" { + showVaultData(vault) } else { - fmt.Println(string(item.Value())) + if item, err := vault.Get(itemName); err != nil { + utils.ExitOnError(err) + } else { + fmt.Println(string(item.Value())) + } } } - } - utils.SafeExit() - }, + utils.SafeExit() + }, + } + vaultGetCmd.Flags().StringP(itemNameFlag.Name, itemNameFlag.Shorthand, "", itemNameFlag.Usage) + vaultGetCmd.Flags().BoolP(valueEncodeBase64Flag.Name, valueEncodeBase64Flag.Shorthand, false, valueEncodeBase64Flag.Usage) + vaultGetCmd.Flags().BoolP(valueWithMetadata.Name, valueWithMetadata.Shorthand, false, valueWithMetadata.Usage) + vaultGetCmd.Flags().StringP(vaultExportFormatFlag.Name, vaultExportFormatFlag.Shorthand, "", vaultExportFormatFlag.Usage) } - vaultGetCmd.Flags().StringP(itemNameFlag.Name, itemNameFlag.Shorthand, "", itemNameFlag.Usage) - vaultGetCmd.Flags().BoolP(valueEncodeBase64Flag.Name, valueEncodeBase64Flag.Shorthand, false, valueEncodeBase64Flag.Usage) - vaultGetCmd.Flags().BoolP(valueWithMetadata.Name, valueWithMetadata.Shorthand, false, valueWithMetadata.Usage) - vaultGetCmd.Flags().StringP(vaultExportFormatFlag.Name, vaultExportFormatFlag.Shorthand, "", vaultExportFormatFlag.Usage) return vaultGetCmd } diff --git a/internal/cli/commands/cmdvault/k8s.go b/internal/cli/commands/cmdvault/k8s.go index 178c731..f4d7ff1 100644 --- a/internal/cli/commands/cmdvault/k8s.go +++ b/internal/cli/commands/cmdvault/k8s.go @@ -33,29 +33,28 @@ func newK8sVault(filePath, k8sName, k8sNamespace, k8sSecret string, hash, pq boo } func vaultToK8sCommand() *cobra.Command { - if vaultToK8sCmd != nil { - return vaultToK8sCmd - } - vaultToK8sCmd = &cobra.Command{ - Use: "tok8s", - Aliases: []string{"k8s", "tok8slv"}, - Short: "Transform an existing SLV vault file to a K8s compatible one", - Run: func(cmd *cobra.Command, args []string) { - vaultFilePath := cmd.Flag(vaultFileFlag.Name).Value.String() - name := cmd.Flag(vaultK8sNameFlag.Name).Value.String() - namespace := cmd.Flag(vaultK8sNamespaceFlag.Name).Value.String() - vault, err := getVault(vaultFilePath) - if err != nil { - utils.ExitOnError(err) - } - if err = vault.ToK8s(name, namespace, nil); err != nil { - utils.ExitOnError(err) - } - fmt.Printf("Vault %s transformed to K8s resource %s\n", color.GreenString(vaultFilePath), color.GreenString(name)) - }, + if vaultToK8sCmd == nil { + vaultToK8sCmd = &cobra.Command{ + Use: "tok8s", + Aliases: []string{"k8s", "tok8slv"}, + Short: "Transform an existing SLV vault file to a K8s compatible one", + Run: func(cmd *cobra.Command, args []string) { + vaultFilePath := cmd.Flag(vaultFileFlag.Name).Value.String() + name := cmd.Flag(vaultK8sNameFlag.Name).Value.String() + namespace := cmd.Flag(vaultK8sNamespaceFlag.Name).Value.String() + vault, err := getVault(vaultFilePath) + if err != nil { + utils.ExitOnError(err) + } + if err = vault.ToK8s(name, namespace, nil); err != nil { + utils.ExitOnError(err) + } + fmt.Printf("Vault %s transformed to K8s resource %s\n", color.GreenString(vaultFilePath), color.GreenString(name)) + }, + } + vaultToK8sCmd.Flags().StringP(vaultK8sNameFlag.Name, vaultK8sNameFlag.Shorthand, "", vaultK8sNameFlag.Usage) + vaultToK8sCmd.Flags().StringP(vaultK8sNamespaceFlag.Name, vaultK8sNamespaceFlag.Shorthand, "", vaultK8sNamespaceFlag.Usage) + vaultToK8sCmd.MarkFlagRequired(vaultK8sNameFlag.Name) } - vaultToK8sCmd.Flags().StringP(vaultK8sNameFlag.Name, vaultK8sNameFlag.Shorthand, "", vaultK8sNameFlag.Usage) - vaultToK8sCmd.Flags().StringP(vaultK8sNamespaceFlag.Name, vaultK8sNamespaceFlag.Shorthand, "", vaultK8sNamespaceFlag.Usage) - vaultToK8sCmd.MarkFlagRequired(vaultK8sNameFlag.Name) return vaultToK8sCmd } diff --git a/internal/cli/commands/cmdvault/new.go b/internal/cli/commands/cmdvault/new.go index 8c52768..f83caf9 100644 --- a/internal/cli/commands/cmdvault/new.go +++ b/internal/cli/commands/cmdvault/new.go @@ -10,38 +10,37 @@ import ( ) func vaultNewCommand() *cobra.Command { - if vaultNewCmd != nil { - return vaultNewCmd + if vaultNewCmd == nil { + vaultNewCmd = &cobra.Command{ + Use: "new", + Short: "Creates a new vault", + Run: func(cmd *cobra.Command, args []string) { + vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() + pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) + publicKeys, err := cmdenv.GetPublicKeys(cmd, true, pq) + if err != nil { + utils.ExitOnError(err) + } + enableHash, _ := cmd.Flags().GetBool(vaultEnableHashingFlag.Name) + k8sName := cmd.Flag(vaultK8sNameFlag.Name).Value.String() + k8sNamespace := cmd.Flag(vaultK8sNamespaceFlag.Name).Value.String() + k8sSecret := cmd.Flag(vaultK8sSecretFlag.Name).Value.String() + if _, err = newK8sVault(vaultFile, k8sName, k8sNamespace, k8sSecret, enableHash, pq, publicKeys...); err != nil { + utils.ExitOnError(err) + } + fmt.Println("Created vault:", color.GreenString(vaultFile)) + utils.SafeExit() + }, + } + vaultNewCmd.Flags().StringSliceP(cmdenv.EnvPublicKeysFlag.Name, cmdenv.EnvPublicKeysFlag.Shorthand, []string{}, cmdenv.EnvPublicKeysFlag.Usage) + vaultNewCmd.Flags().StringSliceP(cmdenv.EnvSearchFlag.Name, cmdenv.EnvSearchFlag.Shorthand, []string{}, cmdenv.EnvSearchFlag.Usage) + vaultNewCmd.Flags().BoolP(cmdenv.EnvSelfFlag.Name, cmdenv.EnvSelfFlag.Shorthand, false, cmdenv.EnvSelfFlag.Usage) + vaultNewCmd.Flags().BoolP(cmdenv.EnvK8sFlag.Name, cmdenv.EnvK8sFlag.Shorthand, false, cmdenv.EnvK8sFlag.Usage) + vaultNewCmd.Flags().StringP(vaultK8sNameFlag.Name, vaultK8sNameFlag.Shorthand, "", vaultK8sNameFlag.Usage) + vaultNewCmd.Flags().StringP(vaultK8sNamespaceFlag.Name, vaultK8sNamespaceFlag.Shorthand, "", vaultK8sNamespaceFlag.Usage) + vaultNewCmd.Flags().StringP(vaultK8sSecretFlag.Name, vaultK8sSecretFlag.Shorthand, "", vaultK8sSecretFlag.Usage) + vaultNewCmd.Flags().BoolP(vaultEnableHashingFlag.Name, vaultEnableHashingFlag.Shorthand, false, vaultEnableHashingFlag.Usage) + vaultNewCmd.Flags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage) } - vaultNewCmd = &cobra.Command{ - Use: "new", - Short: "Creates a new vault", - Run: func(cmd *cobra.Command, args []string) { - vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() - pq, _ := cmd.Flags().GetBool(utils.QuantumSafeFlag.Name) - publicKeys, err := cmdenv.GetPublicKeys(cmd, true, pq) - if err != nil { - utils.ExitOnError(err) - } - enableHash, _ := cmd.Flags().GetBool(vaultEnableHashingFlag.Name) - k8sName := cmd.Flag(vaultK8sNameFlag.Name).Value.String() - k8sNamespace := cmd.Flag(vaultK8sNamespaceFlag.Name).Value.String() - k8sSecret := cmd.Flag(vaultK8sSecretFlag.Name).Value.String() - if _, err = newK8sVault(vaultFile, k8sName, k8sNamespace, k8sSecret, enableHash, pq, publicKeys...); err != nil { - utils.ExitOnError(err) - } - fmt.Println("Created vault:", color.GreenString(vaultFile)) - utils.SafeExit() - }, - } - vaultNewCmd.Flags().StringSliceP(cmdenv.EnvPublicKeysFlag.Name, cmdenv.EnvPublicKeysFlag.Shorthand, []string{}, cmdenv.EnvPublicKeysFlag.Usage) - vaultNewCmd.Flags().StringSliceP(cmdenv.EnvSearchFlag.Name, cmdenv.EnvSearchFlag.Shorthand, []string{}, cmdenv.EnvSearchFlag.Usage) - vaultNewCmd.Flags().BoolP(cmdenv.EnvSelfFlag.Name, cmdenv.EnvSelfFlag.Shorthand, false, cmdenv.EnvSelfFlag.Usage) - vaultNewCmd.Flags().BoolP(cmdenv.EnvK8sFlag.Name, cmdenv.EnvK8sFlag.Shorthand, false, cmdenv.EnvK8sFlag.Usage) - vaultNewCmd.Flags().StringP(vaultK8sNameFlag.Name, vaultK8sNameFlag.Shorthand, "", vaultK8sNameFlag.Usage) - vaultNewCmd.Flags().StringP(vaultK8sNamespaceFlag.Name, vaultK8sNamespaceFlag.Shorthand, "", vaultK8sNamespaceFlag.Usage) - vaultNewCmd.Flags().StringP(vaultK8sSecretFlag.Name, vaultK8sSecretFlag.Shorthand, "", vaultK8sSecretFlag.Usage) - vaultNewCmd.Flags().BoolP(vaultEnableHashingFlag.Name, vaultEnableHashingFlag.Shorthand, false, vaultEnableHashingFlag.Usage) - vaultNewCmd.Flags().BoolP(utils.QuantumSafeFlag.Name, utils.QuantumSafeFlag.Shorthand, false, utils.QuantumSafeFlag.Usage) return vaultNewCmd } diff --git a/internal/cli/commands/cmdvault/put.go b/internal/cli/commands/cmdvault/put.go index 7cab961..a1f90ab 100644 --- a/internal/cli/commands/cmdvault/put.go +++ b/internal/cli/commands/cmdvault/put.go @@ -11,78 +11,77 @@ import ( ) func vaultPutCommand() *cobra.Command { - if vaultPutCmd != nil { - return vaultPutCmd - } - vaultPutCmd = &cobra.Command{ - Use: "put", - Aliases: []string{"add", "set", "create", "load", "import"}, - Short: "Adds secret to the vault", - Run: func(cmd *cobra.Command, args []string) { - vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() - itemName := cmd.Flag(itemNameFlag.Name).Value.String() - itemValue := cmd.Flag(itemValueFlag.Name).Value.String() - if itemValue == "" { - itemValue = cmd.Flag(itemValueFlagDeprecated.Name).Value.String() - } - importFile := cmd.Flag(vaultImportFileFlag.Name).Value.String() - plaintextValue, _ := cmd.Flags().GetBool(plaintextValueFlag.Name) - vault, err := getVault(vaultFile) - if err != nil { - utils.ExitOnError(err) - } - forceUpdate, _ := cmd.Flags().GetBool(secretForceUpdateFlag.Name) - if itemName != "" { - if !forceUpdate && vault.Exists(itemName) { - confirmation, err := input.GetVisibleInput("Secret already exists. Do you wish to overwrite it? (y/n): ") - if err != nil { - utils.ExitOnError(err) + if vaultPutCmd == nil { + vaultPutCmd = &cobra.Command{ + Use: "put", + Aliases: []string{"add", "set", "create", "load", "import"}, + Short: "Adds secret to the vault", + Run: func(cmd *cobra.Command, args []string) { + vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() + itemName := cmd.Flag(itemNameFlag.Name).Value.String() + itemValue := cmd.Flag(itemValueFlag.Name).Value.String() + if itemValue == "" { + itemValue = cmd.Flag(itemValueFlagDeprecated.Name).Value.String() + } + importFile := cmd.Flag(vaultImportFileFlag.Name).Value.String() + plaintextValue, _ := cmd.Flags().GetBool(plaintextValueFlag.Name) + vault, err := getVault(vaultFile) + if err != nil { + utils.ExitOnError(err) + } + forceUpdate, _ := cmd.Flags().GetBool(secretForceUpdateFlag.Name) + if itemName != "" { + if !forceUpdate && vault.Exists(itemName) { + confirmation, err := input.GetVisibleInput("Secret already exists. Do you wish to overwrite it? (y/n): ") + if err != nil { + utils.ExitOnError(err) + } + if confirmation != "y" { + fmt.Println(color.YellowString("Operation aborted")) + utils.SafeExit() + } } - if confirmation != "y" { - fmt.Println(color.YellowString("Operation aborted")) - utils.SafeExit() + var secret []byte + if itemValue == "" { + if secret, err = input.GetMultiLineHiddenInput("Enter the secret value for " + itemName + ": "); err != nil { + utils.ExitOnError(err) + } + } else if itemValue == "-" { + if secret, err = input.ReadBufferFromStdin(""); err != nil { + utils.ExitOnError(err) + } + } else { + secret = []byte(itemValue) } + if err = vault.Put(itemName, secret, !plaintextValue); err != nil { + utils.ExitOnError(err) + } + fmt.Println("Updated secret: ", color.GreenString(itemName), " to vault: ", color.GreenString(vaultFile)) } - var secret []byte - if itemValue == "" { - if secret, err = input.GetMultiLineHiddenInput("Enter the secret value for " + itemName + ": "); err != nil { + if importFile != "" || itemName == "" { + var importData []byte + if importFile == "" { + importData, err = input.GetMultiLineHiddenInput("Enter the YAML/JSON data to be imported: ") + } else { + importData, err = os.ReadFile(importFile) + } + if err != nil { utils.ExitOnError(err) } - } else if itemValue == "-" { - if secret, err = input.ReadBufferFromStdin(""); err != nil { + if err = vault.Import(importData, forceUpdate, true); err != nil { utils.ExitOnError(err) } - } else { - secret = []byte(itemValue) - } - if err = vault.Put(itemName, secret, !plaintextValue); err != nil { - utils.ExitOnError(err) - } - fmt.Println("Updated secret: ", color.GreenString(itemName), " to vault: ", color.GreenString(vaultFile)) - } - if importFile != "" || itemName == "" { - var importData []byte - if importFile == "" { - importData, err = input.GetMultiLineHiddenInput("Enter the YAML/JSON data to be imported: ") - } else { - importData, err = os.ReadFile(importFile) - } - if err != nil { - utils.ExitOnError(err) - } - if err = vault.Import(importData, forceUpdate, true); err != nil { - utils.ExitOnError(err) + fmt.Printf("Successfully imported secrets from %s into the vault %s\n", color.GreenString(importFile), color.GreenString(vaultFile)) } - fmt.Printf("Successfully imported secrets from %s into the vault %s\n", color.GreenString(importFile), color.GreenString(vaultFile)) - } - utils.SafeExit() - }, + utils.SafeExit() + }, + } + vaultPutCmd.Flags().StringP(itemNameFlag.Name, itemNameFlag.Shorthand, "", itemNameFlag.Usage) + vaultPutCmd.Flags().StringP(itemValueFlag.Name, itemValueFlag.Shorthand, "", itemValueFlag.Usage) + vaultPutCmd.Flags().StringP(itemValueFlagDeprecated.Name, itemValueFlagDeprecated.Shorthand, "", itemValueFlagDeprecated.Usage) + vaultPutCmd.Flags().StringP(vaultImportFileFlag.Name, vaultImportFileFlag.Shorthand, "", vaultImportFileFlag.Usage) + vaultPutCmd.Flags().Bool(plaintextValueFlag.Name, false, plaintextValueFlag.Usage) + vaultPutCmd.Flags().Bool(secretForceUpdateFlag.Name, false, secretForceUpdateFlag.Usage) } - vaultPutCmd.Flags().StringP(itemNameFlag.Name, itemNameFlag.Shorthand, "", itemNameFlag.Usage) - vaultPutCmd.Flags().StringP(itemValueFlag.Name, itemValueFlag.Shorthand, "", itemValueFlag.Usage) - vaultPutCmd.Flags().StringP(itemValueFlagDeprecated.Name, itemValueFlagDeprecated.Shorthand, "", itemValueFlagDeprecated.Usage) - vaultPutCmd.Flags().StringP(vaultImportFileFlag.Name, vaultImportFileFlag.Shorthand, "", vaultImportFileFlag.Usage) - vaultPutCmd.Flags().Bool(plaintextValueFlag.Name, false, plaintextValueFlag.Usage) - vaultPutCmd.Flags().Bool(secretForceUpdateFlag.Name, false, secretForceUpdateFlag.Usage) return vaultPutCmd } diff --git a/internal/cli/commands/cmdvault/ref.go b/internal/cli/commands/cmdvault/ref.go index 58aa390..6d410cf 100644 --- a/internal/cli/commands/cmdvault/ref.go +++ b/internal/cli/commands/cmdvault/ref.go @@ -10,49 +10,48 @@ import ( ) func vaultRefCommand() *cobra.Command { - if vaultRefCmd != nil { - return vaultRefCmd + if vaultRefCmd == nil { + vaultRefCmd = &cobra.Command{ + Use: "ref", + Aliases: []string{"reference"}, + Short: "References and updates secrets to a vault from a given yaml or json file", + Run: func(cmd *cobra.Command, args []string) { + vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() + vault, err := getVault(vaultFile) + if err != nil { + utils.ExitOnError(err) + } + refFile := cmd.Flag(vaultRefFileFlag.Name).Value.String() + secretNamePrefix := cmd.Flag(itemNameFlag.Name).Value.String() + refType := strings.ToLower(cmd.Flag(vaultRefTypeFlag.Name).Value.String()) + previewOnly, _ := cmd.Flags().GetBool(secretRefPreviewOnlyFlag.Name) + forceUpdate, _ := cmd.Flags().GetBool(secretForceUpdateFlag.Name) + if secretNamePrefix == "" && refType == "" { + utils.ExitOnErrorWithMessage("please provide at least one of --" + itemNameFlag.Name + " or --" + vaultRefTypeFlag.Name + " flag") + } + if refType != "" && refType != "yaml" { + utils.ExitOnErrorWithMessage("only yaml auto reference is supported at the moment") + } + result, conflicting, err := vault.RefSecrets(refType, refFile, secretNamePrefix, forceUpdate, true, previewOnly) + if conflicting { + utils.ExitOnErrorWithMessage("conflict found. please use the --" + itemNameFlag.Name + " flag to set a different name or --" + secretForceUpdateFlag.Name + " flag to overwrite them.") + } else if err != nil { + utils.ExitOnError(err) + } + if previewOnly { + fmt.Println(result) + } else { + fmt.Println("Auto referenced", color.GreenString(refFile), "with vault", color.GreenString(vaultFile)) + } + utils.SafeExit() + }, + } + vaultRefCmd.Flags().StringP(vaultRefFileFlag.Name, vaultRefFileFlag.Shorthand, "", vaultRefFileFlag.Usage) + vaultRefCmd.Flags().StringP(itemNameFlag.Name, itemNameFlag.Shorthand, "", itemNameFlag.Usage) + vaultRefCmd.Flags().StringP(vaultRefTypeFlag.Name, vaultRefTypeFlag.Shorthand, "", vaultRefTypeFlag.Usage) + vaultRefCmd.Flags().BoolP(secretRefPreviewOnlyFlag.Name, secretRefPreviewOnlyFlag.Shorthand, false, secretRefPreviewOnlyFlag.Usage) + vaultRefCmd.Flags().BoolP(secretForceUpdateFlag.Name, secretForceUpdateFlag.Shorthand, false, secretForceUpdateFlag.Usage) + vaultRefCmd.MarkFlagRequired(vaultRefFileFlag.Name) } - vaultRefCmd = &cobra.Command{ - Use: "ref", - Aliases: []string{"reference"}, - Short: "References and updates secrets to a vault from a given yaml or json file", - Run: func(cmd *cobra.Command, args []string) { - vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() - vault, err := getVault(vaultFile) - if err != nil { - utils.ExitOnError(err) - } - refFile := cmd.Flag(vaultRefFileFlag.Name).Value.String() - secretNamePrefix := cmd.Flag(itemNameFlag.Name).Value.String() - refType := strings.ToLower(cmd.Flag(vaultRefTypeFlag.Name).Value.String()) - previewOnly, _ := cmd.Flags().GetBool(secretRefPreviewOnlyFlag.Name) - forceUpdate, _ := cmd.Flags().GetBool(secretForceUpdateFlag.Name) - if secretNamePrefix == "" && refType == "" { - utils.ExitOnErrorWithMessage("please provide at least one of --" + itemNameFlag.Name + " or --" + vaultRefTypeFlag.Name + " flag") - } - if refType != "" && refType != "yaml" { - utils.ExitOnErrorWithMessage("only yaml auto reference is supported at the moment") - } - result, conflicting, err := vault.RefSecrets(refType, refFile, secretNamePrefix, forceUpdate, true, previewOnly) - if conflicting { - utils.ExitOnErrorWithMessage("conflict found. please use the --" + itemNameFlag.Name + " flag to set a different name or --" + secretForceUpdateFlag.Name + " flag to overwrite them.") - } else if err != nil { - utils.ExitOnError(err) - } - if previewOnly { - fmt.Println(result) - } else { - fmt.Println("Auto referenced", color.GreenString(refFile), "with vault", color.GreenString(vaultFile)) - } - utils.SafeExit() - }, - } - vaultRefCmd.Flags().StringP(vaultRefFileFlag.Name, vaultRefFileFlag.Shorthand, "", vaultRefFileFlag.Usage) - vaultRefCmd.Flags().StringP(itemNameFlag.Name, itemNameFlag.Shorthand, "", itemNameFlag.Usage) - vaultRefCmd.Flags().StringP(vaultRefTypeFlag.Name, vaultRefTypeFlag.Shorthand, "", vaultRefTypeFlag.Usage) - vaultRefCmd.Flags().BoolP(secretRefPreviewOnlyFlag.Name, secretRefPreviewOnlyFlag.Shorthand, false, secretRefPreviewOnlyFlag.Usage) - vaultRefCmd.Flags().BoolP(secretForceUpdateFlag.Name, secretForceUpdateFlag.Shorthand, false, secretForceUpdateFlag.Usage) - vaultRefCmd.MarkFlagRequired(vaultRefFileFlag.Name) return vaultRefCmd } diff --git a/internal/cli/commands/cmdvault/run.go b/internal/cli/commands/cmdvault/run.go new file mode 100644 index 0000000..18aedbb --- /dev/null +++ b/internal/cli/commands/cmdvault/run.go @@ -0,0 +1,126 @@ +package cmdvault + +import ( + "fmt" + "os" + "os/exec" + "runtime" + "strings" + "syscall" + + "github.com/fatih/color" + "github.com/spf13/cobra" + "oss.amagi.com/slv/internal/cli/commands/utils" + "oss.amagi.com/slv/internal/core/config" + "oss.amagi.com/slv/internal/core/secretkey" +) + +func execVaultCommand(vaultFile, prefix, command string) { + shell := false + if command == "" { + shell = true + command = os.Getenv("SHELL") + if command == "" { + if runtime.GOOS == "windows" { + command = "cmd" + } else { + utils.ExitOnErrorWithMessage("Not a supported shell") + } + } + } + commandArr := strings.Fields(command) + if len(commandArr) == 1 { + runVaultCommand(shell, vaultFile, prefix, commandArr[0]) + } else { + runVaultCommand(shell, vaultFile, prefix, commandArr[0], commandArr[1:]...) + } +} + +func runVaultCommand(shell bool, vaultFile, prefix, command string, args ...string) { + vault, err := getVault(vaultFile) + if err != nil { + utils.ExitOnError(err) + } + envSecretKey, err := secretkey.Get() + if err != nil { + utils.ExitOnError(err) + } + err = vault.Unlock(envSecretKey) + if err != nil { + utils.ExitOnError(err) + } + secrets, err := vault.List(true) + if err != nil { + utils.ExitOnError(err) + } + slvShell := exec.Command(command, args...) + for _, envar := range os.Environ() { + if !strings.HasPrefix(envar, "SLV_ENV_SECRET_") { + slvShell.Env = append(slvShell.Env, envar) + } + } + for name, data := range secrets { + if prefix != "" { + name = prefix + name + } + slvShell.Env = append(slvShell.Env, name+"="+string(data.Value())) + } + slvShell.Stdin = os.Stdin + slvShell.Stdout = os.Stdout + slvShell.Stderr = os.Stderr + fullCommand := command + if len(args) > 0 { + fullCommand += " " + strings.Join(args, " ") + } + if shell { + fmt.Printf("Initializing %s session with secrets loaded into environment variables from the vault %s...\n", + config.AppNameUpperCase, color.CyanString(vaultFile)) + } else { + fmt.Printf("Running command [%s] with secrets loaded into environment variables from the vault %s...\n", + color.CyanString(fullCommand), color.CyanString(vaultFile)) + } + if prefix != "" { + fmt.Printf("Please note that the secret names are prefixed with %s\n", color.CyanString(prefix)) + } + if err = slvShell.Run(); err != nil { + if exitError, ok := err.(*exec.ExitError); ok { + if status, ok := exitError.Sys().(syscall.WaitStatus); ok { + if shell { + fmt.Printf(color.RedString("%s session for the vault %s terminated with exit code %d\n"), config.AppNameUpperCase, vaultFile, status.ExitStatus()) + } else { + fmt.Printf(color.RedString("Command [%s] terminated with exit code %d\n"), fullCommand, status.ExitStatus()) + } + os.Exit(status.ExitStatus()) + } + } else { + utils.ExitOnError(err) + } + } else if shell { + fmt.Printf("%s session for the vault %s ended successfully\n", config.AppNameUpperCase, color.CyanString(vaultFile)) + } else { + fmt.Printf("Command [%s] ended successfully\n", color.CyanString(fullCommand)) + } +} + +func vaultRunCommand() *cobra.Command { + if vaultRunCmd == nil { + vaultRunCmd = &cobra.Command{ + Use: "run", + Aliases: []string{"shell", "session", "venv", "vitualenv"}, + Short: "Opens a shell with the vault items loaded as environment variables [optinally run a command]", + Run: func(cmd *cobra.Command, args []string) { + vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() + command := cmd.Flag(vaultShellCommandFlag.Name).Value.String() + prefix := cmd.Flag(varNamePrefixFlag.Name).Value.String() + if len(args) > 0 { + runVaultCommand(false, vaultFile, prefix, args[0], args[1:]...) + } else { + execVaultCommand(vaultFile, prefix, command) + } + }, + } + vaultRunCmd.Flags().StringP(varNamePrefixFlag.Name, varNamePrefixFlag.Shorthand, "", varNamePrefixFlag.Usage) + vaultRunCmd.Flags().StringP(vaultShellCommandFlag.Name, vaultShellCommandFlag.Shorthand, "", vaultShellCommandFlag.Usage) + } + return vaultRunCmd +} diff --git a/internal/cli/commands/cmdvault/shell.go b/internal/cli/commands/cmdvault/shell.go deleted file mode 100644 index 2bde137..0000000 --- a/internal/cli/commands/cmdvault/shell.go +++ /dev/null @@ -1,103 +0,0 @@ -package cmdvault - -import ( - "fmt" - "os" - "os/exec" - "runtime" - "strings" - "syscall" - - "github.com/fatih/color" - "github.com/spf13/cobra" - "oss.amagi.com/slv/internal/cli/commands/utils" - "oss.amagi.com/slv/internal/core/config" - "oss.amagi.com/slv/internal/core/secretkey" -) - -func execVaultShellCommand(vaultFile, prefix, command string) { - if command == "" { - command = os.Getenv("SHELL") - if command == "" { - if runtime.GOOS == "windows" { - command = "cmd" - } else { - utils.ExitOnErrorWithMessage("Not a supported shell") - } - } - } - vault, err := getVault(vaultFile) - if err != nil { - utils.ExitOnError(err) - } - envSecretKey, err := secretkey.Get() - if err != nil { - utils.ExitOnError(err) - } - err = vault.Unlock(envSecretKey) - if err != nil { - utils.ExitOnError(err) - } - secrets, err := vault.List(true) - if err != nil { - utils.ExitOnError(err) - } - commandArr := strings.Fields(command) - var slvShell *exec.Cmd - if len(commandArr) == 1 { - slvShell = exec.Command(commandArr[0]) - } else { - slvShell = exec.Command(commandArr[0], commandArr[1:]...) - } - for _, envar := range os.Environ() { - if !strings.HasPrefix(envar, "SLV_ENV_SECRET_") { - slvShell.Env = append(slvShell.Env, envar) - } - } - for name, data := range secrets { - if prefix != "" { - name = prefix + name - } - slvShell.Env = append(slvShell.Env, name+"="+string(data.Value())) - } - slvShell.Stdin = os.Stdin - slvShell.Stdout = os.Stdout - slvShell.Stderr = os.Stderr - fmt.Printf("Initializing %s session with secrets loaded into environment variables from the vault %s...\n", - config.AppNameUpperCase, color.CyanString(vaultFile)) - if prefix != "" { - fmt.Printf("Please note that the secret names are prefixed with %s\n", color.CyanString(prefix)) - } - if err = slvShell.Run(); err != nil { - if exitError, ok := err.(*exec.ExitError); ok { - if status, ok := exitError.Sys().(syscall.WaitStatus); ok { - fmt.Printf(color.RedString("%s session for the vault %s terminated with exit code %d\n"), config.AppNameUpperCase, vaultFile, status.ExitStatus()) - os.Exit(status.ExitStatus()) - } - } else { - utils.ExitOnError(err) - } - } else { - fmt.Printf("%s session for the vault %s has been closed\n", config.AppNameUpperCase, color.CyanString(vaultFile)) - } -} - -func vaultShellCommand() *cobra.Command { - if vaultShellCmd != nil { - return vaultShellCmd - } - vaultShellCmd = &cobra.Command{ - Use: "shell", - Aliases: []string{"session", "sh", "venv", "vitualenv"}, - Short: "Opens a shell with the vault items loaded as environment variables [optinally run a command]", - Run: func(cmd *cobra.Command, args []string) { - vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() - command := cmd.Flag(vaultShellCommandFlag.Name).Value.String() - prefix := cmd.Flag(varNamePrefixFlag.Name).Value.String() - execVaultShellCommand(vaultFile, prefix, command) - }, - } - vaultShellCmd.Flags().StringP(varNamePrefixFlag.Name, varNamePrefixFlag.Shorthand, "", varNamePrefixFlag.Usage) - vaultShellCmd.Flags().StringP(vaultShellCommandFlag.Name, vaultShellCommandFlag.Shorthand, "", vaultShellCommandFlag.Usage) - return vaultShellCmd -} diff --git a/internal/cli/commands/cmdvault/vault.go b/internal/cli/commands/cmdvault/vault.go index e150253..f16307f 100644 --- a/internal/cli/commands/cmdvault/vault.go +++ b/internal/cli/commands/cmdvault/vault.go @@ -131,37 +131,36 @@ func showVaultData(vault *vaults.Vault) { } func VaultCommand() *cobra.Command { - if vaultCmd != nil { - return vaultCmd - } - vaultCmd = &cobra.Command{ - Use: "vault", - Aliases: []string{"v", "vaults", "secret", "secrets"}, - Short: "Manage vaults/secrets with SLV", - Long: `Manage vaults/secrets using SLV. SLV Vaults are files that store secrets in a key-value format.`, - Run: func(cmd *cobra.Command, args []string) { - vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() - vault, err := getVault(vaultFile) - if err != nil { - utils.ExitOnError(err) - } - envSecretKey, _ := secretkey.Get() - if envSecretKey != nil { - vault.Unlock(envSecretKey) - } - showVaultData(vault) - }, + if vaultCmd == nil { + vaultCmd = &cobra.Command{ + Use: "vault", + Aliases: []string{"v", "vaults", "secret", "secrets"}, + Short: "Manage vaults/secrets with SLV", + Long: `Manage vaults/secrets using SLV. SLV Vaults are files that store secrets in a key-value format.`, + Run: func(cmd *cobra.Command, args []string) { + vaultFile := cmd.Flag(vaultFileFlag.Name).Value.String() + vault, err := getVault(vaultFile) + if err != nil { + utils.ExitOnError(err) + } + envSecretKey, _ := secretkey.Get() + if envSecretKey != nil { + vault.Unlock(envSecretKey) + } + showVaultData(vault) + }, + } + vaultCmd.PersistentFlags().StringP(vaultFileFlag.Name, vaultFileFlag.Shorthand, "", vaultFileFlag.Usage) + vaultCmd.MarkPersistentFlagRequired(vaultFileFlag.Name) + vaultCmd.AddCommand(vaultNewCommand()) + vaultCmd.AddCommand(vaultToK8sCommand()) + vaultCmd.AddCommand(vaultPutCommand()) + vaultCmd.AddCommand(vaultGetCommand()) + vaultCmd.AddCommand(vaultRunCommand()) + vaultCmd.AddCommand(vaultDeleteCommand()) + vaultCmd.AddCommand(vaultRefCommand()) + vaultCmd.AddCommand(vaultDerefCommand()) + vaultCmd.AddCommand(vaultAccessCommand()) } - vaultCmd.PersistentFlags().StringP(vaultFileFlag.Name, vaultFileFlag.Shorthand, "", vaultFileFlag.Usage) - vaultCmd.MarkPersistentFlagRequired(vaultFileFlag.Name) - vaultCmd.AddCommand(vaultNewCommand()) - vaultCmd.AddCommand(vaultToK8sCommand()) - vaultCmd.AddCommand(vaultPutCommand()) - vaultCmd.AddCommand(vaultGetCommand()) - vaultCmd.AddCommand(vaultShellCommand()) - vaultCmd.AddCommand(vaultDeleteCommand()) - vaultCmd.AddCommand(vaultRefCommand()) - vaultCmd.AddCommand(vaultDerefCommand()) - vaultCmd.AddCommand(vaultAccessCommand()) return vaultCmd } diff --git a/internal/cli/slv.go b/internal/cli/slv.go index 354c40c..1f4ce69 100644 --- a/internal/cli/slv.go +++ b/internal/cli/slv.go @@ -25,27 +25,26 @@ var ( ) func slvCommand() *cobra.Command { - if slvCmd != nil { - return slvCmd + if slvCmd == nil { + slvCmd = &cobra.Command{ + Use: "slv", + Short: "SLV is a tool to encrypt secrets locally", + Run: func(cmd *cobra.Command, args []string) { + version, _ := cmd.Flags().GetBool(versionFlag.Name) + if version { + fmt.Println(config.VersionInfo()) + } else { + cmd.Help() + } + }, + } + slvCmd.Flags().BoolP(versionFlag.Name, versionFlag.Shorthand, false, versionFlag.Usage) + slvCmd.AddCommand(versionCommand()) + slvCmd.AddCommand(cmdsystem.SystemCommand()) + slvCmd.AddCommand(cmdenv.EnvCommand()) + slvCmd.AddCommand(cmdprofile.ProfileCommand()) + slvCmd.AddCommand(cmdvault.VaultCommand()) } - slvCmd = &cobra.Command{ - Use: "slv", - Short: "SLV is a tool to encrypt secrets locally", - Run: func(cmd *cobra.Command, args []string) { - version, _ := cmd.Flags().GetBool(versionFlag.Name) - if version { - fmt.Println(config.VersionInfo()) - } else { - cmd.Help() - } - }, - } - slvCmd.Flags().BoolP(versionFlag.Name, versionFlag.Shorthand, false, versionFlag.Usage) - slvCmd.AddCommand(versionCommand()) - slvCmd.AddCommand(cmdsystem.SystemCommand()) - slvCmd.AddCommand(cmdenv.EnvCommand()) - slvCmd.AddCommand(cmdprofile.ProfileCommand()) - slvCmd.AddCommand(cmdvault.VaultCommand()) return slvCmd } diff --git a/internal/cli/version.go b/internal/cli/version.go index beefa35..9537c93 100644 --- a/internal/cli/version.go +++ b/internal/cli/version.go @@ -8,15 +8,14 @@ import ( ) func versionCommand() *cobra.Command { - if versionCmd != nil { - return versionCmd - } - versionCmd = &cobra.Command{ - Use: "version", - Short: "Show version information", - Run: func(cmd *cobra.Command, args []string) { - fmt.Println(config.VersionInfo()) - }, + if versionCmd == nil { + versionCmd = &cobra.Command{ + Use: "version", + Short: "Show version information", + Run: func(cmd *cobra.Command, args []string) { + fmt.Println(config.VersionInfo()) + }, + } } return versionCmd } diff --git a/internal/core/crypto/keys.go b/internal/core/crypto/keys.go index d4b5a72..64e7c5e 100644 --- a/internal/core/crypto/keys.go +++ b/internal/core/crypto/keys.go @@ -3,8 +3,8 @@ package crypto import ( "strings" - "dev.shib.me/xipher" "oss.amagi.com/slv/internal/core/commons" + "xipher.org/xipher" ) type KeyType byte diff --git a/internal/core/environments/providers/password.go b/internal/core/environments/providers/password.go index dd63d91..378d199 100644 --- a/internal/core/environments/providers/password.go +++ b/internal/core/environments/providers/password.go @@ -4,10 +4,10 @@ import ( "crypto/sha256" "fmt" - "dev.shib.me/xipher" "github.com/zalando/go-keyring" "oss.amagi.com/slv/internal/core/commons" "oss.amagi.com/slv/internal/core/input" + "xipher.org/xipher" ) func bindWithPassword(skBytes []byte, inputs map[string][]byte) (ref map[string][]byte, err error) {