139 lines
2.6 KiB
Go
139 lines
2.6 KiB
Go
// Copyright (C) 2023 Marius Schellenberger
|
|
|
|
package cli
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
|
|
apiclient "git.giftfish.de/ston1th/keyctl/pkg/api/client"
|
|
"git.giftfish.de/ston1th/keyctl/pkg/api/v1/client"
|
|
"git.giftfish.de/ston1th/keyctl/pkg/api/v1/schema"
|
|
"git.giftfish.de/ston1th/keyctl/pkg/core"
|
|
)
|
|
|
|
func exit(err error) {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
func Run(arg string) {
|
|
opts, err := apiclient.ClientOptionsFromEnv()
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
apic := apiclient.NewClient(opts...)
|
|
c, err := client.NewClient(apic)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
ctx := context.Background()
|
|
switch arg {
|
|
case "new":
|
|
name, encoding, size := newKeyFlags()
|
|
newKey := schema.NewKey{
|
|
Name: name,
|
|
Size: size,
|
|
Encoding: core.EncodingFromString(encoding),
|
|
}
|
|
err = c.CreateKey(ctx, newKey)
|
|
case "del":
|
|
id := idFlags("key id")
|
|
err = c.DeleteKey(ctx, id)
|
|
case "approve":
|
|
id := idFlags("approval id")
|
|
err = c.AcceptApproval(ctx, id)
|
|
case "reject":
|
|
id := idFlags("approval id")
|
|
err = c.RejectApproval(ctx, id)
|
|
case "get":
|
|
id, json := getFlags()
|
|
key, err := c.GetKey(ctx, id)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
if json {
|
|
jsonOutput(key) // does not return
|
|
}
|
|
fmt.Println(key.Key)
|
|
case "ls":
|
|
json := outputFlags()
|
|
keys, err := c.GetKeys(ctx)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
if json {
|
|
jsonOutput(keys) // does not return
|
|
}
|
|
for _, k := range keys {
|
|
fmt.Printf("%s %s %d %d %s\n",
|
|
k.ID,
|
|
k.Name,
|
|
k.Size,
|
|
k.Encoding,
|
|
k.Created,
|
|
)
|
|
}
|
|
case "req":
|
|
json := outputFlags()
|
|
approvals, err := c.GetApprovals(ctx)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
if json {
|
|
jsonOutput(approvals) // does not return
|
|
}
|
|
for _, a := range approvals {
|
|
fmt.Printf("%s %s %s %d %s\n",
|
|
a.ID,
|
|
a.AID,
|
|
a.Name,
|
|
a.Status,
|
|
a.Created,
|
|
)
|
|
}
|
|
}
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
os.Exit(0)
|
|
}
|
|
|
|
func jsonOutput(v any) {
|
|
b, err := json.Marshal(v)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
fmt.Println(string(b))
|
|
os.Exit(0)
|
|
}
|
|
|
|
func idFlags(desc string) (id string) {
|
|
flag.StringVar(&id, "id", "", desc)
|
|
flag.Parse()
|
|
return
|
|
}
|
|
|
|
func getFlags() (id string, json bool) {
|
|
flag.StringVar(&id, "id", "", "key id")
|
|
flag.BoolVar(&json, "json", false, "json output")
|
|
flag.Parse()
|
|
return
|
|
}
|
|
|
|
func outputFlags() (json bool) {
|
|
flag.BoolVar(&json, "json", false, "json output")
|
|
flag.Parse()
|
|
return
|
|
}
|
|
|
|
func newKeyFlags() (name, encoding string, size int) {
|
|
flag.StringVar(&name, "name", "", "key name")
|
|
flag.StringVar(&encoding, "enc", "hex", "key encoding scheme [hex|base32|base64|base64url]")
|
|
flag.IntVar(&size, "size", 16, "key size in bytes")
|
|
flag.Parse()
|
|
return
|
|
}
|