package cli import ( "context" "fmt" "github.com/urfave/cli/v3" ) func writeCommand() *cli.Command { return &cli.Command{ Name: "write", Usage: "create or update a secret (e.g. `vault-tui write secret/team/prod/db user=admin pass=hunter2`)", ArgsUsage: " key=value [key=value ...]", Flags: []cli.Flag{ &cli.IntFlag{Name: "cas", Usage: "KV v2 check-and-set version (default: current version, if require_cas is on)"}, &cli.BoolFlag{Name: "force", Usage: "skip check-and-set even if require_cas is on"}, }, Action: func(ctx context.Context, cmd *cli.Command) error { a, err := appFrom(ctx) if err != nil { return err } args := cmd.Args().Slice() if len(args) < 2 { return fmt.Errorf("usage: vault-tui write key=value [key=value ...]") } if _, err := a.EnsureLoggedIn(ctx, cmd.String("token")); err != nil { return err } svc := a.Service() if svc.ReadOnly { return fmt.Errorf("refusing to write: vault-tui is in read-only mode (pass --write to override)") } mount, rel, err := splitMountPath(ctx, svc, args[0]) if err != nil { return err } data, err := parseKVArgs(args[1:]) if err != nil { return err } iface := make(map[string]interface{}, len(data)) for k, v := range data { iface[k] = v } useCAS := a.Settings.RequireCAS && !cmd.Bool("force") cas := int(cmd.Int("cas")) if useCAS && !cmd.IsSet("cas") { current, err := svc.KV.Read(ctx, mount, rel, 0) if err == nil && current != nil { cas = current.Version } } ack, err := svc.KV.Write(ctx, mount, rel, iface, useCAS, cas) if err != nil { return err } if ack.Version > 0 { fmt.Printf("wrote %s (version %d)\n", args[0], ack.Version) } else { fmt.Printf("wrote %s\n", args[0]) } return nil }, } }