diff --git a/src/cmd/root.go b/src/cmd/root.go index 51fa65e..0bed72b 100644 --- a/src/cmd/root.go +++ b/src/cmd/root.go @@ -3,12 +3,16 @@ package cmd import ( "fmt" "github.com/f1bonacc1/process-compose/src/api" + "github.com/f1bonacc1/process-compose/src/config" "github.com/f1bonacc1/process-compose/src/loader" + "github.com/rs/zerolog" "github.com/rs/zerolog/log" "github.com/spf13/cobra" + "io" "os" "strconv" "strings" + "time" ) var ( @@ -16,26 +20,44 @@ var ( isTui bool opts *loader.LoaderOptions pcAddress string + logPath string // rootCmd represents the base command when called without any subcommands rootCmd = &cobra.Command{ Use: "process-compose", Short: "Processes scheduler and orchestrator", - Run: func(cmd *cobra.Command, args []string) { - if !cmd.Flags().Changed("tui") { - isTui = getTuiDefault() - } - runner := getProjectRunner([]string{}, false) - api.StartHttpServer(!isTui, port, runner) - runProject(runner) - }, + Run: run, } ) const ( - defaultPortNum = 8080 + defaultPortNum = 8080 + portEnvVarName = "PC_PORT_NUM" + tuiEnvVarName = "PC_DISABLE_TUI" + configEnvVarName = "PC_CONFIG_FILES" ) +func run(cmd *cobra.Command, args []string) { + file, err := os.OpenFile(logPath, config.LogFileFlags, config.LogFileMode) + if err != nil { + panic(err) + } + defer func() { + if file != nil { + _ = file.Close() + } + }() + setupLogger(file) + log.Info().Msgf("Process Compose %s", config.Version) + + if !cmd.Flags().Changed("tui") { + isTui = getTuiDefault() + } + runner := getProjectRunner([]string{}, false) + api.StartHttpServer(!isTui, port, runner) + runProject(runner) +} + // Execute adds all child commands to the root command and sets flags appropriately. // This is called by main.main(). It only needs to happen once to the rootCmd. func Execute() { @@ -50,18 +72,19 @@ func init() { FileNames: []string{}, } - rootCmd.Flags().BoolVarP(&isTui, "tui", "t", true, "disable tui (-t=false) (env: PC_DISABLE_TUI)") - rootCmd.PersistentFlags().IntVarP(&port, "port", "p", getPortDefault(), "port number (env: PC_PORT_NUM)") - rootCmd.Flags().StringArrayVarP(&opts.FileNames, "config", "f", getConfigDefault(), "path to config files to load (env: PC_CONFIG_FILES)") + rootCmd.Flags().BoolVarP(&isTui, "tui", "t", true, "disable tui (-t=false) (env: "+tuiEnvVarName+")") + rootCmd.PersistentFlags().IntVarP(&port, "port", "p", getPortDefault(), "port number (env: "+portEnvVarName+")") + rootCmd.Flags().StringArrayVarP(&opts.FileNames, "config", "f", getConfigDefault(), "path to config files to load (env: "+configEnvVarName+")") + rootCmd.Flags().StringVarP(&logPath, "logFile", "", config.GetLogFilePath(), "Specify the log file path (env: "+config.LogPathEnvVarName+")") } func getTuiDefault() bool { - _, found := os.LookupEnv("PC_DISABLE_TUI") + _, found := os.LookupEnv(tuiEnvVarName) return !found } func getPortDefault() int { - val, found := os.LookupEnv("PC_PORT_NUM") + val, found := os.LookupEnv(portEnvVarName) if found { port, err := strconv.Atoi(val) if err != nil { @@ -74,7 +97,7 @@ func getPortDefault() int { } func getConfigDefault() []string { - val, found := os.LookupEnv("PC_CONFIG_FILES") + val, found := os.LookupEnv(configEnvVarName) if found { return strings.Split(val, ",") } @@ -87,3 +110,13 @@ func logFatal(err error, format string, args ...interface{}) { log.Err(err).Msgf(format, args...) os.Exit(1) } + +func setupLogger(output io.Writer) { + + log.Logger = log.Output(zerolog.ConsoleWriter{ + Out: output, + TimeFormat: "06-01-02 15:04:05.000", + }) + zerolog.TimeFieldFormat = time.RFC3339Nano + zerolog.SetGlobalLevel(zerolog.DebugLevel) +} diff --git a/src/config/config.go b/src/config/config.go index cd2b60a..faa8bbc 100644 --- a/src/config/config.go +++ b/src/config/config.go @@ -23,12 +23,17 @@ var ( ) const ( - pcConfigEnv = "PROC_COMP_CONFIG" - LogFileFlags = os.O_CREATE | os.O_APPEND | os.O_WRONLY | os.O_TRUNC - LogFileMode = os.FileMode(0600) + pcConfigEnv = "PROC_COMP_CONFIG" + LogPathEnvVarName = "PC_LOG_FILE" + LogFileFlags = os.O_CREATE | os.O_APPEND | os.O_WRONLY | os.O_TRUNC + LogFileMode = os.FileMode(0600) ) func GetLogFilePath() string { + val, found := os.LookupEnv(LogPathEnvVarName) + if found { + return val + } return filepath.Join(os.TempDir(), fmt.Sprintf("process-compose-%s%s.log", mustUser(), mode())) } diff --git a/src/main.go b/src/main.go index 80a4d7c..93167ef 100644 --- a/src/main.go +++ b/src/main.go @@ -2,35 +2,9 @@ package main import ( "github.com/f1bonacc1/process-compose/src/cmd" - "github.com/f1bonacc1/process-compose/src/config" - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" - "io" - "os" - "time" ) -func setupLogger(output io.Writer) { - - log.Logger = log.Output(zerolog.ConsoleWriter{ - Out: output, - TimeFormat: "06-01-02 15:04:05.000", - }) - zerolog.TimeFieldFormat = time.RFC3339Nano - zerolog.SetGlobalLevel(zerolog.DebugLevel) -} - func main() { - file, err := os.OpenFile(config.GetLogFilePath(), config.LogFileFlags, config.LogFileMode) - if err != nil { - panic(err) - } - defer func() { - if file != nil { - _ = file.Close() - } - }() - setupLogger(file) - log.Info().Msgf("Process Compose %s", config.Version) + cmd.Execute() }