forked from seashell/drago
-
Notifications
You must be signed in to change notification settings - Fork 0
/
acl_token_self.go
127 lines (98 loc) · 2.54 KB
/
acl_token_self.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
123
124
125
126
127
package command
import (
"bytes"
"context"
"encoding/json"
"fmt"
"strings"
table "github.com/rodaine/table"
structs "github.com/seashell/drago/drago/structs"
cli "github.com/seashell/drago/pkg/cli"
"github.com/spf13/pflag"
)
// ACLTokenSelfCommand :
type ACLTokenSelfCommand struct {
UI cli.UI
Command
// Parsed flags
json bool
}
func (c *ACLTokenSelfCommand) FlagSet() *pflag.FlagSet {
flags := c.Command.FlagSet(c.Name())
flags.Usage = func() { c.UI.Output("\n" + c.Help() + "\n") }
// General options
flags.BoolVar(&c.json, "json", false, "")
return flags
}
// Name :
func (c *ACLTokenSelfCommand) Name() string {
return "acl token self"
}
// Synopsis :
func (c *ACLTokenSelfCommand) Synopsis() string {
return "Lookup self ACL token"
}
// Run :
func (c *ACLTokenSelfCommand) Run(ctx context.Context, args []string) int {
flags := c.FlagSet()
if err := flags.Parse(args); err != nil {
return 1
}
args = flags.Args()
if len(args) > 0 {
c.UI.Error("This command takes no arguments")
c.UI.Error(`For additional help, try 'drago acl token self --help'`)
return 1
}
// Get the HTTP client
api, err := c.Command.APIClient()
if err != nil {
c.UI.Error(fmt.Sprintf("Error setting up API client: %s", err))
return 1
}
token, err := api.ACLTokens().Self()
if err != nil {
c.UI.Error(fmt.Sprintf("Error retrieving self ACL token: %s", err))
return 1
}
c.UI.Output(c.formatToken(token))
return 0
}
// Help :
func (c *ACLTokenSelfCommand) Help() string {
h := `
Usage: drago acl token self <name> [options]
Display information on the currently set ACL policy.
Use the --json flag to see a detailed list of the rules associated with the token.
General Options:
` + GlobalOptions() + `
ACL Token Info Options:
--json
Enable JSON output.
`
return strings.TrimSpace(h)
}
func (c *ACLTokenSelfCommand) formatToken(token *structs.ACLToken) string {
var b bytes.Buffer
if c.json {
enc := json.NewEncoder(&b)
enc.SetIndent("", " ")
formatted := map[string]interface{}{
"id": token.ID,
"name": token.Name,
"type": token.Type,
"secret": token.Secret,
"policies": token.Policies,
"createdAt": token.CreatedAt,
"updatedAt": token.UpdatedAt,
}
if err := enc.Encode(formatted); err != nil {
c.UI.Error(fmt.Sprintf("Error formatting JSON output: %s", err))
}
} else {
tbl := table.New("TOKEN ID", "NAME", "TYPE", "SECRET", "POLICIES").WithWriter(&b)
tbl.AddRow(token.ID, token.Name, token.Type, token.Secret, len(token.Policies))
tbl.Print()
}
return b.String()
}