Skip to content

Commit eaa27a7

Browse files
committed
Unix socket
1 parent ab9382b commit eaa27a7

File tree

4 files changed

+77
-6
lines changed

4 files changed

+77
-6
lines changed

config.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,16 @@ sqlite.journal-mode: WAL
4444
# HTTP server configuration
4545
# Host to bind to. Default: 0.0.0.0
4646
# Use an IP address for network binding. Use a path for Unix socket binding (e.g. /run/opengist.sock)
47-
http.host: 0.0.0.0
47+
http.host: /tmp/opengist.sock
4848

4949
# Port to bind to. Default: 6157
5050
http.port: 6157
5151

5252
# Enable or disable git operations (clone, pull, push) via HTTP (either `true` or `false`). Default: true
5353
http.git-enabled: true
5454

55+
unix-socket-permissions: 0666
56+
5557
# Enable or disable the metrics endpoint (either `true` or `false`). Default: false
5658
metrics.enabled: false
5759

internal/cli/main.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"os/signal"
1616
"path"
1717
"path/filepath"
18+
"strings"
1819
"syscall"
1920
)
2021

@@ -37,7 +38,7 @@ var CmdStart = cli.Command{
3738
Initialize(ctx)
3839

3940
server := server.NewServer(os.Getenv("OG_DEV") == "1", path.Join(config.GetHomeDir(), "sessions"), false)
40-
go server.StartUnixSocket()
41+
go server.StartAuto()
4142
go ssh.Start()
4243

4344
<-stopCtx.Done()
@@ -142,7 +143,12 @@ func shutdown(server *server.Server) {
142143
index.Close()
143144
}
144145

145-
server.StopUnixSocket()
146+
// Stop the server - determine type based on config
147+
if strings.Contains(config.C.HttpHost, "/") || strings.Contains(config.C.HttpHost, "\\") {
148+
server.StopUnixSocket()
149+
} else {
150+
server.Stop()
151+
}
146152

147153
log.Info().Msg("Shutdown complete")
148154
}

internal/config/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ type config struct {
5151
HttpPort string `yaml:"http.port" env:"OG_HTTP_PORT"`
5252
HttpGit bool `yaml:"http.git-enabled" env:"OG_HTTP_GIT_ENABLED"`
5353

54+
UnixSocketPermissions string `yaml:"unix-socket-permissions" env:"OG_UNIX_SOCKET_PERMISSIONS"`
55+
5456
SshGit bool `yaml:"ssh.git-enabled" env:"OG_SSH_GIT_ENABLED"`
5557
SshHost string `yaml:"ssh.host" env:"OG_SSH_HOST"`
5658
SshPort string `yaml:"ssh.port" env:"OG_SSH_PORT"`
@@ -113,6 +115,8 @@ func configWithDefaults() (*config, error) {
113115
c.HttpPort = "6157"
114116
c.HttpGit = true
115117

118+
c.UnixSocketPermissions = "0666"
119+
116120
c.SshGit = true
117121
c.SshHost = "0.0.0.0"
118122
c.SshPort = "2222"

internal/web/server/server.go

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package server
22

33
import (
4+
"fmt"
45
"github.com/thomiceli/opengist/internal/validator"
56
"net"
67
"net/http"
78
"os"
9+
"path/filepath"
10+
"strconv"
11+
"strings"
812

913
"github.com/labstack/echo/v4"
1014
"github.com/rs/zerolog/log"
@@ -47,7 +51,19 @@ func NewServer(isDev bool, sessionsPath string, ignoreCsrf bool) *Server {
4751
return s
4852
}
4953

54+
func isSocketPath(host string) bool {
55+
return strings.Contains(host, "/") || strings.Contains(host, "\\")
56+
}
57+
5058
func (s *Server) Start() {
59+
if isSocketPath(config.C.HttpHost) {
60+
s.startUnixSocket()
61+
} else {
62+
s.startHTTP()
63+
}
64+
}
65+
66+
func (s *Server) startHTTP() {
5167
addr := config.C.HttpHost + ":" + config.C.HttpPort
5268

5369
log.Info().Msg("Starting HTTP server on http://" + addr)
@@ -56,19 +72,44 @@ func (s *Server) Start() {
5672
}
5773
}
5874

59-
func (s *Server) StartUnixSocket() {
60-
socketPath := "/tmp/opengist.sock"
75+
func (s *Server) startUnixSocket() {
76+
socketPath := config.C.HttpHost
77+
if socketPath == "" {
78+
socketPath = "/tmp/opengist.sock"
79+
}
80+
81+
if dir := filepath.Dir(socketPath); dir != "." {
82+
if err := os.MkdirAll(dir, 0755); err != nil {
83+
log.Warn().Err(err).Str("dir", dir).Msg("Failed to create socket directory")
84+
}
85+
}
6186
if err := os.Remove(socketPath); err != nil && !os.IsNotExist(err) {
6287
log.Warn().Err(err).Str("socket", socketPath).Msg("Failed to remove existing socket file")
6388
}
6489

90+
pidPath := strings.TrimSuffix(socketPath, filepath.Ext(socketPath)) + ".pid"
91+
if err := s.createPidFile(pidPath); err != nil {
92+
log.Warn().Err(err).Str("pid-file", pidPath).Msg("Failed to create PID file")
93+
}
94+
6595
listener, err := net.Listen("unix", socketPath)
6696
if err != nil {
6797
log.Fatal().Err(err).Msg("Failed to start Unix socket server")
6898
}
6999
s.echo.Listener = listener
70100

71-
log.Info().Msgf("Starting Unix socket server on " + socketPath)
101+
if config.C.UnixSocketPermissions != "" {
102+
if perm, err := strconv.ParseUint(config.C.UnixSocketPermissions, 8, 32); err == nil {
103+
if err := os.Chmod(socketPath, os.FileMode(perm)); err != nil {
104+
log.Warn().Err(err).Str("socket", socketPath).Str("permissions", config.C.UnixSocketPermissions).Msg("Failed to set socket permissions")
105+
}
106+
} else {
107+
log.Warn().Err(err).Str("permissions", config.C.UnixSocketPermissions).Msg("Invalid socket permissions format")
108+
}
109+
}
110+
111+
log.Info().Str("socket", socketPath).Msg("Starting Unix socket server")
112+
log.Info().Str("pid-file", pidPath).Msg("PID file created")
72113
server := new(http.Server)
73114
if err := s.echo.StartServer(server); err != nil && err != http.ErrServerClosed {
74115
log.Fatal().Err(err).Msg("Failed to start Unix socket server")
@@ -101,9 +142,27 @@ func (s *Server) StopUnixSocket() {
101142
} else {
102143
log.Info().Str("socket", socketPath).Msg("Socket file removed")
103144
}
145+
146+
pidPath := strings.TrimSuffix(socketPath, filepath.Ext(socketPath)) + ".pid"
147+
if err := os.Remove(pidPath); err != nil && !os.IsNotExist(err) {
148+
log.Error().Err(err).Str("pid-file", pidPath).Msg("Failed to remove PID file")
149+
} else {
150+
log.Info().Str("pid-file", pidPath).Msg("PID file removed")
151+
}
104152
}
105153
}
106154

155+
func (s *Server) createPidFile(pidPath string) error {
156+
pid := os.Getpid()
157+
pidContent := fmt.Sprintf("%d\n", pid)
158+
159+
if err := os.WriteFile(pidPath, []byte(pidContent), 0644); err != nil {
160+
return err
161+
}
162+
163+
return nil
164+
}
165+
107166
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
108167
s.echo.ServeHTTP(w, r)
109168
}

0 commit comments

Comments
 (0)