Add auth over ALPN (#5)

This commit is contained in:
Jeff Mitchell authored and GitHub committed 2020-03-22 20:17:23 -04:00
1 parent 5acda6a0b1
commit cad3c24f54
11 files changed
+278 -234

No files matched your search

+14
View File
@@ -5,6 +5,7 @@ import (
"fmt"
"io"
"net"
"net/http"
"strings"
"time"
@@ -20,6 +21,19 @@ import (
"github.com/pires/go-proxyproto"
)
type ServerListener struct {
Mux *alpnmux.ALPNMux
Config *configutil.Listener
HTTPServer *http.Server
ALPNListener net.Listener
}
type WorkerAuthCertInfo struct {
CACertPEM []byte `json:"ca_cert"`
CertPEM []byte `json:"cert"`
KeyPEM []byte `json:"key"`
}
// Factory is the factory function to create a listener.
type ListenerFactory func(*configutil.Listener, io.Writer, cli.Ui) (*alpnmux.ALPNMux, map[string]string, reloadutil.ReloadFunc, error)
-10
View File
@@ -8,8 +8,6 @@ import (
"errors"
"fmt"
"io"
"net"
"net/http"
"os"
"sort"
"strconv"
@@ -18,7 +16,6 @@ import (
"github.com/armon/go-metrics"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/go-alpnmux"
"github.com/hashicorp/go-hclog"
wrapping "github.com/hashicorp/go-kms-wrapping"
"github.com/hashicorp/go-multierror"
@@ -38,13 +35,6 @@ import (
_ "github.com/lib/pq"
)
type ServerListener struct {
Mux *alpnmux.ALPNMux
Config *configutil.Listener
HTTPServer *http.Server
ALPNListener net.Listener
}
type Server struct {
InfoKeys []string
Info map[string]string
+24 -13
View File
@@ -32,7 +32,8 @@ type Command struct {
cleanupGuard sync.Once
Config *config.Config
Config *config.Config
controller *controller.Controller
flagConfig string
flagLogLevel string
@@ -247,7 +248,12 @@ func (c *Command) Run(args []string) int {
c.PrintInfo(c.UI, "controller")
c.ReleaseLogGate()
return c.Start()
if err := c.Start(); err != nil {
c.UI.Error(err.Error())
return 1
}
return c.WaitForInterrupt()
}
func (c *Command) ParseFlagsAndConfig(args []string) int {
@@ -307,7 +313,7 @@ func (c *Command) ParseFlagsAndConfig(args []string) int {
return 0
}
func (c *Command) Start() int {
func (c *Command) Start() error {
// Instantiate the wait group
conf := &controller.Config{
RawConfig: c.Config,
@@ -315,20 +321,25 @@ func (c *Command) Start() int {
}
// Initialize the core
ctlr, err := controller.New(conf)
var err error
c.controller, err = controller.New(conf)
if err != nil {
c.UI.Error(fmt.Errorf("Error initializing controller: %w", err).Error())
return 1
return fmt.Errorf("Error initializing controller: %w", err)
}
if err := ctlr.Start(); err != nil {
c.UI.Error(fmt.Sprint("Error starting controller: %w", err))
if err := ctlr.Shutdown(); err != nil {
c.UI.Error(fmt.Errorf("Error with controller shutdown: %w", err).Error())
if err := c.controller.Start(); err != nil {
retErr := fmt.Errorf("Error starting controller: %w", err)
if err := c.controller.Shutdown(); err != nil {
c.UI.Error(retErr.Error())
retErr = fmt.Errorf("Error with controller shutdown: %w", err)
}
return 1
return retErr
}
return nil
}
func (c *Command) WaitForInterrupt() int {
// Wait for shutdown
shutdownTriggered := false
@@ -337,7 +348,7 @@ func (c *Command) Start() int {
case <-c.ShutdownCh:
c.UI.Output("==> Watchtower controller shutdown triggered")
if err := ctlr.Shutdown(); err != nil {
if err := c.controller.Shutdown(); err != nil {
c.UI.Error(fmt.Errorf("Error with controller shutdown: %w", err).Error())
}
@@ -387,7 +398,7 @@ func (c *Command) Start() int {
c.Logger.Error("unknown log level found on reload", "level", newConf.LogLevel)
goto RUNRELOADFUNCS
}
ctlr.SetLogLevel(level)
c.controller.SetLogLevel(level)
}
RUNRELOADFUNCS:
+29 -17
View File
@@ -242,27 +242,40 @@ func (c *Command) Run(args []string) int {
shutdownWg.Add(2)
controllerSighupCh := make(chan struct{})
c.childSighupCh = append(c.childSighupCh, controllerSighupCh)
devController := &controllercmd.Command{
Command: c.Command,
Server: c.Server,
ShutdownCh: childShutdownCh,
SighupCh: controllerSighupCh,
Config: devConfig,
}
if err := devController.Start(); err != nil {
c.UI.Error(err.Error())
return 1
}
workerSighupCh := make(chan struct{})
c.childSighupCh = append(c.childSighupCh, workerSighupCh)
devWorker := &workercmd.Command{
Command: c.Command,
Server: c.Server,
ShutdownCh: childShutdownCh,
SighupCh: workerSighupCh,
Config: devConfig,
}
if err := devWorker.Start(); err != nil {
c.UI.Error(err.Error())
return 1
}
go func() {
defer shutdownWg.Done()
devController := &controllercmd.Command{
Command: c.Command,
Server: c.Server,
ShutdownCh: childShutdownCh,
SighupCh: controllerSighupCh,
Config: devConfig,
}
devController.Start()
devController.WaitForInterrupt()
}()
go func() {
defer shutdownWg.Done()
devWorker := &workercmd.Command{
Command: c.Command,
Server: c.Server,
ShutdownCh: childShutdownCh,
SighupCh: controllerSighupCh,
Config: devConfig,
}
devWorker.Start()
devWorker.WaitForInterrupt()
}()
// Wait for shutdown
@@ -290,7 +303,6 @@ func (c *Command) Run(args []string) int {
}
}
// Wait for dependent goroutines to complete
shutdownWg.Wait()
return 0
+24 -13
View File
@@ -31,6 +31,7 @@ type Command struct {
cleanupGuard sync.Once
Config *config.Config
worker *worker.Worker
flagConfig string
flagLogLevel string
@@ -178,7 +179,12 @@ func (c *Command) Run(args []string) int {
c.PrintInfo(c.UI, "worker")
c.ReleaseLogGate()
return c.Start()
if err := c.Start(); err != nil {
c.UI.Error(err.Error())
return 1
}
return c.WaitForInterrupt()
}
func (c *Command) ParseFlagsAndConfig(args []string) int {
@@ -218,7 +224,7 @@ func (c *Command) ParseFlagsAndConfig(args []string) int {
return 0
}
func (c *Command) Start() int {
func (c *Command) Start() error {
// Instantiate the wait group
conf := &worker.Config{
RawConfig: c.Config,
@@ -226,20 +232,25 @@ func (c *Command) Start() int {
}
// Initialize the core
wrkr, err := worker.New(conf)
var err error
c.worker, err = worker.New(conf)
if err != nil {
c.UI.Error(fmt.Errorf("Error initializing worker: %w", err).Error())
return 1
return fmt.Errorf("Error initializing worker: %w", err)
}
if err := wrkr.Start(); err != nil {
c.UI.Error(fmt.Errorf("Error starting worker: %w", err).Error())
if err := wrkr.Shutdown(); err != nil {
c.UI.Error(fmt.Errorf("Error with worker shutdown: %w", err).Error())
if err := c.worker.Start(); err != nil {
retErr := fmt.Errorf("Error starting worker: %w", err)
if err := c.worker.Shutdown(); err != nil {
c.UI.Error(retErr.Error())
retErr = fmt.Errorf("Error with worker shutdown: %w", err)
}
return 1
return retErr
}
return nil
}
func (c *Command) WaitForInterrupt() int {
// Wait for shutdown
shutdownTriggered := false
@@ -248,7 +259,7 @@ func (c *Command) Start() int {
case <-c.ShutdownCh:
c.UI.Output("==> Watchtower worker shutdown triggered")
if err := wrkr.Shutdown(); err != nil {
if err := c.worker.Shutdown(); err != nil {
c.UI.Error(fmt.Errorf("Error with worker shutdown: %w", err).Error())
}
@@ -279,7 +290,7 @@ func (c *Command) Start() int {
}
// Commented out until we need this
//wrkr.SetConfig(config)
//c.worker.SetConfig(config)
if newConf.LogLevel != "" {
configLogLevel := strings.ToLower(strings.TrimSpace(newConf.LogLevel))
@@ -298,7 +309,7 @@ func (c *Command) Start() int {
c.Logger.Error("unknown log level found on reload", "level", newConf.LogLevel)
goto RUNRELOADFUNCS
}
wrkr.SetLogLevel(level)
c.worker.SetLogLevel(level)
}
RUNRELOADFUNCS: