Server state handling; auto start servers if they were running when the daemon stopped
This commit is contained in:
parent
47c7c872fc
commit
85762ba4b9
|
@ -29,7 +29,7 @@ type Server struct {
|
||||||
Suspended bool `json:"suspended"`
|
Suspended bool `json:"suspended"`
|
||||||
|
|
||||||
// The power state of the server.
|
// The power state of the server.
|
||||||
State string `json:"state" yaml:"-"`
|
State string `default:"offline" json:"state"`
|
||||||
|
|
||||||
// The command that should be used when booting up the server instance.
|
// The command that should be used when booting up the server instance.
|
||||||
Invocation string `json:"invocation"`
|
Invocation string `json:"invocation"`
|
||||||
|
@ -224,7 +224,6 @@ func FromConfiguration(data []byte, cfg *config.SystemConfiguration) (*Server, e
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
s.State = ProcessOfflineState
|
|
||||||
s.Environment = env
|
s.Environment = env
|
||||||
s.Cache = cache.New(time.Minute*10, time.Minute*15)
|
s.Cache = cache.New(time.Minute*10, time.Minute*15)
|
||||||
s.Filesystem = &Filesystem{
|
s.Filesystem = &Filesystem{
|
||||||
|
|
74
wings.go
74
wings.go
|
@ -5,8 +5,10 @@ import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/pterodactyl/wings/config"
|
"github.com/pterodactyl/wings/config"
|
||||||
"github.com/pterodactyl/wings/server"
|
"github.com/pterodactyl/wings/server"
|
||||||
|
"github.com/remeh/sizedwaitgroup"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
@ -68,26 +70,66 @@ func main() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Just for some nice log output.
|
||||||
for _, s := range servers {
|
for _, s := range servers {
|
||||||
zap.S().Infow("loaded configuration for server", zap.String("server", s.Uuid))
|
zap.S().Infow("loaded configuration for server", zap.String("server", s.Uuid))
|
||||||
zap.S().Infow("ensuring envrionment exists", zap.String("server", s.Uuid))
|
|
||||||
|
|
||||||
if err := s.Environment.Create(); err != nil {
|
|
||||||
zap.S().Errorw("failed to create an environment for server", zap.String("server", s.Uuid), zap.Error(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
if r, err := s.Environment.IsRunning(); err != nil {
|
|
||||||
zap.S().Errorw("error checking server environment status", zap.String("server", s.Uuid), zap.Error(err))
|
|
||||||
} else if r {
|
|
||||||
zap.S().Infow("detected server is running, re-attaching to process", zap.String("server", s.Uuid))
|
|
||||||
s.SetState(server.ProcessRunningState)
|
|
||||||
if err := s.Environment.Attach(); err != nil {
|
|
||||||
zap.S().Errorw("error attaching to server environment", zap.String("server", s.Uuid), zap.Error(err))
|
|
||||||
s.SetState(server.ProcessOfflineState)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a new WaitGroup that limits us to 4 servers being bootstrapped at a time
|
||||||
|
// on Wings. This allows us to ensure the environment exists, write configurations,
|
||||||
|
// and reboot processes without causing a slow-down due to sequential booting.
|
||||||
|
wg := sizedwaitgroup.New(4)
|
||||||
|
|
||||||
|
for _, serv := range servers {
|
||||||
|
go func(s *server.Server) {
|
||||||
|
defer wg.Done()
|
||||||
|
|
||||||
|
// Create a server environment if none exists currently. This allows us to recover from Docker
|
||||||
|
// being reinstalled on the host system for example.
|
||||||
|
zap.S().Infow("ensuring envrionment exists", zap.String("server", s.Uuid))
|
||||||
|
if err := s.Environment.Create(); err != nil {
|
||||||
|
zap.S().Errorw("failed to create an environment for server", zap.String("server", s.Uuid), zap.Error(err))
|
||||||
|
}
|
||||||
|
|
||||||
|
if r, err := s.Environment.IsRunning(); err != nil {
|
||||||
|
zap.S().Errorw("error checking server environment status", zap.String("server", s.Uuid), zap.Error(err))
|
||||||
|
} else if r {
|
||||||
|
// If the server is currently running on Docker, mark the process as being in that state.
|
||||||
|
// We never want to stop an instance that is currently running external from Wings since
|
||||||
|
// that is a good way of keeping things running even if Wings gets in a very corrupted state.
|
||||||
|
zap.S().Infow("detected server is running, re-attaching to process", zap.String("server", s.Uuid))
|
||||||
|
s.SetState(server.ProcessRunningState)
|
||||||
|
|
||||||
|
// If we cannot attach to the environment go ahead and mark the processs as being offline.
|
||||||
|
if err := s.Environment.Attach(); err != nil {
|
||||||
|
zap.S().Warnw("error attaching to server environment", zap.String("server", s.Uuid), zap.Error(err))
|
||||||
|
s.SetState(server.ProcessOfflineState)
|
||||||
|
}
|
||||||
|
} else if !r {
|
||||||
|
// If the server is not in a running state right now but according to the configuration it
|
||||||
|
// should be, we want to go ahead and restart the instance.
|
||||||
|
if s.State == server.ProcessRunningState || s.State == server.ProcessStartingState {
|
||||||
|
if err := s.Environment.Start(); err != nil {
|
||||||
|
zap.S().Warnw(
|
||||||
|
"failed to put server instance back in running state",
|
||||||
|
zap.String("server", s.Uuid),
|
||||||
|
zap.Error(errors.WithStack(err)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if s.State == "" {
|
||||||
|
// Addresses potentially invalid data in the stored file that can cause Wings to lose
|
||||||
|
// track of what the actual server state is.
|
||||||
|
s.SetState(server.ProcessOfflineState)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}(serv)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait until all of the servers are ready to go before we fire up the HTTP server.
|
||||||
|
wg.Wait()
|
||||||
|
|
||||||
r := &Router{
|
r := &Router{
|
||||||
Servers: servers,
|
Servers: servers,
|
||||||
token: c.AuthenticationToken,
|
token: c.AuthenticationToken,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user