// Copyright (C) 2023 Marius Schellenberger package cli import ( "context" "encoding/json" "flag" "fmt" "os" apiclient "git.giftfish.de/ston1th/keyctl/pkg/api/client" clientv1 "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" ) var fs = flag.NewFlagSet("", flag.ExitOnError) func exit(err error) { fmt.Println(err) os.Exit(1) } func Run(arg string) { var err error ctx := context.Background() switch arg { case "new": name, encoding, size := newKeyFlags() newKey := schema.NewKey{ Name: name, Size: size, Encoding: core.EncodingFromString(encoding), } c := client() err = c.CreateKey(ctx, newKey) case "del": id := idFlags("key id") c := client() err = c.DeleteKey(ctx, id) case "approve": id := idFlags("approval id") c := client() err = c.AcceptApproval(ctx, id) case "reject": id := idFlags("approval id") c := client() err = c.RejectApproval(ctx, id) case "get": id, json := getFlags() c := client() 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() c := client() 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() c := client() 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 client() (c *clientv1.Client) { opts, err := apiclient.ClientOptionsFromEnv() if err != nil { exit(err) } apic := apiclient.NewClient(opts...) c, err = clientv1.NewClient(apic) if err != nil { exit(err) } return } 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) { fs.StringVar(&id, "id", "", desc) fs.Parse(os.Args[2:]) return } func getFlags() (id string, json bool) { fs.StringVar(&id, "id", "", "key id") fs.BoolVar(&json, "json", false, "json output") fs.Parse(os.Args[2:]) return } func outputFlags() (json bool) { fs.BoolVar(&json, "json", false, "json output") fs.Parse(os.Args[2:]) return } func newKeyFlags() (name, encoding string, size int) { fs.StringVar(&name, "name", "", "key name") fs.StringVar(&encoding, "enc", "hex", "key encoding scheme [hex|base32|base64|base64url]") fs.IntVar(&size, "size", 16, "key size in bytes") fs.Parse(os.Args[2:]) return }