@@ -3,10 +3,12 @@ package server
33import (
44 "crypto/tls"
55 "fmt"
6+ "net"
67 "net/http"
78 "os"
89 "path/filepath"
910 "strings"
11+ "sync"
1012
1113 "github.com/cego/nebula-provisioner/protocol"
1214 "github.com/cego/nebula-provisioner/server/store"
@@ -17,15 +19,17 @@ import (
1719)
1820
1921type server struct {
20- l * logrus.Logger
21- config * config.C
22- buildVersion string
23- initialized bool
24- store * store.Store
25- ipManager * store.IPManager
26- unixGrpc * grpc.Server
27- agentService * grpc.Server
28- tasks * tasks
22+ l * logrus.Logger
23+ config * config.C
24+ buildVersion string
25+ initialized bool
26+ store * store.Store
27+ ipManager * store.IPManager
28+ unixGrpc * grpc.Server
29+ agentService * grpc.Server
30+ tasks * tasks
31+ tlsLock sync.RWMutex
32+ tlsCertificate * tls.Certificate
2933}
3034
3135func Main (config * config.C , buildVersion string , logger * logrus.Logger ) (* Control , error ) {
@@ -34,7 +38,7 @@ func Main(config *config.C, buildVersion string, logger *logrus.Logger) (*Contro
3438 FullTimestamp : true ,
3539 }
3640
37- server := server {l , config , buildVersion , false , nil , nil , nil , nil , nil }
41+ server := server {l : l , config : config , buildVersion : buildVersion }
3842
3943 return & Control {l , server .start , server .stop , make (chan interface {})}, nil
4044}
@@ -164,17 +168,31 @@ func (s *server) startHttpsServer(dataDir string) error {
164168
165169 tlsConfig = manager .TLSConfig ()
166170 } else {
167-
168- cert := s .config .GetString ("pki.cert" , "server.crt" )
169- key := s .config .GetString ("pki.key" , "server.key" )
170-
171- keyPair , err := tls .LoadX509KeyPair (cert , key )
171+ s .config .RegisterReloadCallback (func (_ * config.C ) {
172+ s .l .Info ("Reloading tls cert" )
173+ keyPair , err := s .getKeyPair ()
174+ if err != nil {
175+ return
176+ }
177+ s .tlsLock .Lock ()
178+ defer s .tlsLock .Unlock ()
179+ s .tlsCertificate = keyPair
180+ })
181+
182+ keyPair , err := s .getKeyPair ()
172183 if err != nil {
173- s .l .WithError (err ).Errorf ("SERVER: unable to read server key pair: %v" , err )
174184 return err
175185 }
186+ s .tlsLock .Lock ()
187+ defer s .tlsLock .Unlock ()
188+ s .tlsCertificate = keyPair
189+
176190 tlsConfig = & tls.Config {
177- Certificates : []tls.Certificate {keyPair },
191+ GetCertificate : func (_ * tls.ClientHelloInfo ) (* tls.Certificate , error ) {
192+ s .tlsLock .RLock ()
193+ defer s .tlsLock .RUnlock ()
194+ return s .tlsCertificate , nil
195+ },
178196 }
179197 }
180198
@@ -198,6 +216,52 @@ func (s *server) startHttpsServer(dataDir string) error {
198216 return nil
199217}
200218
219+ func (s * server ) getKeyPair () (* tls.Certificate , error ) {
220+ cert := s .config .GetString ("pki.cert" , "server.crt" )
221+ key := s .config .GetString ("pki.key" , "server.key" )
222+
223+ keyPair , err := tls .LoadX509KeyPair (cert , key )
224+ if err != nil {
225+ s .l .WithError (err ).Errorf ("SERVER: unable to read server key pair: %v" , err )
226+ return nil , err
227+ }
228+ return & keyPair , nil
229+ }
230+
231+ func (s * server ) startUnixSocket (store * store.Store ) error {
232+ s .l .Println ("Starting http unix socket" )
233+ socketPath := s .config .GetString ("command.socket" , "/tmp/nebula-provisioner.socket" ) // TODO Change default path
234+ lis , err := net .Listen ("unix" , socketPath )
235+ if err != nil {
236+ return err
237+ }
238+
239+ var opts []grpc.ServerOption
240+ s .unixGrpc = grpc .NewServer (opts ... )
241+
242+ c := commandServer {
243+ l : s .l ,
244+ store : store ,
245+ ipManager : s .ipManager ,
246+ }
247+ protocol .RegisterServerCommandServer (s .unixGrpc , & c )
248+ go func () {
249+ err := s .unixGrpc .Serve (lis )
250+ if err != nil {
251+ s .l .WithError (err ).Error ("Failed to start http unix socket" )
252+ }
253+ }()
254+ return nil
255+ }
256+
257+ func (s * server ) stopUnixSocket () error {
258+ s .l .Println ("Stopping http unix socket" )
259+ if s .unixGrpc != nil {
260+ s .unixGrpc .GracefulStop ()
261+ }
262+ return nil
263+ }
264+
201265func grpcHandlerFunc (g * grpc.Server , h http.Handler ) http.Handler {
202266 return http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
203267 ct := r .Header .Get ("Content-Type" )
0 commit comments