-
Notifications
You must be signed in to change notification settings - Fork 7
/
base.go
122 lines (94 loc) · 3.08 KB
/
base.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package secret
import (
"fmt"
"net/url"
"path"
"strings"
"github.com/FalcoSuessgott/vkv/pkg/utils"
"github.com/disiqueira/gotree/v3"
"github.com/savioxavier/termlink"
)
func (p *Printer) printBase(enginePath string, secrets map[string]interface{}) error {
var tree gotree.Tree
m := make(map[string]interface{})
for _, k := range utils.SortMapKeys(secrets) {
baseName := enginePath + utils.Delimiter
if p.withHyperLinks {
addr := fmt.Sprintf("%s/ui/vault/secrets/%s/kv", p.vaultClient.Client.Address(), enginePath)
baseName = termlink.Link(enginePath+utils.Delimiter, addr, false)
}
if p.vaultClient != nil {
// append description
desc, err := p.vaultClient.GetEngineDescription(enginePath)
if err == nil && desc != "" {
baseName = fmt.Sprintf("%s [desc=%s]", baseName, desc)
}
// append type + version
engineType, version, err := p.vaultClient.GetEngineTypeVersion(enginePath)
if err == nil {
baseName = fmt.Sprintf("%s [type=%s]", baseName, engineType+version)
}
}
tree = gotree.New(baseName)
m = utils.ToMapStringInterface(secrets[k])
}
for _, i := range utils.SortMapKeys(m) {
//nolint: forcetypeassert
tree.AddTree(p.printTree(enginePath, i, m[i].(map[string]interface{})))
}
fmt.Fprint(p.writer, tree.Print())
return nil
}
func (p *Printer) printTree(rootPath, subPath string, m map[string]interface{}) gotree.Tree {
tree := gotree.New(p.buildTreeName(rootPath, subPath))
if strings.HasSuffix(subPath, utils.Delimiter) {
for _, i := range utils.SortMapKeys(m) {
//nolint: forcetypeassert
tree.AddTree(p.printTree(rootPath, subPath+i, m[i].(map[string]interface{})))
}
} else {
for _, k := range utils.SortMapKeys(m) {
if p.onlyKeys {
tree.Add(k)
}
if !p.onlyKeys && !p.onlyPaths {
tree.Add(fmt.Sprintf("%s=%v", k, m[k]))
}
}
}
return tree
}
// nolint: cyclop
func (p *Printer) buildTreeName(rootPath, subPath string) string {
name := strings.TrimSuffix(subPath, utils.Delimiter)
subPathParts := strings.Split(strings.TrimSuffix(subPath, utils.Delimiter), utils.Delimiter)
if len(subPathParts) > 1 {
name = path.Base(subPath)
}
if p.withHyperLinks && !strings.HasSuffix(subPath, utils.Delimiter) {
// {{ vault-addr }}/ui/vault/secrets/{{ root path }}/kv/{{ sub path (url encoded if contains "/" )}}
addr := fmt.Sprintf("%s/ui/vault/secrets/%s/kv/%s", p.vaultClient.Client.Address(), rootPath, subPath)
if len(subPathParts) > 1 {
addr = fmt.Sprintf("%s/ui/vault/secrets/%s/kv/%s", p.vaultClient.Client.Address(), rootPath, url.QueryEscape(subPath))
}
name = termlink.Link(name, addr, false)
}
if p.showVersion {
if v, err := p.vaultClient.ReadSecretVersion(rootPath, subPath); err == nil {
name = fmt.Sprintf("%s [v=%v]", name, v)
}
}
if p.showMetadata {
if v, err := p.vaultClient.ReadSecretMetadata(rootPath, subPath); err == nil {
md := ""
metadata, ok := v.(map[string]interface{})
if ok {
for k, v := range metadata {
md = fmt.Sprintf("%s %s=%v", md, k, v)
}
name = fmt.Sprintf("%s [%v]", name, strings.TrimPrefix(md, " "))
}
}
}
return name
}