Files
holos/pkg/cli/root.go
Jeff McCune 9bc96d0783 (#3) holos txtar command for provisioner secrets
This patch makes it easy to fetch one or multiple files from a Secret in
the provisioner cluster to address two primary use cases:

 1. Extract files into a temporary directory to provide to other tools.
 2. Print one file to stdout.

For example, the secrets.yaml file necessary to reset a talos cluster is
printed to stdout in txtar format with one command:

    holos kv get k2-talos

The output has the secret name as the comment, then the value of each key of the data
field is printed as the txtar name and data.

    k2-talos-49546d9fd7
    -- secrets.yaml --
    ...

Extracting all of the files in the secret is also simple:

    holos kv get k2-talos | holos txtar
    8:34PM INF txtar.go:94 writing: secrets.yaml version=0.43.0 header=k2-talos-49546d9fd7 path=secrets.yaml bytes=4841

Extracting one file to stdout is also simple:

    holos kv get k2-talos | holos txtar --index=1
2024-02-22 20:38:44 -08:00

80 lines
2.1 KiB
Go

package cli
import (
"fmt"
"github.com/holos-run/holos/pkg/config"
"github.com/holos-run/holos/pkg/logger"
"github.com/holos-run/holos/pkg/version"
"github.com/holos-run/holos/pkg/wrapper"
"github.com/spf13/cobra"
"log/slog"
)
type runFunc func(c *cobra.Command, args []string) error
// New returns a new root *cobra.Command for command line execution.
func New(cfg *config.Config) *cobra.Command {
rootCmd := &cobra.Command{
Use: "holos",
Short: "holos manages a holistic integrated software development platform",
Version: version.Version,
Args: cobra.NoArgs,
CompletionOptions: cobra.CompletionOptions{
HiddenDefaultCmd: true, // Don't complete the complete subcommand itself
},
SilenceUsage: true,
SilenceErrors: true,
PersistentPreRunE: func(c *cobra.Command, args []string) error {
if err := cfg.Finalize(); err != nil {
return err
}
log := cfg.Logger()
// Set the configured logger in the context.
c.SetContext(logger.NewContext(c.Context(), log))
// Set the default logger after flag parsing.
slog.SetDefault(log)
return nil
},
RunE: func(c *cobra.Command, args []string) error {
return c.Usage()
},
}
rootCmd.SetVersionTemplate("{{.Version}}\n")
rootCmd.SetOut(cfg.Stdout())
rootCmd.PersistentFlags().SortFlags = false
rootCmd.PersistentFlags().AddGoFlagSet(cfg.LogFlagSet())
// subcommands
rootCmd.AddCommand(newBuildCmd(cfg))
rootCmd.AddCommand(newRenderCmd(cfg))
rootCmd.AddCommand(newKVRootCmd(cfg))
rootCmd.AddCommand(newTxtarCmd(cfg))
return rootCmd
}
// newCmd returns a new subcommand
func newCmd(name string) *cobra.Command {
cmd := &cobra.Command{
Use: name,
Version: version.Version,
Args: cobra.NoArgs,
CompletionOptions: cobra.CompletionOptions{
HiddenDefaultCmd: true,
},
RunE: func(c *cobra.Command, args []string) error {
return wrapper.Wrap(fmt.Errorf("could not run %v: not implemented", c.Name()))
},
SilenceUsage: true,
SilenceErrors: true,
}
return cmd
}
func ensureNewline(b []byte) []byte {
if len(b) > 0 && b[len(b)-1] != '\n' {
b = append(b, '\n')
}
return b
}