package cmd import ( "fmt" "os" logger "git.towk2.me/towk/makeshift/pkg/log" "github.com/rs/zerolog/log" "github.com/spf13/cobra" ) var ( // host string // path string // outputPath string // rootPath string // profile string // plugins []string // timeout int // logFile string logLevel logger.LogLevel = logger.INFO ) var rootCmd = cobra.Command{ Use: "makeshift", Short: "Extensible file cobbler", PersistentPreRun: func(cmd *cobra.Command, args []string) { var ( logFile string err error ) // initialize the logger logFile, _ = cmd.Flags().GetString("log-file") err = logger.InitWithLogLevel(logLevel, logFile) if err != nil { log.Error().Err(err).Msg("failed to initialize logger") os.Exit(1) } }, Run: func(cmd *cobra.Command, args []string) { // try and set flags using env vars setenv(cmd, "log-file", "MAKESHIFT_LOG_FILE") if len(args) == 0 { err := cmd.Help() if err != nil { log.Error().Err(err).Msg("failed to print help") } os.Exit(0) } }, PostRun: func(cmd *cobra.Command, args []string) { log.Debug().Msg("closing log file") err := logger.LogFile.Close() if err != nil { log.Error().Err(err).Msg("failed to close log file") } }, } func Execute() { // run the main program if err := rootCmd.Execute(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } func init() { // initialize the config a single time rootCmd.PersistentFlags().VarP(&logLevel, "log-level", "l", "Set the log level output") rootCmd.PersistentFlags().String("log-file", "", "Set the log file path (can be set with MAKESHIFT_LOG_FILE)") } func setenv(cmd *cobra.Command, varname string, envvar string) { if cmd.Flags().Changed(varname) { return } val := os.Getenv(envvar) if val != "" { cmd.Flags().Set(varname, val) } }