2018-02-20 22:38:29 +00:00
|
|
|
package control
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
|
|
|
|
"github.com/pterodactyl/wings/config"
|
|
|
|
"github.com/pterodactyl/wings/constants"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
)
|
|
|
|
|
|
|
|
// LoadServerConfigurations loads the configured servers from a specified path
|
|
|
|
func LoadServerConfigurations(path string) error {
|
|
|
|
serverFiles, err := ioutil.ReadDir(path)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
servers = make(serversMap)
|
|
|
|
|
|
|
|
for _, file := range serverFiles {
|
|
|
|
if file.IsDir() {
|
|
|
|
server, err := loadServerConfiguration(filepath.Join(path, file.Name(), constants.ServerConfigFile))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
servers[server.ID] = server
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func loadServerConfiguration(path string) (*ServerStruct, error) {
|
|
|
|
file, err := ioutil.ReadFile(path)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
server := &ServerStruct{}
|
|
|
|
if err := json.Unmarshal(file, server); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
if err := server.init(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return server, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func storeServerConfiguration(server *ServerStruct) error {
|
|
|
|
serverJSON, err := json.MarshalIndent(server, "", constants.JSONIndent)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if err := os.MkdirAll(server.path(), constants.DefaultFolderPerms); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if err := ioutil.WriteFile(server.configFilePath(), serverJSON, constants.DefaultFilePerms); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func storeServerConfigurations() error {
|
|
|
|
for _, s := range servers {
|
|
|
|
if err := storeServerConfiguration(s); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func deleteServerFolder(id string) error {
|
|
|
|
path := filepath.Join(viper.GetString(config.DataPath), constants.ServersPath, id)
|
|
|
|
folder, err := os.Stat(path)
|
|
|
|
if os.IsNotExist(err) || !folder.IsDir() {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return os.RemoveAll(path)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *ServerStruct) Save() error {
|
|
|
|
if err := storeServerConfiguration(s); err != nil {
|
|
|
|
log.WithField("server", s.ID).WithError(err).Error("Failed to store server configuration.")
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *ServerStruct) path() string {
|
2018-03-14 12:59:57 +00:00
|
|
|
p, err := filepath.Abs(viper.GetString(config.DataPath))
|
|
|
|
if err != nil {
|
|
|
|
log.WithError(err).WithField("server", s.ID).Error("Failed to get absolute data path for server.")
|
|
|
|
p = viper.GetString(config.DataPath)
|
|
|
|
}
|
|
|
|
return filepath.Join(p, constants.ServersPath, s.ID)
|
2018-02-20 22:38:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (s *ServerStruct) dataPath() string {
|
|
|
|
return filepath.Join(s.path(), constants.ServerDataPath)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *ServerStruct) configFilePath() string {
|
|
|
|
return filepath.Join(s.path(), constants.ServerConfigFile)
|
|
|
|
}
|