diff --git a/hooks/initial.go b/hooks/initial.go index 700af22..67ed76f 100644 --- a/hooks/initial.go +++ b/hooks/initial.go @@ -1,6 +1,7 @@ package hooks import ( + "bufio" "errors" "fmt" "io" @@ -185,6 +186,29 @@ func Init6Hook(cs *corestate.CoreState, x *app.AppX) { } x.Config.Conf.Log.Level = &logs.Levels.Fallback } + + if *x.Config.Conf.Node.ShowConfig { + fmt.Printf("Configuration from %s:\n", x.Config.CMDLine.Run.ConfigPath) + x.Config.Print(x.Config.Conf) + + fmt.Printf("Environment:\n") + x.Config.Print(x.Config.Env) + ok := true + + fmt.Printf("%s (%s/%s): ", "Is that ok?", logs.SetBrightGreen("Y"), logs.SetBrightRed("n")) + + reader := bufio.NewReader(os.Stdin) + input, _ := reader.ReadString('\n') + input = strings.TrimSpace(strings.ToLower(input)) + + ok = input == "" || input == "y" || input == "yes" + + if !ok { + _ = run_manager.Clean() + x.Log.Fatalf("Cancel launch") + } + } + x.Log.Printf("Starting \"%s\" node", *x.Config.Conf.Node.Name) } diff --git a/hooks/run.go b/hooks/run.go index cff646b..41b2a8c 100644 --- a/hooks/run.go +++ b/hooks/run.go @@ -141,7 +141,7 @@ func RunHook(ctx context.Context, cs *corestate.CoreState, x *app.AppX) error { } }() - session_manager.StartCleanup(5 * time.Minute) + session_manager.StartCleanup(5 * time.Second) if *x.Config.Conf.Updates.UpdatesEnabled { go func() { diff --git a/internal/engine/config/compositor.go b/internal/engine/config/compositor.go index 227dee1..9eeb0fb 100644 --- a/internal/engine/config/compositor.go +++ b/internal/engine/config/compositor.go @@ -45,6 +45,7 @@ func (c *Compositor) LoadConf(path string) error { // defaults v.SetDefault("node.name", "noname") v.SetDefault("node.mode", "dev") + v.SetDefault("node.show_config", "false") v.SetDefault("node.com_dir", "./com/") v.SetDefault("http_server.address", "0.0.0.0") v.SetDefault("http_server.port", "8080") diff --git a/internal/engine/config/config.go b/internal/engine/config/config.go index fb2924e..38850ec 100644 --- a/internal/engine/config/config.go +++ b/internal/engine/config/config.go @@ -27,9 +27,10 @@ type Conf struct { } type Node struct { - Mode *string `mapstructure:"mode"` - Name *string `mapstructure:"name"` - ComDir *string `mapstructure:"com_dir"` + Mode *string `mapstructure:"mode"` + Name *string `mapstructure:"name"` + ShowConfig *bool `mapstructure:"show_config"` + ComDir *string `mapstructure:"com_dir"` } type HTTPServer struct { diff --git a/internal/engine/config/print.go b/internal/engine/config/print.go new file mode 100644 index 0000000..1a766d0 --- /dev/null +++ b/internal/engine/config/print.go @@ -0,0 +1,58 @@ +package config + +import ( + "fmt" + "reflect" + "time" +) + +func (c *Compositor) Print(v any) { + c.printConfig(v, " ") +} + +func (c *Compositor) printConfig(v any, prefix string) { + val := reflect.ValueOf(v) + if val.Kind() == reflect.Ptr { + val = val.Elem() + } + + typ := val.Type() + + for i := 0; i < val.NumField(); i++ { + field := val.Field(i) + fieldType := typ.Field(i) + + fieldName := fieldType.Name + if tag, ok := fieldType.Tag.Lookup("mapstructure"); ok { + if tag != "" { + fieldName = tag + } + } + + if field.Kind() == reflect.Ptr { + if field.IsNil() { + fmt.Printf("%s%s: \n", prefix, fieldName) + continue + } + field = field.Elem() + } + + if field.Kind() == reflect.Struct { + if field.Type() == reflect.TypeOf(time.Duration(0)) { + duration := field.Interface().(time.Duration) + fmt.Printf("%s%s: %s\n", prefix, fieldName, duration.String()) + } else { + fmt.Printf("%s%s:\n", prefix, fieldName) + c.printConfig(field.Addr().Interface(), prefix+" ") + } + } else if field.Kind() == reflect.Slice { + fmt.Printf("%s%s: %v\n", prefix, fieldName, field.Interface()) + } else { + value := field.Interface() + if field.Kind() == reflect.String { + value = fmt.Sprintf("\"%s\"", value) + } + fmt.Printf("%s%s: %v\n", prefix, fieldName, value) + } + } +}