From c1e5fc90ee88f09dfbafc5cca6b6b2bf6e7c6e8b Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 30 Nov 2025 12:50:38 +0200 Subject: [PATCH] some changes --- api/router.go | 32 +++++++++++++++++++++++++ cmd/reload.go | 9 +++++-- cmd/serve.go | 48 +++++++++++++++++++++---------------- cmd/stop.go | 15 +++++++++--- go.mod | 1 + go.sum | 2 ++ internal/server/registry.go | 27 +++++++++++++++++++++ internal/server/server.go | 22 +++++++++++++++++ static/index.html | 11 ++++++++- 9 files changed, 140 insertions(+), 27 deletions(-) create mode 100644 api/router.go create mode 100644 internal/server/registry.go diff --git a/api/router.go b/api/router.go new file mode 100644 index 0000000..15cf0b1 --- /dev/null +++ b/api/router.go @@ -0,0 +1,32 @@ +package api + +import ( + "net/http" + "path/filepath" + + "git.oblat.lv/alex/triggerssmith/internal/config" + "github.com/go-chi/chi/v5" +) + +type Router struct { + r chi.Router + + cfg *config.Config +} + +func NewRouter(cfg *config.Config) *Router { + r := chi.NewRouter() + return &Router{ + r: r, + cfg: cfg, + } +} + +func (r *Router) RouteHandler() chi.Router { + r.r.Get("/", func(w http.ResponseWriter, req *http.Request) { + http.ServeFile(w, req, filepath.Join(r.cfg.Server.StaticFilesPath, "index.html")) + }) + fs := http.FileServer(http.Dir("static")) + r.r.Handle("/static/*", http.StripPrefix("/static/", fs)) + return r.r +} diff --git a/cmd/reload.go b/cmd/reload.go index b68bb62..ee16f27 100644 --- a/cmd/reload.go +++ b/cmd/reload.go @@ -58,8 +58,13 @@ var reloadCmd = &cobra.Command{ if err != nil { slog.Error("failed to find process", slog.Int("pid", *optsReloadCmd.PID), slog.String("err", err.Error())) } - proc.Signal(syscall.SIGHUP) - slog.Debug("done") + err = proc.Signal(syscall.SIGHUP) + if err != nil { + slog.Error("failed to reload process", slog.Int("pid", *optsReloadCmd.PID), slog.String("err", err.Error())) + } else { + slog.Debug("done") + } + }, } diff --git a/cmd/serve.go b/cmd/serve.go index 46ecad9..7467230 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -10,8 +10,10 @@ import ( "syscall" "time" + "git.oblat.lv/alex/triggerssmith/api" application "git.oblat.lv/alex/triggerssmith/internal/app" "git.oblat.lv/alex/triggerssmith/internal/config" + "git.oblat.lv/alex/triggerssmith/internal/server" "git.oblat.lv/alex/triggerssmith/internal/vars" "github.com/spf13/cobra" ) @@ -97,22 +99,24 @@ var serveCmd = &cobra.Command{ } app.LoadConfiguration(cfg) - server := app.Server() - mux := http.NewServeMux() + srv := app.Server() + //mux := http.NewServeMux() // static files - staticPath := cfg.Server.StaticFilesPath - slog.Debug("Setting up static file server", slog.String("path", staticPath)) - fs := http.FileServer(http.Dir(staticPath)) - mux.Handle("/static/", http.StripPrefix("/static/", fs)) - handler := loggingMiddleware(mux) + // staticPath := cfg.Server.StaticFilesPath + // slog.Debug("Setting up static file server", slog.String("path", staticPath)) + // fs := http.FileServer(http.Dir(staticPath)) + // mux.Handle("/static/", http.StripPrefix("/static/", fs)) + // handler := loggingMiddleware(mux) - server.SetHandler(handler) - server.Init() + router := api.NewRouter(cfg) + + srv.SetHandler(router.RouteHandler()) + srv.Init() var addr = net.JoinHostPort(cfg.Server.Addr, fmt.Sprintf("%d", cfg.Server.Port)) slog.Debug("Binding listener", slog.String("address", addr)) - err = server.Start(addr) + err = srv.Start(addr) if err != nil { slog.Error("Failed to start server", slog.String("error", err.Error())) return @@ -133,28 +137,30 @@ var serveCmd = &cobra.Command{ slog.Info("Configuration reloaded") var addr = net.JoinHostPort(cfg.Server.Addr, fmt.Sprintf("%d", cfg.Server.Port)) slog.Debug("New configuration", slog.Any("config", cfg)) - err = server.Reload(addr) + err = srv.Reload(addr) if err != nil { slog.Error("Failed to restart server with new configuration", slog.String("error", err.Error())) } } case syscall.SIGINT: slog.Info("Stopping server by SIGINT") - err := server.Stop() - if err != nil { - slog.Error("Failed to stop server", slog.String("err", err.Error())) - os.Exit(1) - } os.Remove(vars.PID_PATH) + _ = server.StopAll() + //err := srv.Stop() + // if err != nil { + // slog.Error("Failed to stop server", slog.String("err", err.Error())) + // os.Exit(1) + // } return case syscall.SIGTERM: slog.Info("Stopping server by SIGTERM") - err := server.Stop() - if err != nil { - slog.Error("Failed to stop server", slog.String("err", err.Error())) - os.Exit(1) - } os.Remove(vars.PID_PATH) + _ = server.StopAll() + //err := srv.Stop() + // if err != nil { + // slog.Error("Failed to stop server", slog.String("err", err.Error())) + // os.Exit(1) + // } return } } diff --git a/cmd/stop.go b/cmd/stop.go index cc2432f..3a97b88 100644 --- a/cmd/stop.go +++ b/cmd/stop.go @@ -41,12 +41,21 @@ var stopCmd = &cobra.Command{ } if *optsStopCmd.Force { slog.Debug("force stopping server by SIGKILL", slog.Int("pid", *optsStopCmd.PID)) - proc.Signal(syscall.SIGKILL) + err = proc.Signal(syscall.SIGKILL) + if err != nil { + slog.Error("failed to reload process", slog.Int("pid", *optsReloadCmd.PID), slog.String("err", err.Error())) + } else { + slog.Debug("done") + } } else { slog.Debug("stopping server", slog.Int("pid", *optsStopCmd.PID)) - proc.Signal(syscall.SIGTERM) + err = proc.Signal(syscall.SIGTERM) + if err != nil { + slog.Error("failed to reload process", slog.Int("pid", *optsReloadCmd.PID), slog.String("err", err.Error())) + } else { + slog.Debug("done") + } } - slog.Debug("done") }, } diff --git a/go.mod b/go.mod index b8fd5c8..cfd4d3d 100644 --- a/go.mod +++ b/go.mod @@ -9,6 +9,7 @@ require ( require ( github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/go-chi/chi/v5 v5.2.3 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect diff --git a/go.sum b/go.sum index 1a4956c..ae27ce1 100644 --- a/go.sum +++ b/go.sum @@ -7,6 +7,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-chi/chi/v5 v5.2.3 h1:WQIt9uxdsAbgIYgid+BpYc+liqQZGMHRaUwp0JUcvdE= +github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= diff --git a/internal/server/registry.go b/internal/server/registry.go new file mode 100644 index 0000000..db7bb9d --- /dev/null +++ b/internal/server/registry.go @@ -0,0 +1,27 @@ +package server + +import ( + "sync" +) + +type registry struct { + lss map[string]*LiveServer + mu sync.Mutex +} + +var reg = registry{ + lss: make(map[string]*LiveServer), +} + +func pushLs(ls *LiveServer) { + reg.lss[ls.name] = ls +} + +func isExists(name string) bool { + _, ok := reg.lss[name] + return ok +} + +func deleteLs(name string) { + delete(reg.lss, name) +} diff --git a/internal/server/server.go b/internal/server/server.go index cc7d4ec..d63d4fd 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -114,7 +114,12 @@ func Create(name string) (*LiveServer, error) { return nil, fmt.Errorf("server name is empty") } + if isExists(name) { + return nil, fmt.Errorf("server with this name is already exists") + } + ls := &LiveServer{name: name} + pushLs(ls) ls.setStatus(Status{ID: StatusStopped}) return ls, nil } @@ -241,6 +246,17 @@ func (ls *LiveServer) stop(inst *instance) error { return nil } +func StopAll() (errors []error) { + for key, ls := range reg.lss { + slog.Debug("stopping LiveServer", slog.String("name", key)) + err := ls.Stop() + if err != nil { + errors = append(errors, err) + } + } + return +} + func (ls *LiveServer) Stop() error { inst := ls.active.Load().(*instance) if inst == nil { @@ -280,6 +296,12 @@ func (ls *LiveServer) Reload(newAddr string) error { return nil } +// Close deletes [LiveServer] object from registry, and sets ls to nil +func (ls *LiveServer) Close() { + deleteLs(ls.name) + ls = nil +} + // package server // import ( diff --git a/static/index.html b/static/index.html index 0622a04..9839141 100644 --- a/static/index.html +++ b/static/index.html @@ -1 +1,10 @@ -Hiwqe \ No newline at end of file + + + + + + Панель управления + + + + \ No newline at end of file