From ab9382b8b1cbb00a40ce92430f9d8eb177f7b91b Mon Sep 17 00:00:00 2001 From: Thomas Miceli Date: Wed, 4 Jun 2025 18:44:17 +0200 Subject: [PATCH] Add listen to Unix websocket --- config.yml | 3 ++- internal/cli/main.go | 9 ++++--- internal/web/server/server.go | 44 +++++++++++++++++++++++++++++++++++ scripts/watch.sh | 21 ++++++++++++++--- 4 files changed, 70 insertions(+), 7 deletions(-) diff --git a/config.yml b/config.yml index cde43f6..089c4f6 100644 --- a/config.yml +++ b/config.yml @@ -3,7 +3,7 @@ # https://github.com/thomiceli/opengist/blob/master/docs/configuration/cheat-sheet.md # Set the log level to one of the following: debug, info, warn, error, fatal. Default: warn -log-level: warn +log-level: debug # Set the log output to one or more of the following: `stdout`, `file`. Default: stdout,file log-output: stdout,file @@ -43,6 +43,7 @@ sqlite.journal-mode: WAL # HTTP server configuration # Host to bind to. Default: 0.0.0.0 +# Use an IP address for network binding. Use a path for Unix socket binding (e.g. /run/opengist.sock) http.host: 0.0.0.0 # Port to bind to. Default: 6157 diff --git a/internal/cli/main.go b/internal/cli/main.go index 9a832b2..309d9ec 100644 --- a/internal/cli/main.go +++ b/internal/cli/main.go @@ -36,11 +36,12 @@ var CmdStart = cli.Command{ Initialize(ctx) - go server.NewServer(os.Getenv("OG_DEV") == "1", path.Join(config.GetHomeDir(), "sessions"), false).Start() + server := server.NewServer(os.Getenv("OG_DEV") == "1", path.Join(config.GetHomeDir(), "sessions"), false) + go server.StartUnixSocket() go ssh.Start() <-stopCtx.Done() - shutdown() + shutdown(server) return nil }, } @@ -130,7 +131,7 @@ func Initialize(ctx *cli.Context) { } } -func shutdown() { +func shutdown(server *server.Server) { log.Info().Msg("Shutting down database...") if err := db.Close(); err != nil { log.Error().Err(err).Msg("Failed to close database") @@ -141,6 +142,8 @@ func shutdown() { index.Close() } + server.StopUnixSocket() + log.Info().Msg("Shutdown complete") } diff --git a/internal/web/server/server.go b/internal/web/server/server.go index 1c4092a..a35cda0 100644 --- a/internal/web/server/server.go +++ b/internal/web/server/server.go @@ -2,7 +2,9 @@ package server import ( "github.com/thomiceli/opengist/internal/validator" + "net" "net/http" + "os" "github.com/labstack/echo/v4" "github.com/rs/zerolog/log" @@ -54,12 +56,54 @@ func (s *Server) Start() { } } +func (s *Server) StartUnixSocket() { + socketPath := "/tmp/opengist.sock" + if err := os.Remove(socketPath); err != nil && !os.IsNotExist(err) { + log.Warn().Err(err).Str("socket", socketPath).Msg("Failed to remove existing socket file") + } + + listener, err := net.Listen("unix", socketPath) + if err != nil { + log.Fatal().Err(err).Msg("Failed to start Unix socket server") + } + s.echo.Listener = listener + + log.Info().Msgf("Starting Unix socket server on " + socketPath) + server := new(http.Server) + if err := s.echo.StartServer(server); err != nil && err != http.ErrServerClosed { + log.Fatal().Err(err).Msg("Failed to start Unix socket server") + } +} + func (s *Server) Stop() { if err := s.echo.Close(); err != nil { log.Fatal().Err(err).Msg("Failed to stop HTTP server") } } +func (s *Server) StopUnixSocket() { + log.Info().Msg("Stopping Unix socket server...") + + var socketPath string + if s.echo.Listener != nil { + if unixListener, ok := s.echo.Listener.(*net.UnixListener); ok { + socketPath = unixListener.Addr().String() + } + } + + if err := s.echo.Close(); err != nil { + log.Error().Err(err).Msg("Failed to stop Unix socket server") + } + + if socketPath != "" { + if err := os.Remove(socketPath); err != nil && !os.IsNotExist(err) { + log.Error().Err(err).Str("socket", socketPath).Msg("Failed to remove socket file") + } else { + log.Info().Str("socket", socketPath).Msg("Socket file removed") + } + } +} + func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { s.echo.ServeHTTP(w, r) } diff --git a/scripts/watch.sh b/scripts/watch.sh index ddf85c9..7fb54f6 100755 --- a/scripts/watch.sh +++ b/scripts/watch.sh @@ -1,8 +1,23 @@ #!/bin/sh set -euo pipefail +# Start background processes make watch_frontend & -make watch_backend & +FRONTEND_PID=$! -trap 'kill $(jobs -p)' EXIT -wait +make watch_backend & +BACKEND_PID=$! + +# Function for graceful shutdown +cleanup() { + echo "Shutting down gracefully..." + kill -TERM $FRONTEND_PID $BACKEND_PID 2>/dev/null || true + wait $FRONTEND_PID $BACKEND_PID 2>/dev/null || true + echo "Shutdown complete" +} + +# Set up trap for graceful shutdown +trap cleanup EXIT INT TERM + +# Wait for background processes +wait \ No newline at end of file