Skip to content

Commit b239cc3

Browse files
committed
feat: split server command in subcommands
1 parent 54dc810 commit b239cc3

File tree

6 files changed

+141
-73
lines changed

6 files changed

+141
-73
lines changed

internal/auth/server.go

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,47 @@ import (
66
"github.com/hashicorp/go-bexpr"
77
"github.com/jsiebens/brink/internal/api"
88
"github.com/jsiebens/brink/internal/auth/providers"
9+
"github.com/jsiebens/brink/internal/auth/templates"
910
"github.com/jsiebens/brink/internal/cache"
1011
"github.com/jsiebens/brink/internal/config"
1112
"github.com/jsiebens/brink/internal/key"
13+
"github.com/jsiebens/brink/internal/server"
14+
"github.com/jsiebens/brink/internal/version"
1215
"github.com/labstack/echo/v4"
1316
"github.com/mitchellh/pointerstructure"
17+
"github.com/sirupsen/logrus"
1418
"net/http"
1519
"strings"
1620
"time"
1721
)
1822

23+
const authCachePrefix = "a_"
24+
25+
func StartServer(config *config.Config) error {
26+
v, r := version.GetReleaseInfo()
27+
logrus.Infof("Starting brink auth server. Version %s - %s", v, r)
28+
29+
c, err := cache.NewCache(config.Cache)
30+
if err != nil {
31+
return err
32+
}
33+
34+
e := echo.New()
35+
e.HideBanner = true
36+
e.HidePort = true
37+
e.Renderer = templates.NewTemplates()
38+
39+
version.RegisterRoutes(e)
40+
41+
authServer, err := NewServer(config.Auth, cache.Prefixed(c, authCachePrefix))
42+
if err != nil {
43+
return err
44+
}
45+
authServer.RegisterRoutes(e, true)
46+
47+
return server.Start(config, e)
48+
}
49+
1950
func NewServer(config config.Auth, cache cache.Cache) (*Server, error) {
2051
var privateKey *key.PrivateKey
2152

@@ -139,7 +170,7 @@ func (s *Server) RegisterSession(req *api.RegisterSessionRequest) (*api.SessionT
139170
return &response, nil
140171
}
141172

142-
func (s *Server) AuthenticateSession(req *api.SessionTokenRequest) (*api.SessionTokenResponse, error) {
173+
func (s *Server) CheckSessionToken(req *api.SessionTokenRequest) (*api.SessionTokenResponse, error) {
143174
se := session{}
144175

145176
ok, err := s.sessions.Get(req.SessionId, &se)
@@ -189,7 +220,7 @@ func (s *Server) checkSessionToken(c echo.Context) error {
189220
return err
190221
}
191222

192-
response, err := s.AuthenticateSession(&req)
223+
response, err := s.CheckSessionToken(&req)
193224
if err != nil {
194225
return err
195226
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package proxy
1+
package auth
22

33
import (
44
"context"
@@ -12,13 +12,13 @@ import (
1212
"time"
1313
)
1414

15-
type SessionRegistrar interface {
15+
type SessionRegistry interface {
1616
GetPublicKey() key.PublicKey
1717
RegisterSession(request *api.RegisterSessionRequest) (*api.SessionTokenResponse, error)
18-
AuthenticateSession(request *api.SessionTokenRequest) (*api.SessionTokenResponse, error)
18+
CheckSessionToken(request *api.SessionTokenRequest) (*api.SessionTokenResponse, error)
1919
}
2020

21-
func NewRemoteSessionRegistrar(config config.Auth) (SessionRegistrar, error) {
21+
func NewRemoteSessionRegistrar(config config.Auth) (SessionRegistry, error) {
2222
url, err := util.NormalizeHttpUrl(config.RemoteServer)
2323
if err != nil {
2424
return nil, err
@@ -82,7 +82,7 @@ func (r *remoteSessionRegistrar) RegisterSession(req *api.RegisterSessionRequest
8282
return &result, nil
8383
}
8484

85-
func (r *remoteSessionRegistrar) AuthenticateSession(req *api.SessionTokenRequest) (*api.SessionTokenResponse, error) {
85+
func (r *remoteSessionRegistrar) CheckSessionToken(req *api.SessionTokenRequest) (*api.SessionTokenResponse, error) {
8686
token, err := r.localPrivateKey.SealBase58(r.remotePublicKey, &api.Token{ExpirationTime: time.Now().UTC().Add(5 * time.Minute)})
8787
if err != nil {
8888
return nil, err

internal/cmd/server.go

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,36 @@
11
package cmd
22

33
import (
4+
"github.com/jsiebens/brink/internal/auth"
45
"github.com/jsiebens/brink/internal/config"
5-
"github.com/jsiebens/brink/internal/server"
6+
"github.com/jsiebens/brink/internal/proxy"
67
"github.com/spf13/cobra"
78
)
89

910
func serverCommand() *cobra.Command {
1011
command := &cobra.Command{
1112
Use: "server",
12-
Short: "Start a server (and optionally a proxy) with a configuration file.",
13+
SilenceUsage: true,
14+
}
15+
16+
command.AddCommand(serverAuthCommand())
17+
command.AddCommand(serverProxyCommand())
18+
19+
return command
20+
}
21+
22+
func serverAuthCommand() *cobra.Command {
23+
return createServerCommand("auth", "Start an auth server with a configuration file.", auth.StartServer)
24+
}
25+
26+
func serverProxyCommand() *cobra.Command {
27+
return createServerCommand("proxy", "Start a proxy server with a configuration file.", proxy.StartServer)
28+
}
29+
30+
func createServerCommand(use, short string, start func(*config.Config) error) *cobra.Command {
31+
command := &cobra.Command{
32+
Use: use,
33+
Short: short,
1334
SilenceUsage: true,
1435
}
1536

@@ -22,7 +43,7 @@ func serverCommand() *cobra.Command {
2243
if err != nil {
2344
return err
2445
}
25-
return server.StartServer(c)
46+
return start(c)
2647
}
2748

2849
return command

internal/config/config.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ type Tls struct {
7070
type Auth struct {
7171
RemoteServer string `mapstructure:"remote_server"`
7272
RemotePublicKey string `mapstructure:"remote_public_key"`
73-
EnableApi bool `mapstructure:"enable_api"`
7473
PrivateKey string `mapstructure:"private_key"`
7574
UrlPrefix string `mapstructure:"url_prefix"`
7675
Provider Provider `mapstructure:"provider"`
@@ -85,7 +84,6 @@ type Provider struct {
8584
}
8685

8786
type Proxy struct {
88-
Disable bool `mapstructure:"disable"`
8987
Policies map[string]Policy `mapstructure:"policies"`
9088
}
9189

internal/proxy/server.go

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ package proxy
33
import (
44
"fmt"
55
"github.com/jsiebens/brink/internal/api"
6+
"github.com/jsiebens/brink/internal/auth"
7+
"github.com/jsiebens/brink/internal/auth/templates"
68
"github.com/jsiebens/brink/internal/cache"
79
"github.com/jsiebens/brink/internal/config"
810
"github.com/jsiebens/brink/internal/key"
11+
"github.com/jsiebens/brink/internal/server"
912
"github.com/jsiebens/brink/internal/util"
13+
"github.com/jsiebens/brink/internal/version"
1014
"github.com/labstack/echo/v4"
1115
"github.com/rancher/remotedialer"
1216
"github.com/sirupsen/logrus"
@@ -16,7 +20,58 @@ import (
1620
"time"
1721
)
1822

19-
func NewServer(config config.Proxy, cache cache.Cache, registrar SessionRegistrar) (*Server, error) {
23+
const authCachePrefix = "pa_"
24+
const proxyCachePrefix = "pp_"
25+
26+
func StartServer(config *config.Config) error {
27+
v, r := version.GetReleaseInfo()
28+
logrus.Infof("Starting brink proxy server. Version %s - %s", v, r)
29+
30+
c, err := cache.NewCache(config.Cache)
31+
if err != nil {
32+
return err
33+
}
34+
35+
e := echo.New()
36+
e.HideBanner = true
37+
e.HidePort = true
38+
e.Renderer = templates.NewTemplates()
39+
40+
version.RegisterRoutes(e)
41+
42+
var sessionRegistry auth.SessionRegistry
43+
44+
if config.Auth.RemoteServer == "" {
45+
logrus.Info("registering oidc routes")
46+
47+
authServer, err := auth.NewServer(config.Auth, cache.Prefixed(c, authCachePrefix))
48+
if err != nil {
49+
return err
50+
}
51+
authServer.RegisterRoutes(e, false)
52+
53+
sessionRegistry = authServer
54+
} else {
55+
logrus.Info("configuring remote auth server, skipping oidc routes")
56+
remoteSessionRegistrar, err := auth.NewRemoteSessionRegistrar(config.Auth)
57+
if err != nil {
58+
return err
59+
}
60+
sessionRegistry = remoteSessionRegistrar
61+
}
62+
63+
logrus.Info("registering proxy routes")
64+
65+
proxyServer, err := NewServer(config.Proxy, cache.Prefixed(c, proxyCachePrefix), sessionRegistry)
66+
if err != nil {
67+
return err
68+
}
69+
proxyServer.RegisterRoutes(e)
70+
71+
return server.Start(config, e)
72+
}
73+
74+
func NewServer(config config.Proxy, cache cache.Cache, registrar auth.SessionRegistry) (*Server, error) {
2075
targetFilters, err := parseTargetFilters(config.Policies)
2176
if err != nil {
2277
return nil, err
@@ -39,7 +94,7 @@ func NewServer(config config.Proxy, cache cache.Cache, registrar SessionRegistra
3994
}
4095

4196
type Server struct {
42-
sessionRegistrar SessionRegistrar
97+
sessionRegistrar auth.SessionRegistry
4398
sessions cache.Cache
4499
policy map[string]config.Policy
45100
targetFilters map[string][]TargetFilter
@@ -99,7 +154,7 @@ func (s *Server) checkSessionToken(c echo.Context) error {
99154
return err
100155
}
101156

102-
response, err := s.sessionRegistrar.AuthenticateSession(&req)
157+
response, err := s.sessionRegistrar.CheckSessionToken(&req)
103158
if err != nil {
104159
return err
105160
}

internal/server/server.go

Lines changed: 21 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,44 @@
11
package server
22

33
import (
4-
"github.com/jsiebens/brink/internal/auth"
5-
"github.com/jsiebens/brink/internal/auth/templates"
6-
"github.com/jsiebens/brink/internal/cache"
4+
"context"
5+
"errors"
76
"github.com/jsiebens/brink/internal/config"
8-
"github.com/jsiebens/brink/internal/proxy"
9-
"github.com/jsiebens/brink/internal/version"
107
"github.com/labstack/echo/v4"
118
"github.com/sirupsen/logrus"
129
"net/http"
10+
"os"
11+
"os/signal"
12+
"syscall"
13+
"time"
1314
)
1415

15-
const authCachePrefix = "a_"
16-
const proxyCachePrefix = "p_"
17-
18-
func StartServer(config *config.Config) error {
19-
v, r := version.GetReleaseInfo()
20-
logrus.Infof("Starting brink. Version %s - %s", v, r)
21-
22-
c, err := cache.NewCache(config.Cache)
23-
if err != nil {
24-
return err
25-
}
26-
27-
e := echo.New()
28-
e.HideBanner = true
29-
e.HidePort = true
30-
e.Renderer = templates.NewTemplates()
31-
32-
version.RegisterRoutes(e)
16+
func Start(config *config.Config, e *echo.Echo) error {
17+
registerDefaultRoutes(e)
3318

34-
var registrar proxy.SessionRegistrar
19+
done := make(chan os.Signal, 1)
20+
signal.Notify(done, os.Interrupt, syscall.SIGTERM)
3521

36-
if config.Auth.RemoteServer == "" {
37-
logrus.Info("registering oidc routes")
22+
go func() {
23+
<-done
24+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
25+
defer cancel()
26+
_ = e.Shutdown(ctx)
27+
}()
3828

39-
if config.Auth.EnableApi {
40-
logrus.Info("registering auth routes")
41-
}
29+
logrus.Infof("server listening on %s", config.ListenAddr)
4230

43-
authServer, err := auth.NewServer(config.Auth, cache.Prefixed(c, authCachePrefix))
44-
if err != nil {
31+
if config.Tls.Disable {
32+
if err := e.Start(config.ListenAddr); err != nil && !errors.Is(err, http.ErrServerClosed) {
4533
return err
4634
}
47-
authServer.RegisterRoutes(e, config.Auth.EnableApi)
48-
registrar = authServer
4935
} else {
50-
logrus.Info("configuring remote auth server, skipping oidc and auth routes")
51-
remoteSessionRegistrar, err := proxy.NewRemoteSessionRegistrar(config.Auth)
52-
if err != nil {
53-
return err
54-
}
55-
registrar = remoteSessionRegistrar
56-
}
57-
58-
if !config.Proxy.Disable {
59-
logrus.Info("registering proxy routes")
60-
61-
proxyServer, err := proxy.NewServer(config.Proxy, cache.Prefixed(c, proxyCachePrefix), registrar)
62-
if err != nil {
36+
if err := e.StartTLS(config.ListenAddr, config.Tls.CertFile, config.Tls.KeyFile); err != nil && !errors.Is(err, http.ErrServerClosed) {
6337
return err
6438
}
65-
proxyServer.RegisterRoutes(e)
66-
} else {
67-
logrus.Info("proxy is explicitly disabled, skipping proxy routes")
6839
}
6940

70-
registerDefaultRoutes(e)
71-
72-
logrus.Infof("server listening on %s", config.ListenAddr)
73-
74-
if config.Tls.Disable {
75-
return e.Start(config.ListenAddr)
76-
} else {
77-
return e.StartTLS(config.ListenAddr, config.Tls.CertFile, config.Tls.KeyFile)
78-
}
41+
return nil
7942
}
8043

8144
func registerDefaultRoutes(e *echo.Echo) {

0 commit comments

Comments
 (0)