polycule-connect/polyculeconnect/server/server.go

116 lines
3.1 KiB
Go
Raw Normal View History

2023-10-12 18:36:34 +00:00
package server
import (
"context"
"errors"
"fmt"
"net"
"net/http"
"os"
2023-10-14 16:06:02 +00:00
"git.faercol.me/faercol/polyculeconnect/polyculeconnect/config"
"git.faercol.me/faercol/polyculeconnect/polyculeconnect/controller/ui"
"git.faercol.me/faercol/polyculeconnect/polyculeconnect/middlewares"
2024-03-29 17:21:26 +00:00
"git.faercol.me/faercol/polyculeconnect/polyculeconnect/services/approval"
2023-10-14 16:06:02 +00:00
dex_server "github.com/dexidp/dex/server"
2023-10-12 18:36:34 +00:00
"github.com/sirupsen/logrus"
)
type Server struct {
2023-10-14 16:06:02 +00:00
ctx context.Context
cancel context.CancelFunc
httpSrv *http.Server
listener net.Listener
serverMode config.ListeningMode
address string
handler *http.ServeMux
controllers map[string]http.Handler
l *logrus.Logger
2023-10-12 18:36:34 +00:00
}
func newUnixListener(sockPath string) (net.Listener, error) {
if err := os.Remove(sockPath); err != nil && !errors.Is(err, os.ErrNotExist) {
return nil, fmt.Errorf("failed to cleanup previously existing socket: %w", err)
}
sock, err := net.Listen("unix", sockPath)
if err != nil {
return nil, fmt.Errorf("failed to create unix socket: %w", err)
}
if err := os.Chmod(sockPath, 0o777); err != nil {
return nil, fmt.Errorf("failed to set permissions to unix socket: %w", err)
}
return sock, nil
}
2023-10-14 16:06:02 +00:00
func New(appConf *config.AppConfig, dexSrv *dex_server.Server, logger *logrus.Logger) (*Server, error) {
2023-10-12 18:36:34 +00:00
var listener net.Listener
var addr string
var err error
switch appConf.ServerMode {
case config.ModeNet:
addr = fmt.Sprintf("%s:%d", appConf.Host, appConf.Port)
listener, err = net.Listen("tcp", addr)
if err != nil {
return nil, fmt.Errorf("failed to init server in net mode: %w", err)
}
case config.ModeUnix:
addr = appConf.SockPath
listener, err = newUnixListener(appConf.SockPath)
if err != nil {
return nil, fmt.Errorf("failed to init server in unix mode: %w", err)
}
default:
panic(fmt.Errorf("unexpected listening mode %v", appConf.ServerMode))
}
2024-03-29 17:21:26 +00:00
approvalSrv := approval.New(appConf)
2023-10-14 16:06:02 +00:00
controllers := map[string]http.Handler{
2023-10-15 18:11:50 +00:00
ui.StaticRoute: middlewares.WithLogger(&ui.StaticController{}, logger),
2024-03-29 17:21:26 +00:00
"/approval": middlewares.WithLogger(ui.NewApprovalController(logger, dexSrv, approvalSrv), logger),
"/": middlewares.WithLogger(ui.NewIndexController(logger, dexSrv), logger),
2023-10-14 16:06:02 +00:00
}
2023-10-12 18:36:34 +00:00
m := http.NewServeMux()
return &Server{
handler: m,
httpSrv: &http.Server{
Handler: m,
},
2023-10-14 16:06:02 +00:00
listener: listener,
l: logger,
serverMode: appConf.ServerMode,
address: addr,
controllers: controllers,
ctx: context.TODO(),
2023-10-12 18:36:34 +00:00
}, nil
}
func (s *Server) initMux() {
2023-10-14 16:06:02 +00:00
for r, c := range s.controllers {
s.handler.Handle(r, c)
}
2023-10-12 18:36:34 +00:00
}
func (s *Server) Run(ctx context.Context) {
s.ctx, s.cancel = context.WithCancel(ctx)
s.initMux()
switch s.serverMode {
case config.ModeNet:
s.l.Infof("Server listening on host %q", s.address)
case config.ModeUnix:
s.l.Infof("Server listening on unix socket %q", s.address)
default:
}
if err := s.httpSrv.Serve(s.listener); err != nil {
s.l.Errorf("failed to serve HTTP server: %s", err.Error())
}
s.cancel()
}
func (s *Server) Done() <-chan struct{} {
return s.ctx.Done()
}