diff --git a/cmd/config_finder.go b/cmd/config_finder.go new file mode 100644 index 0000000..969b722 --- /dev/null +++ b/cmd/config_finder.go @@ -0,0 +1,60 @@ +package cmd + +import ( + "github.com/pterodactyl/wings/config" + "os" + "path/filepath" +) + +// We've gone through a couple of iterations of where the configuration is stored. This +// helpful little function will look through the three areas it might have ended up, and +// return it. +// +// We only run this if the configuration flag for the instance is not actually passed in +// via the command line. Once found, the configuration is moved into the expected default +// location. Only errors are returned from this function, you can safely assume that after +// running this the configuration can be found in the correct default location. +func RelocateConfiguration() error { + var match string + check := []string{ + config.DefaultLocation, + "/var/lib/pterodactyl/config.yml", + "/etc/wings/config.yml", + } + + // Loop over all of the configuration paths, and return which one we found, if + // any. + for _, p := range check { + if s, err := os.Stat(p); err != nil { + if !os.IsNotExist(err) { + return err + } + } else if !s.IsDir() { + match = p + break + } + } + + // Just return a generic not exist error at this point if we didn't have a match, this + // will allow the caller to handle displaying a more friendly error to the user. If we + // did match in the default location, go ahead and return successfully. + if match == "" { + return os.ErrNotExist + } else if match == config.DefaultLocation { + return nil + } + + // The rest of this function simply creates the new default location and moves the + // old configuration file over to the new location, then sets the permissions on the + // file correctly so that only the user running this process can read it. + p, _ := filepath.Split(config.DefaultLocation) + if err := os.MkdirAll(p, 0755); err != nil { + return err + } + + if err := os.Rename(match, config.DefaultLocation); err != nil { + return err + } + + return os.Chmod(config.DefaultLocation, 0600) +} \ No newline at end of file diff --git a/cmd/root.go b/cmd/root.go index cfa18bd..1f2edd1 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "crypto/tls" "fmt" + "github.com/mitchellh/colorstring" "net/http" "os" "path" @@ -62,11 +63,22 @@ func readConfiguration() (*config.Configuration, error) { } func rootCmdRun(*cobra.Command, []string) { - // Profile wings in production!!!! if shouldRunProfiler { defer profile.Start().Stop() } + // Only attempt configuration file relocation if a custom location has not + // been specified in the command startup. + if configPath == config.DefaultLocation { + if err := RelocateConfiguration(); err != nil { + if os.IsNotExist(err) { + exitWithConfigurationNotice() + } + + panic(err) + } + } + c, err := readConfiguration() if err != nil { panic(err) @@ -259,3 +271,23 @@ func printLogo() { fmt.Println(`Copyright © 2018 - 2020 Dane Everitt & Contributors`) fmt.Println() } + +func exitWithConfigurationNotice() { + fmt.Print(colorstring.Color(` +[_red_][white][bold]Error: Configuration File Not Found[reset] + +Wings was not able to locate your configuration file, and therefore is not +able to complete its boot process. + +Please ensure you have copied your instance configuration file into +the default location, or have provided the --config flag to use a +custom location. + +Default Location: /etc/pterodactyl/config.yml + +[yellow]This is not a bug with this software. Please do not make a bug report +for this issue, it will be closed.[reset] + +`)) + os.Exit(1) +} diff --git a/config/config.go b/config/config.go index 97ce852..5e0eeec 100644 --- a/config/config.go +++ b/config/config.go @@ -19,7 +19,7 @@ import ( "sync" ) -const DefaultLocation = "/var/lib/pterodactyl/config.yml" +const DefaultLocation = "/etc/pterodactyl/config.yml" type Configuration struct { sync.RWMutex `json:"-" yaml:"-"`