Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
devel:kubic
kubectl-view-secret
kubectl-view-secret-0.12.0.obscpio
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File kubectl-view-secret-0.12.0.obscpio of Package kubectl-view-secret
07070100000000000041ED00000000000000000000000265DBD02200000000000000000000000000000000000000000000002300000000kubectl-view-secret-0.12.0/.github07070100000001000081A400000000000000000000000165DBD0220000000B000000000000000000000000000000000000002E00000000kubectl-view-secret-0.12.0/.github/CODEOWNERS* @elsesiy 07070100000002000041ED00000000000000000000000265DBD02200000000000000000000000000000000000000000000002D00000000kubectl-view-secret-0.12.0/.github/workflows07070100000003000081A400000000000000000000000165DBD022000000F0000000000000000000000000000000000000003400000000kubectl-view-secret-0.12.0/.github/workflows/ci.yml--- name: ci on: pull_request: jobs: ci_job: name: test runs-on: ubuntu-22.04 container: image: golang:1.22 steps: - name: Checkout uses: actions/checkout@v4 - name: Test run: make test 07070100000004000081A400000000000000000000000165DBD0220000026E000000000000000000000000000000000000003900000000kubectl-view-secret-0.12.0/.github/workflows/release.yml--- name: release on: push: tags: - "v*.*.*" jobs: release_job: name: goreleaser & krew runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Go uses: actions/setup-go@v5 with: go-version: "^1.22" - name: GoReleaser uses: goreleaser/goreleaser-action@v5 with: args: release --rm-dist env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Update new version in krew-index uses: rajatjindal/krew-release-bot@v0.0.46 07070100000005000081A400000000000000000000000165DBD02200000037000000000000000000000000000000000000002600000000kubectl-view-secret-0.12.0/.gitignore.DS_Store Thumbs.db .idea .vscode kubectl-view-secret07070100000006000081A400000000000000000000000165DBD022000001DC000000000000000000000000000000000000002B00000000kubectl-view-secret-0.12.0/.goreleaser.yml--- before: hooks: - go mod download builds: - main: ./cmd/kubectl-view-secret.go env: - CGO_ENABLED=0 goos: - darwin - linux - windows goarch: - amd64 - arm64 ignore: - goos: windows goarch: arm64 archives: - builds: - kubectl-view-secret name_template: "{{ .ProjectName }}_{{ .Tag }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}" wrap_in_directory: false format: tar.gz 07070100000007000081A400000000000000000000000165DBD022000008EC000000000000000000000000000000000000002600000000kubectl-view-secret-0.12.0/.krew.yamlapiVersion: krew.googlecontainertools.github.com/v1alpha2 kind: Plugin metadata: name: view-secret spec: version: {{ .TagName }} homepage: https://github.com/elsesiy/kubectl-view-secret shortDescription: Decode Kubernetes secrets description: |+2 Base64 decode by key or all key/value pairs in a given secret. # print secret keys $ kubectl view-secret <secret> # decode specific entry $ kubectl view-secret <secret> <key> # decode all secret contents $ kubectl view-secret <secret> -a/--all # print keys for secret in different namespace $ kubectl view-secret <secret> -n/--namespace foo # print keys for secret in different context $ kubectl view-secret <secret> -c/--context ctx # print keys for secret by providing kubeconfig $ kubectl view-secret <secret> -k/--kubeconfig <cfg> # suppress info output $ kubectl view-secret <secret> -q/--quiet platforms: - selector: matchLabels: os: darwin arch: amd64 {{addURIAndSha "https://github.com/elsesiy/kubectl-view-secret/releases/download/{{ .TagName }}/kubectl-view-secret_{{ .TagName }}_darwin_amd64.tar.gz" .TagName }} bin: kubectl-view-secret - selector: matchLabels: os: darwin arch: arm64 {{addURIAndSha "https://github.com/elsesiy/kubectl-view-secret/releases/download/{{ .TagName }}/kubectl-view-secret_{{ .TagName }}_darwin_arm64.tar.gz" .TagName }} bin: kubectl-view-secret - selector: matchLabels: os: linux arch: amd64 {{addURIAndSha "https://github.com/elsesiy/kubectl-view-secret/releases/download/{{ .TagName }}/kubectl-view-secret_{{ .TagName }}_linux_amd64.tar.gz" .TagName }} bin: kubectl-view-secret - selector: matchLabels: os: linux arch: arm64 {{addURIAndSha "https://github.com/elsesiy/kubectl-view-secret/releases/download/{{ .TagName }}/kubectl-view-secret_{{ .TagName }}_linux_arm64.tar.gz" .TagName }} bin: kubectl-view-secret - selector: matchLabels: os: windows arch: amd64 {{addURIAndSha "https://github.com/elsesiy/kubectl-view-secret/releases/download/{{ .TagName }}/kubectl-view-secret_{{ .TagName }}_windows_amd64.tar.gz" .TagName }} bin: kubectl-view-secret.exe 07070100000008000081A400000000000000000000000165DBD02200001C4C000000000000000000000000000000000000002800000000kubectl-view-secret-0.12.0/CHANGELOG.md# Changelog ## [v0.12.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.12.0) (2024-02-25) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.11.0...v0.12.0) **Closed issues:** - Update to go1.22 [\#40](https://github.com/elsesiy/kubectl-view-secret/issues/40) **Merged pull requests:** - Update go toolchain to 1.22, bump dependencies [\#41](https://github.com/elsesiy/kubectl-view-secret/pull/41) ([elsesiy](https://github.com/elsesiy)) - Add support for impersonating a user or service account with flag [\#39](https://github.com/elsesiy/kubectl-view-secret/pull/39) ([cnmcavoy](https://github.com/cnmcavoy)) ## [v0.11.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.11.0) (2023-06-26) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.10.1...v0.11.0) **Closed issues:** - Update to go1.20 [\#37](https://github.com/elsesiy/kubectl-view-secret/issues/37) - Bump dependencies [\#33](https://github.com/elsesiy/kubectl-view-secret/issues/33) - use escape characters while printing secret values [\#32](https://github.com/elsesiy/kubectl-view-secret/issues/32) **Merged pull requests:** - Update go toolchain to 1.20 [\#38](https://github.com/elsesiy/kubectl-view-secret/pull/38) ([elsesiy](https://github.com/elsesiy)) - Add quotes to secret values [\#36](https://github.com/elsesiy/kubectl-view-secret/pull/36) ([pradeepnnv](https://github.com/pradeepnnv)) ## [v0.10.1](https://github.com/elsesiy/kubectl-view-secret/tree/v0.10.1) (2022-12-18) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.10.0...v0.10.1) **Closed issues:** - Improve CI setup [\#31](https://github.com/elsesiy/kubectl-view-secret/issues/31) - Update to go1.19 [\#30](https://github.com/elsesiy/kubectl-view-secret/issues/30) **Merged pull requests:** - Bump dependencies & update fmt \(gofumpt, yaml\) [\#34](https://github.com/elsesiy/kubectl-view-secret/pull/34) ([elsesiy](https://github.com/elsesiy)) ## [v0.10.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.10.0) (2022-08-07) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.9.1...v0.10.0) **Closed issues:** - AUR package [\#28](https://github.com/elsesiy/kubectl-view-secret/issues/28) **Merged pull requests:** - Bump to go1.19, run CI in container [\#29](https://github.com/elsesiy/kubectl-view-secret/pull/29) ([elsesiy](https://github.com/elsesiy)) ## [v0.9.1](https://github.com/elsesiy/kubectl-view-secret/tree/v0.9.1) (2022-04-28) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.9.0...v0.9.1) **Closed issues:** - Replace encoding/json [\#27](https://github.com/elsesiy/kubectl-view-secret/issues/27) - Update to go1.18 [\#26](https://github.com/elsesiy/kubectl-view-secret/issues/26) ## [v0.9.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.9.0) (2021-11-27) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.8.1...v0.9.0) **Closed issues:** - Update to go1.17 [\#24](https://github.com/elsesiy/kubectl-view-secret/issues/24) - support sort values and do not print empty lines [\#20](https://github.com/elsesiy/kubectl-view-secret/issues/20) **Merged pull requests:** - Improve multi-secret outputs [\#23](https://github.com/elsesiy/kubectl-view-secret/pull/23) ([elsesiy](https://github.com/elsesiy)) ## [v0.8.1](https://github.com/elsesiy/kubectl-view-secret/tree/v0.8.1) (2021-05-23) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.8.0...v0.8.1) **Closed issues:** - Error while installing in Apple M1 chip [\#22](https://github.com/elsesiy/kubectl-view-secret/issues/22) - Missing darwin\_arm64 binary [\#21](https://github.com/elsesiy/kubectl-view-secret/issues/21) - Update to go1.16 [\#18](https://github.com/elsesiy/kubectl-view-secret/issues/18) ## [v0.8.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.8.0) (2021-04-09) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.7.0...v0.8.0) **Merged pull requests:** - update to go1.16 [\#19](https://github.com/elsesiy/kubectl-view-secret/pull/19) ([elsesiy](https://github.com/elsesiy)) - fix typo. [\#17](https://github.com/elsesiy/kubectl-view-secret/pull/17) ([jiroshin](https://github.com/jiroshin)) ## [v0.7.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.7.0) (2020-11-19) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.6.0...v0.7.0) **Closed issues:** - Update to go1.15 [\#15](https://github.com/elsesiy/kubectl-view-secret/issues/15) - Migrate to GitHub Actions [\#13](https://github.com/elsesiy/kubectl-view-secret/issues/13) **Merged pull requests:** - update to go1.15 [\#16](https://github.com/elsesiy/kubectl-view-secret/pull/16) ([elsesiy](https://github.com/elsesiy)) - add GitHub Action for ci/release [\#14](https://github.com/elsesiy/kubectl-view-secret/pull/14) ([elsesiy](https://github.com/elsesiy)) ## [v0.6.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.6.0) (2020-07-26) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.5.0...v0.6.0) **Closed issues:** - Add kubeconfig option [\#11](https://github.com/elsesiy/kubectl-view-secret/issues/11) **Merged pull requests:** - Add support for custom kubeconfig [\#12](https://github.com/elsesiy/kubectl-view-secret/pull/12) ([elsesiy](https://github.com/elsesiy)) ## [v0.5.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.5.0) (2020-03-21) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.4.0...v0.5.0) **Implemented enhancements:** - Handle empty secrets [\#8](https://github.com/elsesiy/kubectl-view-secret/issues/8) **Fixed bugs:** - Change base64 encoding used during decode [\#9](https://github.com/elsesiy/kubectl-view-secret/issues/9) ## [v0.4.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.4.0) (2020-02-05) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.3.0...v0.4.0) **Implemented enhancements:** - Support custom context [\#5](https://github.com/elsesiy/kubectl-view-secret/issues/5) **Closed issues:** - Problem with docs [\#2](https://github.com/elsesiy/kubectl-view-secret/issues/2) **Merged pull requests:** - Add support for custom context [\#6](https://github.com/elsesiy/kubectl-view-secret/pull/6) ([elsesiy](https://github.com/elsesiy)) ## [v0.3.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.3.0) (2019-10-26) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.2.0...v0.3.0) **Closed issues:** - Printing decoded secrets should not add a newline [\#1](https://github.com/elsesiy/kubectl-view-secret/issues/1) ## [v0.2.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.2.0) (2019-10-24) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/v0.1.0...v0.2.0) ## [v0.1.0](https://github.com/elsesiy/kubectl-view-secret/tree/v0.1.0) (2019-10-21) [Full Changelog](https://github.com/elsesiy/kubectl-view-secret/compare/cf6a6b61cf63a4f907f72b5fd74fcc3ceb36c2c0...v0.1.0) \* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* 07070100000009000081A400000000000000000000000165DBD02200000433000000000000000000000000000000000000002300000000kubectl-view-secret-0.12.0/LICENSEMIT License Copyright (c) 2019 Jonas-Taha El Sesiy Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.0707010000000A000081A400000000000000000000000165DBD0220000011B000000000000000000000000000000000000002400000000kubectl-view-secret-0.12.0/MakefileSOURCES := $(shell find . -name '*.go') BINARY := kubectl-view-secret build: kubectl-view-secret test: $(SOURCES) go test -v -short -race -timeout 30s ./... clean: @rm -rf $(BINARY) $(BINARY): $(SOURCES) CGO_ENABLED=0 go build -o $(BINARY) -ldflags="-s -w" ./cmd/$(BINARY).go 0707010000000B000081A400000000000000000000000165DBD022000009F2000000000000000000000000000000000000002500000000kubectl-view-secret-0.12.0/README.md# kubectl-view-secret [![Go Report Card](https://goreportcard.com/badge/github.com/elsesiy/kubectl-view-secret)](https://goreportcard.com/report/github.com/elsesiy/kubectl-view-secret) ![CI](https://github.com/elsesiy/kubectl-view-secret/actions/workflows/ci.yml/badge.svg) [![Twitter](https://img.shields.io/badge/twitter-@elsesiy-blue.svg)](http://twitter.com/elsesiy) [![GitHub release](https://img.shields.io/github/release/elsesiy/kubectl-view-secret.svg)](https://github.com/elsesiy/kubectl-view-secret/releases) This plugin allows for easy secret decoding. Useful if you want to see what's inside of a secret without always go through the following: 1. `kubectl get secret <secret> -o yaml` 2. Copy base64 encoded secret 3. `echo "b64string" | base64 -d` Instead you can now do: # print secret keys kubectl view-secret <secret> # decode specific entry kubectl view-secret <secret> <key> # decode all contents kubectl view-secret <secret> -a/--all # print keys for secret in different namespace kubectl view-secret <secret> -n/--namespace <ns> # print keys for secret in different context kubectl view-secret <secret> -c/--context <ctx> # print keys for secret by providing kubeconfig kubectl view-secret <secret> -k/--kubeconfig <cfg> # suppress info output kubectl view-secret <secret> -q/--quiet ## Usage ### Krew This plugin is available through [krew](https://krew.dev) via `kubectl krew install view-secret`. ### Binary releases #### GitHub You can find the latest binaries in the [releases](https://github.com/elsesiy/kubectl-view-secret/releases) section. To install it, place it somewhere in your `$PATH` for `kubectl` to pick it up. **Note**: If you build from source or download the binary, you'll have to change the name of the binary to `kubectl-view_secret` (`-` to `_` in `view-secret`) due to the enforced naming convention for plugins by `kubectl`. More on this [here](https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/#naming-a-plugin). #### AUR package You can find the latest package description for Arch users [here](https://aur.archlinux.org/packages/kubectl-view-secret-bin). Contribution by [@jocelynthode](https://github.com/jocelynthode) ### Build from source # Clone this repository (or your fork) git clone https://github.com/elsesiy/kubectl-view-secret cd kubectl-view-secret make ## License This repository is available under the [MIT license](https://choosealicense.com/licenses/mit/). 0707010000000C000041ED00000000000000000000000265DBD02200000000000000000000000000000000000000000000001F00000000kubectl-view-secret-0.12.0/cmd0707010000000D000081A400000000000000000000000165DBD022000000C1000000000000000000000000000000000000003600000000kubectl-view-secret-0.12.0/cmd/kubectl-view-secret.gopackage main import ( "os" "github.com/elsesiy/kubectl-view-secret/pkg/cmd" ) func main() { command := cmd.NewCmdViewSecret() if err := command.Execute(); err != nil { os.Exit(1) } } 0707010000000E000081A400000000000000000000000165DBD0220000011F000000000000000000000000000000000000002200000000kubectl-view-secret-0.12.0/go.modmodule github.com/elsesiy/kubectl-view-secret go 1.22 require ( github.com/goccy/go-json v0.10.2 github.com/magiconair/properties v1.8.7 github.com/spf13/cobra v1.8.0 ) require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect ) 0707010000000F000081A400000000000000000000000165DBD022000004E0000000000000000000000000000000000000002200000000kubectl-view-secret-0.12.0/go.sumgithub.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 07070100000010000041ED00000000000000000000000265DBD02200000000000000000000000000000000000000000000001F00000000kubectl-view-secret-0.12.0/pkg07070100000011000041ED00000000000000000000000265DBD02200000000000000000000000000000000000000000000002300000000kubectl-view-secret-0.12.0/pkg/cmd07070100000012000081A400000000000000000000000165DBD02200001654000000000000000000000000000000000000003200000000kubectl-view-secret-0.12.0/pkg/cmd/view-secret.gopackage cmd import ( "bytes" "encoding/base64" "errors" "fmt" "io" "os" "os/exec" "sort" "strings" "github.com/goccy/go-json" "github.com/spf13/cobra" ) const ( example = ` # print secret keys %[1]s view-secret <secret> # decode specific entry %[1]s view-secret <secret> <key> # decode all contents %[1]s view-secret <secret> -a/--all # print keys for secret in different namespace %[1]s view-secret <secret> -n/--namespace <ns> # print keys for secret in different context %[1]s view-secret <secret> -c/--context <ctx> # print keys for secret by providing kubeconfig %[1]s view-secret <secret> -k/--kubeconfig <cfg> # suppress info output %[1]s view-secret <secret> -q/--quiet ` singleKeyDescription = "Choosing key: %[1]s" listDescription = "Multiple sub keys found. Specify another argument, one of:" listPrefix = "->" ) // ErrSecretKeyNotFound is thrown if the key doesn't exist in the secret var ErrSecretKeyNotFound = errors.New("provided key not found in secret") // ErrSecretEmpty is thrown when there's no data in the secret var ErrSecretEmpty = errors.New("secret is empty") // ErrInsufficientArgs is thrown if arg len <1 or >2 var ErrInsufficientArgs = fmt.Errorf("\nincorrect number or arguments, see --help for usage instructions") // CommandOpts is the struct holding common properties type CommandOpts struct { customNamespace string customContext string decodeAll bool kubeConfig string secretName string secretKey string quiet bool impersonateAs string } // NewCmdViewSecret creates the cobra command to be executed func NewCmdViewSecret() *cobra.Command { res := &CommandOpts{} cmd := &cobra.Command{ Use: "view-secret [secret-name] [secret-key]", Short: "Decode a kubernetes secret by name & key in the current context/cluster/namespace", Example: fmt.Sprintf(example, "kubectl"), SilenceUsage: true, RunE: func(c *cobra.Command, args []string) error { if err := res.Validate(args); err != nil { return err } if err := res.Retrieve(c); err != nil { return err } return nil }, } cmd.Flags(). BoolVarP(&res.decodeAll, "all", "a", res.decodeAll, "if true, decodes all secrets without specifying the individual secret keys") cmd.Flags().BoolVarP(&res.quiet, "quiet", "q", res.quiet, "if true, suppresses info output") cmd.Flags(). StringVarP(&res.customNamespace, "namespace", "n", res.customNamespace, "override the namespace defined in the current context") cmd.Flags().StringVarP(&res.customContext, "context", "c", res.customContext, "override the current context") cmd.Flags().StringVarP(&res.kubeConfig, "kubeconfig", "k", res.kubeConfig, "explicitly provide the kubeconfig to use") cmd.Flags().StringVar(&res.impersonateAs, "as", res.impersonateAs, "Username to impersonate for the operation. User could be a regular user or a service account in a namespace.") return cmd } // Validate ensures proper command usage func (c *CommandOpts) Validate(args []string) error { argLen := len(args) if argLen < 1 || argLen > 2 { return ErrInsufficientArgs } c.secretName = args[0] if argLen == 2 { c.secretKey = args[1] } return nil } // Retrieve reads the kubeconfig and decodes the secret func (c *CommandOpts) Retrieve(cmd *cobra.Command) error { nsOverride, _ := cmd.Flags().GetString("namespace") ctxOverride, _ := cmd.Flags().GetString("context") kubeConfigOverride, _ := cmd.Flags().GetString("kubeconfig") impersonateOverride, _ := cmd.Flags().GetString("as") var res, cmdErr bytes.Buffer commandArgs := []string{"get", "secret", c.secretName, "-o", "json"} if nsOverride != "" { commandArgs = append(commandArgs, "-n", nsOverride) } if ctxOverride != "" { commandArgs = append(commandArgs, "--context", ctxOverride) } if kubeConfigOverride != "" { commandArgs = append(commandArgs, "--kubeconfig", kubeConfigOverride) } if impersonateOverride != "" { commandArgs = append(commandArgs, "--as", impersonateOverride) } out := exec.Command("kubectl", commandArgs...) out.Stdout = &res out.Stderr = &cmdErr err := out.Run() if err != nil { _, _ = fmt.Fprint(os.Stderr, cmdErr.String()) return nil } var secret map[string]interface{} if err := json.Unmarshal(res.Bytes(), &secret); err != nil { return err } if c.quiet { return ProcessSecret(os.Stdout, io.Discard, secret, c.secretKey, c.decodeAll) } return ProcessSecret(os.Stdout, os.Stderr, secret, c.secretKey, c.decodeAll) } // ProcessSecret takes the secret and user input to determine the output func ProcessSecret(outWriter, errWriter io.Writer, secret map[string]interface{}, secretKey string, decodeAll bool) error { data, ok := secret["data"].(map[string]interface{}) if !ok { return ErrSecretEmpty } var keys []string for k := range data { keys = append(keys, k) } sort.Strings(keys) if decodeAll { for _, k := range keys { b64d, _ := base64.StdEncoding.DecodeString(data[k].(string)) _, _ = fmt.Fprintf(outWriter, "%s='%s'\n", k, strings.TrimSpace(string(b64d))) } } else if len(data) == 1 { for k, v := range data { _, _ = fmt.Fprintf(errWriter, singleKeyDescription+"\n", k) b64d, _ := base64.StdEncoding.DecodeString(v.(string)) _, _ = fmt.Fprint(outWriter, string(b64d)) } } else if secretKey != "" { if v, ok := data[secretKey]; ok { b64d, _ := base64.StdEncoding.DecodeString(v.(string)) _, _ = fmt.Fprint(outWriter, string(b64d)) } else { return ErrSecretKeyNotFound } } else { _, _ = fmt.Fprintln(errWriter, listDescription) for k := range data { _, _ = fmt.Fprintf(outWriter, "%s %s\n", listPrefix, k) } } return nil } 07070100000013000081A400000000000000000000000165DBD02200000D30000000000000000000000000000000000000003700000000kubectl-view-secret-0.12.0/pkg/cmd/view-secret_test.gopackage cmd import ( "bufio" "bytes" "fmt" "reflect" "sort" "strings" "testing" "github.com/goccy/go-json" "github.com/magiconair/properties/assert" ) const ( testSecret = ` { "data": { "TEST_CONN_STR": "bW9uZ29kYjovL215REJSZWFkZXI6RDFmZmljdWx0UCU0MHNzdzByZEBtb25nb2RiMC5leGFtcGxlLmNvbToyNzAxNy8/YXV0aFNvdXJjZT1hZG1pbg==", "TEST_PASSWORD": "c2VjcmV0Cg==", "TEST_PASSWORD_2": "dmVyeXNlY3JldAo=" } } ` testSecretSingle = ` { "data": { "SINGLE_PASSWORD": "c2VjcmV0Cg==" } } ` testSecretEmpty = "{}" ) func TestValidate(t *testing.T) { opts := CommandOpts{} tests := map[string]struct { opts CommandOpts args []string err error }{ "args insufficient length": {opts, []string{}, ErrInsufficientArgs}, "valid args": {opts, []string{"test", "key"}, nil}, } for name, test := range tests { t.Run(name, func(t *testing.T) { got := test.opts.Validate(test.args) want := test.err if got != want { t.Errorf("got %v, want %v", got, want) } }) } } func TestProcessSecret(t *testing.T) { var secret, secretSingle, secretEmpty map[string]interface{} _ = json.Unmarshal([]byte(testSecret), &secret) _ = json.Unmarshal([]byte(testSecretSingle), &secretSingle) _ = json.Unmarshal([]byte(testSecretEmpty), &secretEmpty) tests := map[string]struct { secretData map[string]interface{} wantStdOut []string wantStdErr []string secretKey string decodeAll bool err error }{ "view-secret <secret>": { secret, []string{"-> TEST_CONN_STR", "-> TEST_PASSWORD", "-> TEST_PASSWORD_2"}, []string{listDescription}, "", false, nil, }, "view-secret <secret-single-key>": { secretSingle, []string{"secret"}, []string{fmt.Sprintf(singleKeyDescription, "SINGLE_PASSWORD")}, "", false, nil, }, "view-secret test TEST_PASSWORD": {secret, []string{"secret"}, nil, "TEST_PASSWORD", false, nil}, "view-secret test -a": { secret, []string{ "TEST_CONN_STR='mongodb://myDBReader:D1fficultP%40ssw0rd@mongodb0.example.com:27017/?authSource=admin'", "TEST_PASSWORD='secret'", "TEST_PASSWORD_2='verysecret'", }, nil, "", true, nil, }, "view-secret test NONE": {secret, nil, nil, "NONE", false, ErrSecretKeyNotFound}, "view-secret <secret-empty>": {secretEmpty, nil, nil, "", false, ErrSecretEmpty}, } for name, test := range tests { t.Run(name, func(t *testing.T) { gotStdOut := bytes.Buffer{} gotStdErr := bytes.Buffer{} err := ProcessSecret(&gotStdOut, &gotStdErr, test.secretData, test.secretKey, test.decodeAll) if test.err != nil { assert.Equal(t, err, test.err) } else { var gotStdOutArr, gotStdErrArr []string scanner := bufio.NewScanner(strings.NewReader(gotStdOut.String())) for scanner.Scan() { gotStdOutArr = append(gotStdOutArr, scanner.Text()) } scanner = bufio.NewScanner(strings.NewReader(gotStdErr.String())) for scanner.Scan() { gotStdErrArr = append(gotStdErrArr, scanner.Text()) } sort.Strings(gotStdOutArr) sort.Strings(gotStdErrArr) if !reflect.DeepEqual(gotStdOutArr, test.wantStdOut) { t.Errorf("got %v, want %v", gotStdOutArr, test.wantStdOut) } if !reflect.DeepEqual(gotStdErrArr, test.wantStdErr) { t.Errorf("got %v, want %v", gotStdErrArr, test.wantStdErr) } } }) } } 07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!57 blocks
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor