diff --git a/cmd/configure.go b/cmd/configure.go index 40be675..588639a 100644 --- a/cmd/configure.go +++ b/cmd/configure.go @@ -22,6 +22,7 @@ var ( configureArgs struct { PanelURL string Token string + ConfigPath string Node string Override bool AllowInsecure bool @@ -40,6 +41,7 @@ func init() { configureCmd.PersistentFlags().StringVarP(&configureArgs.PanelURL, "panel-url", "p", "", "The base URL for this daemon's panel") configureCmd.PersistentFlags().StringVarP(&configureArgs.Token, "token", "t", "", "The API key to use for fetching node information") configureCmd.PersistentFlags().StringVarP(&configureArgs.Node, "node", "n", "", "The ID of the node which will be connected to this daemon") + configureCmd.PersistentFlags().StringVarP(&configureArgs.ConfigPath, "config-path", "c", config.DefaultLocation, "The path where the configuration file should be made") configureCmd.PersistentFlags().BoolVar(&configureArgs.Override, "override", false, "Set to true to override an existing configuration for this node") configureCmd.PersistentFlags().BoolVar(&configureArgs.AllowInsecure, "allow-insecure", false, "Set to true to disable certificate checking") } @@ -51,7 +53,7 @@ func configureCmdRun(cmd *cobra.Command, args []string) { } } - if _, err := os.Stat("config.yml"); err == nil && !configureArgs.Override { + if _, err := os.Stat(configureArgs.ConfigPath); err == nil && !configureArgs.Override { survey.AskOne(&survey.Confirm{Message: "Override existing configuration file"}, &configureArgs.Override) if !configureArgs.Override { fmt.Println("Aborting process; a configuration file already exists for this node.") diff --git a/cmd/root.go b/cmd/root.go index 0d9c7d8..3d59a5e 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -5,6 +5,8 @@ import ( "fmt" "net/http" "os" + "path" + "strings" "github.com/pkg/errors" "github.com/pkg/profile" @@ -19,7 +21,7 @@ import ( "go.uber.org/zap" ) -var configPath = "config.yml" +var configPath = config.DefaultLocation var debug = false var shouldRunProfiler = false @@ -31,20 +33,41 @@ var root = &cobra.Command{ } func init() { - root.PersistentFlags().StringVar(&configPath, "config", "config.yml", "set the location for the configuration file") + root.PersistentFlags().StringVar(&configPath, "config", config.DefaultLocation, "set the location for the configuration file") root.PersistentFlags().BoolVar(&debug, "debug", false, "pass in order to run wings in debug mode") root.PersistentFlags().BoolVar(&shouldRunProfiler, "profile", false, "pass in order to profile wings") root.AddCommand(configureCmd) } +// Get the configuration path based on the arguments provided. +func readConfiguration() (*config.Configuration, error) { + var p = configPath + if !strings.HasPrefix(p, "/") { + d, err := os.Getwd() + if err != nil { + return nil, err + } + + p = path.Clean(path.Join(d, configPath)) + } + + if s, err := os.Stat(p); err != nil { + return nil, errors.WithStack(err) + } else if s.IsDir() { + return nil, errors.New("cannot use directory as configuration file path") + } + + return config.ReadConfiguration(p) +} + func rootCmdRun(*cobra.Command, []string) { // Profile wings in production!!!! if shouldRunProfiler { defer profile.Start().Stop() } - c, err := config.ReadConfiguration(configPath) + c, err := readConfiguration() if err != nil { panic(err) } @@ -71,6 +94,11 @@ func rootCmdRun(*cobra.Command, []string) { config.Set(c) config.SetDebugViaFlag(debug) + if err := c.System.ConfigureDirectories(); err != nil { + zap.S().Panicw("failed to configure system directories for pterodactyl", zap.Error(err)) + return + } + zap.S().Infof("checking for pterodactyl system user \"%s\"", c.System.Username) if su, err := c.EnsurePterodactylUser(); err != nil { zap.S().Panicw("failed to create pterodactyl system user", zap.Error(err)) diff --git a/config/config.go b/config/config.go index b47ebdd..526757c 100644 --- a/config/config.go +++ b/config/config.go @@ -1,6 +1,7 @@ package config import ( + "errors" "fmt" "github.com/cobaugh/osrelease" "github.com/creasty/defaults" @@ -18,9 +19,14 @@ import ( "sync" ) +const DefaultLocation = "/var/lib/pterodactyl/config.yml" + type Configuration struct { sync.RWMutex `json:"-" yaml:"-"` + // The location from which this configuration instance was instantiated. + path string + // Locker specific to writing the configuration to the disk, this happens // in areas that might already be locked so we don't want to crash the process. writeLock sync.Mutex @@ -76,48 +82,6 @@ type Configuration struct { PanelLocation string `json:"remote" yaml:"remote"` } -// Defines basic system configuration settings. -type SystemConfiguration struct { - // Directory where the server data is stored at. - Data string `default:"/srv/daemon-data" yaml:"data"` - - // Directory where server archives for transferring will be stored. - ArchiveDirectory string `default:"/srv/daemon-data/.archives" yaml:"archive_directory"` - - // Directory where local backups will be stored on the machine. - BackupDirectory string `default:"/srv/daemon-data/.backups" yaml:"backup_directory"` - - // The user that should own all of the server files, and be used for containers. - Username string `default:"pterodactyl" yaml:"username"` - - // Definitions for the user that gets created to ensure that we can quickly access - // this information without constantly having to do a system lookup. - User struct { - Uid int - Gid int - } - - // Determines if permissions for a server should be set automatically on - // daemon boot. This can take a long time on systems with many servers, or on - // systems with servers containing thousands of files. - // - // Setting this to true by default helps us avoid a lot of support requests - // from people that keep trying to move files around as a root user leading - // to server permission issues. - // - // In production and heavy use environments where boot speed is essential, - // this should be set to false as servers will self-correct permissions on - // boot anyways. - SetPermissionsOnBoot bool `default:"true" yaml:"set_permissions_on_boot"` - - // Determines if Wings should detect a server that stops with a normal exit code of - // "0" as being crashed if the process stopped without any Wings interaction. E.g. - // the user did not press the stop button, but the process stopped cleanly. - DetectCleanExitAsCrash bool `default:"true" yaml:"detect_clean_exit_as_crash"` - - Sftp *SftpConfiguration `yaml:"sftp"` -} - // Defines the configuration of the internal SFTP server. type SftpConfiguration struct { // If set to false, the internal SFTP server will not be booted and you will need @@ -218,6 +182,9 @@ func ReadConfiguration(path string) (*Configuration, error) { return nil, err } + // Track the location where we created this configuration. + c.path = path + // Replace environment variables within the configuration file with their // values from the host system. b = []byte(os.ExpandEnv(string(b))) @@ -396,6 +363,10 @@ func (c *Configuration) WriteToDisk() error { ccopy.Debug = false } + if c.path == "" { + return errors.New("cannot write configuration, no path defined in struct") + } + b, err := yaml.Marshal(&ccopy) if err != nil { return err @@ -405,7 +376,7 @@ func (c *Configuration) WriteToDisk() error { c.writeLock.Lock() defer c.writeLock.Unlock() - if err := ioutil.WriteFile("config.yml", b, 0644); err != nil { + if err := ioutil.WriteFile(c.path, b, 0644); err != nil { return err } @@ -415,7 +386,7 @@ func (c *Configuration) WriteToDisk() error { // Gets the system release name. func getSystemName() (string, error) { // use osrelease to get release version and ID - if release, err := osrelease.Read(); err != nil { + if release, err := osrelease.Read(); err != nil { return "", err } else { return release["ID"], nil diff --git a/config/config_system.go b/config/config_system.go new file mode 100644 index 0000000..b5f6095 --- /dev/null +++ b/config/config_system.go @@ -0,0 +1,96 @@ +package config + +import ( + "go.uber.org/zap" + "os" + "path" +) + +// Defines basic system configuration settings. +type SystemConfiguration struct { + // The root directory where all of the pterodactyl data is stored at. + RootDirectory string `default:"/var/lib/pterodactyl" yaml:"root_directory"` + + // Directory where logs for server installations and other wings events are logged. + LogDirectory string `default:"/var/log/pterodactyl" yaml:"log_directory"` + + // Directory where the server data is stored at. + Data string `default:"/var/lib/pterodactyl/volumes" yaml:"data"` + + // Directory where server archives for transferring will be stored. + ArchiveDirectory string `default:"/var/lib/pterodactyl/archives" yaml:"archive_directory"` + + // Directory where local backups will be stored on the machine. + BackupDirectory string `default:"/var/lib/pterodactyl/backups" yaml:"backup_directory"` + + // The user that should own all of the server files, and be used for containers. + Username string `default:"pterodactyl" yaml:"username"` + + // Definitions for the user that gets created to ensure that we can quickly access + // this information without constantly having to do a system lookup. + User struct { + Uid int + Gid int + } + + // Determines if permissions for a server should be set automatically on + // daemon boot. This can take a long time on systems with many servers, or on + // systems with servers containing thousands of files. + // + // Setting this to true by default helps us avoid a lot of support requests + // from people that keep trying to move files around as a root user leading + // to server permission issues. + // + // In production and heavy use environments where boot speed is essential, + // this should be set to false as servers will self-correct permissions on + // boot anyways. + SetPermissionsOnBoot bool `default:"true" yaml:"set_permissions_on_boot"` + + // Determines if Wings should detect a server that stops with a normal exit code of + // "0" as being crashed if the process stopped without any Wings interaction. E.g. + // the user did not press the stop button, but the process stopped cleanly. + DetectCleanExitAsCrash bool `default:"true" yaml:"detect_clean_exit_as_crash"` + + Sftp *SftpConfiguration `yaml:"sftp"` +} + +// Ensures that all of the system directories exist on the system. These directories are +// created so that only the owner can read the data, and no other users. +func (sc *SystemConfiguration) ConfigureDirectories() error { + zap.S().Debugw("ensuring root data directory exists", zap.String("path", sc.RootDirectory)) + if err := os.MkdirAll(sc.RootDirectory, 0700); err != nil { + return err + } + + zap.S().Debugw("ensuring log directory exists", zap.String("path", sc.LogDirectory)) + if err := os.MkdirAll(path.Join(sc.LogDirectory, "/install"), 0700); err != nil { + return err + } + + zap.S().Debugw("ensuring server data directory exists", zap.String("path", sc.Data)) + if err := os.MkdirAll(sc.Data, 0700); err != nil { + return err + } + + zap.S().Debugw("ensuring archive data directory exists", zap.String("path", sc.ArchiveDirectory)) + if err := os.MkdirAll(sc.ArchiveDirectory, 0700); err != nil { + return err + } + + zap.S().Debugw("ensuring backup data directory exists", zap.String("path", sc.BackupDirectory)) + if err := os.MkdirAll(sc.BackupDirectory, 0700); err != nil { + return err + } + + return nil +} + +// Returns the location of the JSON file that tracks server states. +func (sc *SystemConfiguration) GetStatesPath() string { + return path.Join(sc.RootDirectory, "states.json") +} + +// Returns the location of the JSON file that tracks server states. +func (sc *SystemConfiguration) GetInstallLogPath() string { + return path.Join(sc.LogDirectory, "install/") +} diff --git a/data/.gitignore b/data/.gitignore deleted file mode 100644 index 3da70bf..0000000 --- a/data/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -servers/*.yml -!install_logs/.gitkeep -install_logs/* -states.json diff --git a/data/install_logs/.gitkeep b/data/install_logs/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/go.mod b/go.mod index 8a32a07..0c57322 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ require ( github.com/Microsoft/go-winio v0.4.7 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a + github.com/aws/aws-sdk-go v1.30.9 // indirect github.com/beevik/etree v1.1.0 github.com/buger/jsonparser v0.0.0-20191204142016-1a29609e0929 github.com/cobaugh/osrelease v0.0.0-20181218015638-a93a0a55a249 @@ -46,22 +47,24 @@ require ( github.com/opencontainers/go-digest v1.0.0-rc1 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/pkg/errors v0.8.1 + github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.4.0 github.com/pkg/sftp v1.10.1 // indirect github.com/pterodactyl/sftp-server v1.1.1 github.com/remeh/sizedwaitgroup v0.0.0-20180822144253-5e7302b12cce github.com/smartystreets/goconvey v1.6.4 // indirect github.com/spf13/cobra v0.0.7 - github.com/stretchr/testify v1.5.1 // indirect + github.com/stretchr/objx v0.2.0 // indirect + github.com/yuin/goldmark v1.1.30 // indirect go.uber.org/atomic v1.5.1 // indirect go.uber.org/multierr v1.4.0 // indirect go.uber.org/zap v1.13.0 - golang.org/x/crypto v0.0.0-20200403201458-baeed622b8d8 // indirect + golang.org/x/crypto v0.0.0-20200414173820-0848c9571904 // indirect golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f // indirect golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect - golang.org/x/sys v0.0.0-20200331124033-c3d80250170d // indirect - golang.org/x/tools v0.0.0-20200403190813-44a64ad78b9b // indirect + golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a // indirect + golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 // indirect + golang.org/x/tools v0.0.0-20200417140056-c07e33ef3290 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.51.0 gopkg.in/yaml.v2 v2.2.8 diff --git a/go.sum b/go.sum index 7055c64..4c90238 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,8 @@ github.com/andybalholm/brotli v0.0.0-20190621154722-5f990b63d2d6/go.mod h1:+lx6/ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.30.9 h1:DntpBUKkchINPDbhEzDRin1eEn1TG9TZFlzWPf0i8to= +github.com/aws/aws-sdk-go v1.30.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -80,6 +82,7 @@ github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD87 github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= @@ -124,6 +127,8 @@ github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -201,6 +206,8 @@ github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.4.0 h1:uCmaf4vVbWAOZz36k1hrQD7ijGRzLwaME8Am/7a4jZI= github.com/pkg/profile v1.4.0/go.mod h1:NWz/XGvpEW1FyYQ7fCx4dqYBLlfTcE+A9FLAkNKqjFE= github.com/pkg/sftp v1.8.3 h1:9jSe2SxTM8/3bXZjtqnkgTBW+lA8db0knZJyns7gpBA= @@ -244,6 +251,7 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -265,6 +273,7 @@ github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMx github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.uber.org/atomic v1.3.2 h1:2Oa65PReHzfn29GpvgsYwloV9AVFHPDk8tYxt2c2tr4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -294,6 +303,8 @@ golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200403201458-baeed622b8d8 h1:fpnn/HnJONpIu6hkXi1u/7rR0NzilgWr4T0JmWkEitk= golang.org/x/crypto v0.0.0-20200403201458-baeed622b8d8/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904 h1:bXoxMPcSLOq08zI3/c5dEBT6lE4eh+jOh886GHrn6V8= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -311,6 +322,7 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -322,6 +334,7 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -334,6 +347,8 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d h1:nc5K6ox/4lTFbMVSL9WRR81ixkcwXThoiF6yf+R9scA= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY= +golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= @@ -354,6 +369,7 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200403190813-44a64ad78b9b h1:AFZdJUT7jJYXQEC29hYH/WZkoV7+KhwxQGmdZ19yYoY= golang.org/x/tools v0.0.0-20200403190813-44a64ad78b9b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200417140056-c07e33ef3290/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools/gopls v0.1.3/go.mod h1:vrCQzOKxvuiZLjCKSmbbov04oeBQQOb4VQqwYK2PWIY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/server/install.go b/server/install.go index c2bcf2c..e86ada1 100644 --- a/server/install.go +++ b/server/install.go @@ -10,6 +10,7 @@ import ( "github.com/docker/docker/client" "github.com/pkg/errors" "github.com/pterodactyl/wings/api" + "github.com/pterodactyl/wings/config" "go.uber.org/zap" "io" "io/ioutil" @@ -231,6 +232,11 @@ func (ip *InstallationProcess) BeforeExecute() (string, error) { return fileName, nil } +// Returns the log path for the installation process. +func (ip *InstallationProcess) GetLogPath() string { + return filepath.Join(config.Get().System.GetInstallLogPath(), ip.Server.Uuid+".log") +} + // Cleans up after the execution of the installation process. This grabs the logs from the // process to store in the server configuration directory, and then destroys the associated // installation container. @@ -248,7 +254,7 @@ func (ip *InstallationProcess) AfterExecute(containerId string) error { return errors.WithStack(err) } - f, err := os.OpenFile(filepath.Join("data/install_logs/", ip.Server.Uuid+".log"), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + f, err := os.OpenFile(ip.GetLogPath(), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) if err != nil { return errors.WithStack(err) } diff --git a/server/server.go b/server/server.go index 35c29a4..4c9e547 100644 --- a/server/server.go +++ b/server/server.go @@ -230,7 +230,6 @@ func FromConfiguration(data *api.ServerConfigurationResponse) (*Server, error) { s.Resources = ResourceUsage{} // Forces the configuration to be synced with the panel. - zap.S().Debugw("syncing config with panel", zap.String("server", s.Uuid)) if err := s.SyncWithConfiguration(data); err != nil { return nil, err } diff --git a/server/state.go b/server/state.go index 7f1368a..a4d8a36 100644 --- a/server/state.go +++ b/server/state.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "github.com/pkg/errors" + "github.com/pterodactyl/wings/config" "go.uber.org/zap" "io" "io/ioutil" @@ -11,8 +12,6 @@ import ( "sync" ) -const stateFileLocation = "data/.states.json" - var stateMutex sync.Mutex // Returns the state of the servers. @@ -22,7 +21,7 @@ func getServerStates() (map[string]string, error) { defer stateMutex.Unlock() // Open the states file. - f, err := os.OpenFile(stateFileLocation, os.O_RDONLY|os.O_CREATE, 0644) + f, err := os.OpenFile(config.Get().System.GetStatesPath(), os.O_RDONLY|os.O_CREATE, 0644) if err != nil { return nil, errors.WithStack(err) } @@ -55,7 +54,7 @@ func saveServerStates() error { defer stateMutex.Unlock() // Write the data to the file - if err := ioutil.WriteFile(stateFileLocation, data, 0644); err != nil { + if err := ioutil.WriteFile(config.Get().System.GetStatesPath(), data, 0644); err != nil { return errors.WithStack(err) } @@ -141,4 +140,4 @@ func (s *Server) GetState() string { // not the response from Docker. func (s *Server) IsRunning() bool { return s.GetState() == ProcessRunningState || s.GetState() == ProcessStartingState -} \ No newline at end of file +} diff --git a/server/update.go b/server/update.go index 296f106..741bcf8 100644 --- a/server/update.go +++ b/server/update.go @@ -52,11 +52,6 @@ func (s *Server) UpdateDataStructure(data []byte, background bool) error { } } else { s.Suspended = v - if s.Suspended { - zap.S().Debugw("server has been suspended", zap.String("server", s.Uuid)) - } else { - zap.S().Debugw("server has been unsuspended", zap.String("server", s.Uuid)) - } } // Environment and Mappings should be treated as a full update at all times, never a