github.com/Finschia/ostracon@v1.1.5/cmd/ostracon/commands/root.go (about) 1 package commands 2 3 import ( 4 "fmt" 5 "os" 6 "strings" 7 8 "github.com/spf13/cobra" 9 "github.com/spf13/viper" 10 11 cfg "github.com/Finschia/ostracon/config" 12 "github.com/Finschia/ostracon/libs/cli" 13 "github.com/Finschia/ostracon/libs/log" 14 ) 15 16 var ( 17 config = cfg.DefaultConfig() 18 logger = log.NewOCLogger(log.NewSyncWriter(os.Stdout)) 19 ) 20 21 func init() { 22 registerFlagsRootCmd(RootCmd) 23 } 24 25 func registerFlagsRootCmd(cmd *cobra.Command) { 26 cmd.PersistentFlags().String("log_level", config.LogLevel, "log level") 27 } 28 29 // ParseConfig retrieves the default environment configuration, 30 // sets up the Ostracon root and ensures that the root exists 31 func ParseConfig(cmd *cobra.Command) (*cfg.Config, error) { 32 conf := cfg.DefaultConfig() 33 err := viper.Unmarshal(conf) 34 if err != nil { 35 return nil, err 36 } 37 38 var home string 39 if os.Getenv("OCHOME") != "" { 40 home = os.Getenv("OCHOME") 41 } else { 42 home, err = cmd.Flags().GetString(cli.HomeFlag) 43 if err != nil { 44 return nil, err 45 } 46 } 47 48 conf.RootDir = home 49 50 conf.SetRoot(conf.RootDir) 51 cfg.EnsureRoot(conf.RootDir) 52 if err := conf.ValidateBasic(); err != nil { 53 return nil, fmt.Errorf("error in config file: %v", err) 54 } 55 return conf, nil 56 } 57 58 // RootCmd is the root command for Ostracon core. 59 var RootCmd = &cobra.Command{ 60 Use: "ostracon", 61 Short: "BFT state machine replication for applications in any programming languages", 62 PersistentPreRunE: func(cmd *cobra.Command, args []string) (err error) { 63 if cmd.Name() == VersionCmd.Name() { 64 return nil 65 } 66 67 config, err = ParseConfig(cmd) 68 if err != nil { 69 return err 70 } 71 72 if config.LogFormat == cfg.LogFormatJSON { 73 logger = log.NewOCJSONLogger(log.NewSyncWriter(os.Stdout)) 74 } 75 76 logger, err = log.ParseLogLevel(config.LogLevel, logger, cfg.DefaultLogLevel) 77 if err != nil { 78 return err 79 } 80 81 if viper.GetBool(cli.TraceFlag) { 82 logger = log.NewTracingLogger(logger) 83 } 84 85 logger = logger.With("module", "main") 86 return nil 87 }, 88 } 89 90 // deprecateSnakeCase is a util function for 0.34.1. Should be removed in 0.35 91 func deprecateSnakeCase(cmd *cobra.Command, args []string) { 92 if strings.Contains(cmd.CalledAs(), "_") { 93 fmt.Println("Deprecated: snake_case commands will be replaced by hyphen-case commands in the next major release") 94 } 95 }