server need .Stop() and .Destroy()
This commit is contained in:
parent
c148e120f3
commit
b15fcb2242
|
@ -90,12 +90,12 @@ func main() {
|
||||||
ioutil.WriteFile(path.Join(serverConfig.ConfigDir, "serverbundle"), []byte(server.TofuBundle()), 0600)
|
ioutil.WriteFile(path.Join(serverConfig.ConfigDir, "serverbundle"), []byte(server.TofuBundle()), 0600)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Graceful Shutdown
|
// Graceful Stop
|
||||||
c := make(chan os.Signal, 1)
|
c := make(chan os.Signal, 1)
|
||||||
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
||||||
go func() {
|
go func() {
|
||||||
<-c
|
<-c
|
||||||
server.Shutdown()
|
server.Destroy()
|
||||||
acn.Close()
|
acn.Close()
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}()
|
}()
|
||||||
|
|
27
server.go
27
server.go
|
@ -33,7 +33,8 @@ type Server interface {
|
||||||
Run(acn connectivity.ACN) error
|
Run(acn connectivity.ACN) error
|
||||||
KeyBundle() *model.KeyBundle
|
KeyBundle() *model.KeyBundle
|
||||||
CheckStatus() (bool, error)
|
CheckStatus() (bool, error)
|
||||||
Shutdown()
|
Stop()
|
||||||
|
Destroy()
|
||||||
GetStatistics() Statistics
|
GetStatistics() Statistics
|
||||||
Delete(password string) error
|
Delete(password string) error
|
||||||
Onion() string
|
Onion() string
|
||||||
|
@ -65,6 +66,10 @@ func NewServer(serverConfig *Config) Server {
|
||||||
server.config = serverConfig
|
server.config = serverConfig
|
||||||
server.tokenService = server.config.TokenServiceIdentity()
|
server.tokenService = server.config.TokenServiceIdentity()
|
||||||
server.tokenServicePrivKey = server.config.TokenServerPrivateKey
|
server.tokenServicePrivKey = server.config.TokenServerPrivateKey
|
||||||
|
bs := new(persistence.BoltPersistence)
|
||||||
|
bs.Open(path.Join(serverConfig.ConfigDir, "tokens.db"))
|
||||||
|
server.tokenServer = privacypass.NewTokenServerFromStore(&serverConfig.TokenServiceK, bs)
|
||||||
|
log.Infof("Y: %v", server.tokenServer.Y)
|
||||||
return server
|
return server
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,11 +86,6 @@ func (s *server) Run(acn connectivity.ACN) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
bs := new(persistence.BoltPersistence)
|
|
||||||
bs.Open(path.Join(s.config.ConfigDir, "tokens.db"))
|
|
||||||
s.tokenServer = privacypass.NewTokenServerFromStore(&s.config.TokenServiceK, bs)
|
|
||||||
log.Infof("Y: %v", s.tokenServer.Y)
|
|
||||||
|
|
||||||
identity := primitives.InitializeIdentity("", &s.config.PrivateKey, &s.config.PublicKey)
|
identity := primitives.InitializeIdentity("", &s.config.PrivateKey, &s.config.PublicKey)
|
||||||
var service tapir.Service
|
var service tapir.Service
|
||||||
service = new(tor2.BaseOnionService)
|
service = new(tor2.BaseOnionService)
|
||||||
|
@ -145,8 +145,9 @@ func (s *server) CheckStatus() (bool, error) {
|
||||||
return s.running, nil
|
return s.running, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shutdown kills the app closing all connections and freeing all goroutines
|
// Stop turns off the server so it cannot receive connections and frees most resourses.
|
||||||
func (s *server) Shutdown() {
|
// The server is still in a reRunable state and tokenServer still has an active persistance
|
||||||
|
func (s *server) Stop() {
|
||||||
log.Infof("Shutting down server")
|
log.Infof("Shutting down server")
|
||||||
s.lock.Lock()
|
s.lock.Lock()
|
||||||
defer s.lock.Unlock()
|
defer s.lock.Unlock()
|
||||||
|
@ -154,13 +155,21 @@ func (s *server) Shutdown() {
|
||||||
s.service.Shutdown()
|
s.service.Shutdown()
|
||||||
s.tokenTapirService.Shutdown()
|
s.tokenTapirService.Shutdown()
|
||||||
log.Infof("Closing Token server Database...")
|
log.Infof("Closing Token server Database...")
|
||||||
s.tokenServer.Close()
|
|
||||||
s.metricsPack.Stop()
|
s.metricsPack.Stop()
|
||||||
s.running = false
|
s.running = false
|
||||||
s.SetAttribute(AttrEnabled, "false")
|
s.SetAttribute(AttrEnabled, "false")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Destroy frees the last of the resources the server has active (toklenServer persistance) leaving it un-re-runable and completely shutdown
|
||||||
|
func (s *server) Destroy() {
|
||||||
|
s.Stop()
|
||||||
|
s.lock.Lock()
|
||||||
|
defer s.lock.Unlock()
|
||||||
|
s.tokenServer.Close()
|
||||||
|
}
|
||||||
|
|
||||||
// Statistics is an encapsulation of information about the server that an operator might want to know at a glance.
|
// Statistics is an encapsulation of information about the server that an operator might want to know at a glance.
|
||||||
type Statistics struct {
|
type Statistics struct {
|
||||||
TotalMessages int
|
TotalMessages int
|
||||||
|
|
28
servers.go
28
servers.go
|
@ -24,8 +24,9 @@ type Servers interface {
|
||||||
DeleteServer(onion string, currentPassword string) error
|
DeleteServer(onion string, currentPassword string) error
|
||||||
|
|
||||||
LaunchServer(string)
|
LaunchServer(string)
|
||||||
ShutdownServer(string)
|
StopServer(string)
|
||||||
Shutdown()
|
Stop()
|
||||||
|
Destroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
type servers struct {
|
type servers struct {
|
||||||
|
@ -105,7 +106,7 @@ func (s *servers) DeleteServer(onion string, password string) error {
|
||||||
defer s.lock.Unlock()
|
defer s.lock.Unlock()
|
||||||
server := s.servers[onion]
|
server := s.servers[onion]
|
||||||
if server != nil {
|
if server != nil {
|
||||||
server.Shutdown()
|
server.Destroy()
|
||||||
err := server.Delete(password)
|
err := server.Delete(password)
|
||||||
delete(s.servers, onion)
|
delete(s.servers, onion)
|
||||||
return err
|
return err
|
||||||
|
@ -122,18 +123,27 @@ func (s *servers) LaunchServer(onion string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShutdownServer Shutsdown the specified server
|
// StopServer stops the specified server
|
||||||
func (s *servers) ShutdownServer(onion string) {
|
func (s *servers) StopServer(onion string) {
|
||||||
s.lock.Lock()
|
s.lock.Lock()
|
||||||
defer s.lock.Unlock()
|
defer s.lock.Unlock()
|
||||||
s.servers[onion].Shutdown()
|
s.servers[onion].Stop()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shutdown shutsdown all the servers
|
// Stop stops all the servers
|
||||||
func (s *servers) Shutdown() {
|
func (s *servers) Stop() {
|
||||||
s.lock.Lock()
|
s.lock.Lock()
|
||||||
defer s.lock.Unlock()
|
defer s.lock.Unlock()
|
||||||
for _, server := range s.servers {
|
for _, server := range s.servers {
|
||||||
server.Shutdown()
|
server.Stop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destroy destroys all the servers
|
||||||
|
func (s *servers) Destroy() {
|
||||||
|
s.lock.Lock()
|
||||||
|
defer s.lock.Unlock()
|
||||||
|
for _, server := range s.servers {
|
||||||
|
server.Destroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,12 +14,12 @@ const TestServerDesc = "a test Server"
|
||||||
|
|
||||||
func TestServers(t *testing.T) {
|
func TestServers(t *testing.T) {
|
||||||
log.SetLevel(log.LevelDebug)
|
log.SetLevel(log.LevelDebug)
|
||||||
log.Infof("clean up / setup...\n")
|
log.Infof("clean up / setup...")
|
||||||
os.RemoveAll(TestDir)
|
os.RemoveAll(TestDir)
|
||||||
os.Mkdir(TestDir, 0700)
|
os.Mkdir(TestDir, 0700)
|
||||||
|
|
||||||
acn := connectivity.NewLocalACN()
|
acn := connectivity.NewLocalACN()
|
||||||
log.Infof("NewServers()...\n")
|
log.Infof("NewServers()...")
|
||||||
servers := NewServers(acn, TestDir)
|
servers := NewServers(acn, TestDir)
|
||||||
s, err := servers.CreateServer(DefaultPassword)
|
s, err := servers.CreateServer(DefaultPassword)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -29,13 +29,13 @@ func TestServers(t *testing.T) {
|
||||||
s.SetAttribute(AttrDescription, TestServerDesc)
|
s.SetAttribute(AttrDescription, TestServerDesc)
|
||||||
serverOnion := s.Onion()
|
serverOnion := s.Onion()
|
||||||
|
|
||||||
s.Shutdown()
|
s.Destroy()
|
||||||
|
|
||||||
log.Infof("NewServers()...\n" )
|
log.Infof("NewServers()...")
|
||||||
servers2 := NewServers(acn, TestDir)
|
servers2 := NewServers(acn, TestDir)
|
||||||
log.Infof("LoadServers()...\n")
|
log.Infof("LoadServers()...")
|
||||||
list, err := servers2.LoadServers(DefaultPassword)
|
list, err := servers2.LoadServers(DefaultPassword)
|
||||||
log.Infof("Loaded!\n")
|
log.Infof("Loaded!")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("clould not load server: %s", err)
|
t.Errorf("clould not load server: %s", err)
|
||||||
return
|
return
|
||||||
|
@ -54,6 +54,6 @@ func TestServers(t *testing.T) {
|
||||||
t.Errorf("expected server description of '%s' but got '%s'", TestServerDesc, s1.GetAttribute(AttrDescription))
|
t.Errorf("expected server description of '%s' but got '%s'", TestServerDesc, s1.GetAttribute(AttrDescription))
|
||||||
}
|
}
|
||||||
|
|
||||||
servers2.Shutdown()
|
servers2.Destroy()
|
||||||
os.RemoveAll(TestDir)
|
os.RemoveAll(TestDir)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue