2020-07-19 23:27:55 +00:00
|
|
|
package server
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
|
|
|
type EnvironmentVariables map[string]interface{}
|
|
|
|
|
|
|
|
// Ugly hacky function to handle environment variables that get passed through as not-a-string
|
|
|
|
// from the Panel. Ideally we'd just say only pass strings, but that is a fragile idea and if a
|
|
|
|
// string wasn't passed through you'd cause a crash or the server to become unavailable. For now
|
|
|
|
// try to handle the most likely values from the JSON and hope for the best.
|
|
|
|
func (ev EnvironmentVariables) Get(key string) string {
|
|
|
|
val, ok := ev[key]
|
|
|
|
if !ok {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
switch val.(type) {
|
|
|
|
case int:
|
|
|
|
return strconv.Itoa(val.(int))
|
|
|
|
case int32:
|
|
|
|
return strconv.FormatInt(val.(int64), 10)
|
|
|
|
case int64:
|
|
|
|
return strconv.FormatInt(val.(int64), 10)
|
|
|
|
case float32:
|
|
|
|
return fmt.Sprintf("%f", val.(float32))
|
|
|
|
case float64:
|
|
|
|
return fmt.Sprintf("%f", val.(float64))
|
|
|
|
case bool:
|
|
|
|
return strconv.FormatBool(val.(bool))
|
|
|
|
}
|
|
|
|
|
|
|
|
return val.(string)
|
|
|
|
}
|
|
|
|
|
|
|
|
type Configuration struct {
|
|
|
|
mu sync.RWMutex
|
|
|
|
|
|
|
|
// The unique identifier for the server that should be used when referencing
|
|
|
|
// it against the Panel API (and internally). This will be used when naming
|
|
|
|
// docker containers as well as in log output.
|
|
|
|
Uuid string `json:"uuid"`
|
|
|
|
|
|
|
|
// Whether or not the server is in a suspended state. Suspended servers cannot
|
|
|
|
// be started or modified except in certain scenarios by an admin user.
|
|
|
|
Suspended bool `json:"suspended"`
|
|
|
|
|
|
|
|
// The command that should be used when booting up the server instance.
|
|
|
|
Invocation string `json:"invocation"`
|
|
|
|
|
|
|
|
// An array of environment variables that should be passed along to the running
|
|
|
|
// server process.
|
|
|
|
EnvVars EnvironmentVariables `json:"environment"`
|
|
|
|
|
|
|
|
Allocations Allocations `json:"allocations"`
|
|
|
|
Build BuildSettings `json:"build"`
|
|
|
|
CrashDetectionEnabled bool `default:"true" json:"enabled" yaml:"enabled"`
|
|
|
|
Mounts []Mount `json:"mounts"`
|
|
|
|
Resources ResourceUsage `json:"resources"`
|
|
|
|
|
|
|
|
Container struct {
|
|
|
|
// Defines the Docker image that will be used for this server
|
|
|
|
Image string `json:"image,omitempty"`
|
|
|
|
// If set to true, OOM killer will be disabled on the server's Docker container.
|
|
|
|
// If not present (nil) we will default to disabling it.
|
|
|
|
OomDisabled bool `default:"true" json:"oom_disabled"`
|
|
|
|
} `json:"container,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Server) Config() *Configuration {
|
|
|
|
s.cfg.mu.RLock()
|
|
|
|
defer s.cfg.mu.RUnlock()
|
|
|
|
|
|
|
|
return &s.cfg
|
|
|
|
}
|
|
|
|
|
2020-07-20 00:46:39 +00:00
|
|
|
func (c *Configuration) GetUuid() string {
|
|
|
|
c.mu.RLock()
|
|
|
|
defer c.mu.RUnlock()
|
|
|
|
|
|
|
|
return c.Uuid
|
|
|
|
}
|
|
|
|
|
2020-07-19 23:27:55 +00:00
|
|
|
func (c *Configuration) SetSuspended(s bool) {
|
|
|
|
c.mu.Lock()
|
|
|
|
c.Suspended = s
|
|
|
|
c.mu.Unlock()
|
|
|
|
}
|