Don't freak out if the server doesn't exist on the remote
This commit is contained in:
		
							parent
							
								
									514c16ccc8
								
							
						
					
					
						commit
						92a7c9d231
					
				| 
						 | 
					@ -3,7 +3,6 @@ package api
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"github.com/pkg/errors"
 | 
					 | 
				
			||||||
	"github.com/pterodactyl/wings/parser"
 | 
						"github.com/pterodactyl/wings/parser"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,25 +28,25 @@ type ServerConfiguration struct {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Fetches the server configuration and returns the struct for it.
 | 
					// Fetches the server configuration and returns the struct for it.
 | 
				
			||||||
func (r *PanelRequest) GetServerConfiguration(uuid string) (*ServerConfiguration, error) {
 | 
					func (r *PanelRequest) GetServerConfiguration(uuid string) (*ServerConfiguration, *RequestError, error) {
 | 
				
			||||||
	resp, err := r.Get(fmt.Sprintf("/servers/%s/configuration", uuid))
 | 
						resp, err := r.Get(fmt.Sprintf("/servers/%s/configuration", uuid))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	defer resp.Body.Close()
 | 
						defer resp.Body.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r.Response = resp
 | 
						r.Response = resp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if r.HasError() {
 | 
						if r.HasError() {
 | 
				
			||||||
		return nil, errors.WithStack(errors.New(r.Error().String()))
 | 
							return nil, r.Error(), nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res := &ServerConfiguration{}
 | 
						res := &ServerConfiguration{}
 | 
				
			||||||
	b, _ := r.ReadBody()
 | 
						b, _ := r.ReadBody()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := json.Unmarshal(b, res); err != nil {
 | 
						if err := json.Unmarshal(b, res); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return res, nil
 | 
						return res, nil, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,9 +151,11 @@ func (d *DockerEnvironment) InSituUpdate() error {
 | 
				
			||||||
// state. This ensures that unexpected container deletion while Wings is running does
 | 
					// state. This ensures that unexpected container deletion while Wings is running does
 | 
				
			||||||
// not result in the server becoming unbootable.
 | 
					// not result in the server becoming unbootable.
 | 
				
			||||||
func (d *DockerEnvironment) OnBeforeStart() error {
 | 
					func (d *DockerEnvironment) OnBeforeStart() error {
 | 
				
			||||||
	c, err := d.Server.GetProcessConfiguration()
 | 
						c, rerr, err := d.Server.GetProcessConfiguration()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return errors.WithStack(err)
 | 
							return err
 | 
				
			||||||
 | 
						} else if rerr != nil {
 | 
				
			||||||
 | 
							return errors.New(rerr.String())
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	d.Server.processConfiguration = c
 | 
						d.Server.processConfiguration = c
 | 
				
			||||||
| 
						 | 
					@ -164,7 +166,7 @@ func (d *DockerEnvironment) OnBeforeStart() error {
 | 
				
			||||||
	if d.Server.Container.RebuildRequired {
 | 
						if d.Server.Container.RebuildRequired {
 | 
				
			||||||
		if err := d.Client.ContainerRemove(context.Background(), d.Server.Uuid, types.ContainerRemoveOptions{RemoveVolumes: true}); err != nil {
 | 
							if err := d.Client.ContainerRemove(context.Background(), d.Server.Uuid, types.ContainerRemoveOptions{RemoveVolumes: true}); err != nil {
 | 
				
			||||||
			if !client.IsErrNotFound(err) {
 | 
								if !client.IsErrNotFound(err) {
 | 
				
			||||||
				return errors.WithStack(err)
 | 
									return err
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -181,7 +183,7 @@ func (d *DockerEnvironment) OnBeforeStart() error {
 | 
				
			||||||
				zap.S().Warnw(
 | 
									zap.S().Warnw(
 | 
				
			||||||
					"failed to write server configuration to disk after setting rebuild_required=false in configuration",
 | 
										"failed to write server configuration to disk after setting rebuild_required=false in configuration",
 | 
				
			||||||
					zap.String("server", serv.Uuid),
 | 
										zap.String("server", serv.Uuid),
 | 
				
			||||||
					zap.Error(err),
 | 
										zap.Error(errors.WithStack(err)),
 | 
				
			||||||
				)
 | 
									)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}(d.Server)
 | 
							}(d.Server)
 | 
				
			||||||
| 
						 | 
					@ -195,7 +197,7 @@ func (d *DockerEnvironment) OnBeforeStart() error {
 | 
				
			||||||
	// environment gets created properly if it is missing and the server is started. We're making
 | 
						// environment gets created properly if it is missing and the server is started. We're making
 | 
				
			||||||
	// an assumption that all of the files will still exist at this point.
 | 
						// an assumption that all of the files will still exist at this point.
 | 
				
			||||||
	if err := d.Create(); err != nil {
 | 
						if err := d.Create(); err != nil {
 | 
				
			||||||
		return errors.WithStack(err)
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,3 +25,16 @@ func IsTooFrequentCrashError(err error) bool {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ok
 | 
						return ok
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type serverDoesNotExist struct {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e *serverDoesNotExist) Error() string {
 | 
				
			||||||
 | 
						return "server does not exist on remote system"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IsServerDoesNotExistError(err error) bool {
 | 
				
			||||||
 | 
						_, ok := err.(*serverDoesNotExist)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ok
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -179,7 +179,12 @@ func LoadDirectory(dir string, cfg *config.SystemConfiguration) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			s, err := FromConfiguration(b, cfg)
 | 
								s, err := FromConfiguration(b, cfg)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
 | 
									if IsServerDoesNotExistError(err) {
 | 
				
			||||||
 | 
										zap.S().Infow("server does not exist on remote system", zap.String("server", file.Name()))
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
					zap.S().Errorw("failed to parse server configuration, skipping...", zap.String("server", file.Name()), zap.Error(err))
 | 
										zap.S().Errorw("failed to parse server configuration, skipping...", zap.String("server", file.Name()), zap.Error(err))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -241,8 +246,16 @@ func FromConfiguration(data []byte, cfg *config.SystemConfiguration) (*Server, e
 | 
				
			||||||
	// This is also done when the server is booted, however we need to account for instances
 | 
						// This is also done when the server is booted, however we need to account for instances
 | 
				
			||||||
	// where the server is already running and the Daemon reboots. In those cases this will
 | 
						// where the server is already running and the Daemon reboots. In those cases this will
 | 
				
			||||||
	// allow us to you know, stop servers.
 | 
						// allow us to you know, stop servers.
 | 
				
			||||||
	if cfg, err := s.GetProcessConfiguration(); err != nil {
 | 
						if cfg, rerr, err := s.GetProcessConfiguration(); err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
 | 
						} else if rerr != nil {
 | 
				
			||||||
 | 
							// If the response error is because a server does not exist on the Panel return
 | 
				
			||||||
 | 
							// that so that we can handle that in the future.
 | 
				
			||||||
 | 
							if rerr.Status == "404" {
 | 
				
			||||||
 | 
								return nil, &serverDoesNotExist{}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return nil, errors.New(rerr.String())
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		s.processConfiguration = cfg
 | 
							s.processConfiguration = cfg
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -331,6 +344,6 @@ func (s *Server) SetState(state string) error {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Gets the process configuration data for the server.
 | 
					// Gets the process configuration data for the server.
 | 
				
			||||||
func (s *Server) GetProcessConfiguration() (*api.ServerConfiguration, error) {
 | 
					func (s *Server) GetProcessConfiguration() (*api.ServerConfiguration, *api.RequestError, error) {
 | 
				
			||||||
	return api.NewRequester().GetServerConfiguration(s.Uuid)
 | 
						return api.NewRequester().GetServerConfiguration(s.Uuid)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user