From aa45a2e3e46c690f6f3b69011f91bbea98fc1356 Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 12 Jul 2025 13:20:25 +0300 Subject: [PATCH] Some changes with http server --- cmd/run.go | 51 +++++++++++++++++++++++---------------- core/config/compositor.go | 5 +++- core/config/config.go | 7 ++++++ 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/cmd/run.go b/cmd/run.go index 60e987e..f2fb24e 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -94,7 +94,7 @@ var runCmd = &cobra.Command{ func(cs *corestate.CoreState, x *app.AppX) { if x.Config.Env.ParentStagePID != os.Getpid() { if os.TempDir() != "/tmp" { - x.Log.Printf("%s: %s", logs.SetYellow("warning"), "non-standard value specified for temporary directory") + x.Log.Printf("%s: %s", logs.PrintWarn(), "Non-standard value specified for temporary directory") } // still pre-init stage runDir, err := run_manager.Create(cs.UUID32) @@ -193,7 +193,12 @@ var runCmd = &cobra.Command{ x.Log.SetPrefix(logs.SetGreen(fmt.Sprintf("(%s) ", cs.Stage))) x.SLog = new(slog.Logger) - *x.SLog = *logs.SetupLogger(x.Config.Conf.Mode) + newSlog, err := logs.SetupLogger(x.Config.Conf.Log) + if err != nil { + _ = run_manager.Clean() + x.Log.Fatalf("Unexpected failure: %s", err.Error()) + } + *x.SLog = *newSlog }, ) @@ -223,7 +228,7 @@ var runCmd = &cobra.Command{ }) s := gs.InitGeneral(&gs.GeneralServerInit{ - Log: *x.SLog, + Log: x.SLog, Config: x.Config.Conf, }, serverv1) @@ -235,10 +240,7 @@ var runCmd = &cobra.Command{ AllowCredentials: true, MaxAge: 300, })) - r.Route(config.ApiRoute+config.ComDirRoute, func(r chi.Router) { - r.Get("/", s.HandleList) - r.Get("/{cmd}", s.Handle) - }) + r.HandleFunc(config.ComDirRoute, s.Handle) r.Route("/favicon.ico", func(r chi.Router) { r.Get("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNoContent) @@ -248,33 +250,35 @@ var runCmd = &cobra.Command{ srv := &http.Server{ Addr: x.Config.Conf.HTTPServer.Address, Handler: r, + ErrorLog: log.New(&logs.SlogWriter{ + Logger: x.SLog, + Level: logs.GlobalLevel, + }, "", 0), } - go func() { if x.Config.Conf.TLS.TlsEnabled { - x.SLog.Info("HTTPS server started with TLS", slog.String("address", x.Config.Conf.HTTPServer.Address)) - listener, err := net.Listen("tcp", x.Config.Conf.HTTPServer.Address) + listener, err := net.Listen("tcp", fmt.Sprintf("%s:%s", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port)) if err != nil { - x.SLog.Error("Failed to start TLS listener", slog.String("error", err.Error())) + x.Log.Printf("%s: Failed to start TLS listener: %s", logs.PrintError(), err.Error()) return } + x.Log.Printf("Serving on %s port %s with TLS... (https://%s%s)", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port, fmt.Sprintf("%s:%s", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port), config.ComDirRoute) limitedListener := netutil.LimitListener(listener, 100) - if err := http.ServeTLS(limitedListener, r, x.Config.Conf.TLS.CertFile, x.Config.Conf.TLS.KeyFile); err != nil { - x.SLog.Error("Failed to start HTTPS server", slog.String("error", err.Error())) + if err := srv.ServeTLS(limitedListener, x.Config.Conf.TLS.CertFile, x.Config.Conf.TLS.KeyFile); err != nil && !errors.Is(err, http.ErrServerClosed) { + x.Log.Printf("%s: Failed to start HTTPS server: %s", logs.PrintError(), err.Error()) } } else { - x.SLog.Info("HTTP server started", slog.String("address", x.Config.Conf.HTTPServer.Address)) - listener, err := net.Listen("tcp", x.Config.Conf.HTTPServer.Address) + x.Log.Printf("Serving on %s port %s... (http://%s%s)", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port, fmt.Sprintf("%s:%s", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port), config.ComDirRoute) + listener, err := net.Listen("tcp", fmt.Sprintf("%s:%s", x.Config.Conf.HTTPServer.Address, x.Config.Conf.HTTPServer.Port)) if err != nil { - x.SLog.Error("Failed to start listener", slog.String("error", err.Error())) + x.Log.Printf("%s: Failed to start listener: %s", logs.PrintError(), err.Error()) return } limitedListener := netutil.LimitListener(listener, 100) - if err := http.Serve(limitedListener, r); err != nil { - x.SLog.Error("Failed to start HTTP server", slog.String("error", err.Error())) + if err := srv.Serve(limitedListener); err != nil && !errors.Is(err, http.ErrServerClosed) { + x.Log.Printf("%s: Failed to start HTTP server: %s", logs.PrintError(), err.Error()) } } - _ = srv.Shutdown(ctxMain) }() if x.Config.Conf.Updates.UpdatesEnabled { @@ -299,11 +303,16 @@ var runCmd = &cobra.Command{ } <-ctxMain.Done() + if err := srv.Shutdown(ctxMain); err != nil { + x.Log.Printf("%s: Failed to stop the server gracefully: %s", logs.PrintError(), err.Error()) + } else { + x.Log.Printf("Server stopped gracefully") + } - x.Log.Println("cleaning up...") + x.Log.Println("Cleaning up...") if err := run_manager.Clean(); err != nil { - x.Log.Printf("cleanup error: %s", err) + x.Log.Printf("%s: Cleanup error: %s", logs.PrintError(), err.Error()) } x.Log.Println("bye!") diff --git a/core/config/compositor.go b/core/config/compositor.go index f7bbdc9..a1f3d63 100644 --- a/core/config/compositor.go +++ b/core/config/compositor.go @@ -45,7 +45,8 @@ func (c *Compositor) LoadConf(path string) error { // defaults v.SetDefault("mode", "dev") v.SetDefault("com_dir", "./com/") - v.SetDefault("http_server.address", "0.0.0.0:8080") + v.SetDefault("http_server.address", "0.0.0.0") + v.SetDefault("http_server.port", "8080") v.SetDefault("http_server.timeout", "5s") v.SetDefault("http_server.idle_timeout", "60s") v.SetDefault("tls.enabled", false) @@ -54,6 +55,8 @@ func (c *Compositor) LoadConf(path string) error { v.SetDefault("updates.enabled", false) v.SetDefault("updates.check_interval", "2h") v.SetDefault("updates.wanted_version", "latest-stable") + v.SetDefault("log.level", "info") + v.SetDefault("log.out_path", "") if err := v.ReadInConfig(); err != nil { return fmt.Errorf("error reading config: %w", err) diff --git a/core/config/config.go b/core/config/config.go index 840a6e8..acfe448 100644 --- a/core/config/config.go +++ b/core/config/config.go @@ -23,10 +23,12 @@ type Conf struct { HTTPServer HTTPServer `mapstructure:"http_server"` TLS TLS `mapstructure:"tls"` Updates Updates `mapstructure:"updates"` + Log Log `mapstructure:"log"` } type HTTPServer struct { Address string `mapstructure:"address"` + Port string `mapstructure:"port"` Timeout time.Duration `mapstructure:"timeout"` IdleTimeout time.Duration `mapstructure:"idle_timeout"` HTTPServer_Api HTTPServer_Api `mapstructure:"api"` @@ -50,6 +52,11 @@ type Updates struct { WantedVersion string `mapstructure:"wanted_version"` } +type Log struct { + Level string `mapstructure:"level"` + OutPath string `mapstructure:"out_path"` +} + // ConfigEnv structure for environment variables type Env struct { ConfigPath string `mapstructure:"config_path"`