config: use constants with config keys instead of struct as its easier to handle
This commit is contained in:
parent
5f0804ea53
commit
ef28b61136
|
@ -6,6 +6,7 @@ import (
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
|
||||||
"github.com/Pterodactyl/wings/config"
|
"github.com/Pterodactyl/wings/config"
|
||||||
)
|
)
|
||||||
|
@ -22,7 +23,7 @@ func NewAPI() API {
|
||||||
|
|
||||||
// Listen starts the api http server
|
// Listen starts the api http server
|
||||||
func (api *API) Listen() {
|
func (api *API) Listen() {
|
||||||
if !config.Get().Debug {
|
if !viper.GetBool(config.Debug) {
|
||||||
gin.SetMode(gin.ReleaseMode)
|
gin.SetMode(gin.ReleaseMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +31,7 @@ func (api *API) Listen() {
|
||||||
|
|
||||||
api.registerRoutes()
|
api.registerRoutes()
|
||||||
|
|
||||||
listenString := fmt.Sprintf("%s:%d", config.Get().Web.ListenHost, config.Get().Web.ListenPort)
|
listenString := fmt.Sprintf("%s:%d", viper.GetString(config.APIHost), viper.GetInt(config.APIPort))
|
||||||
|
|
||||||
api.router.Run(listenString)
|
api.router.Run(listenString)
|
||||||
|
|
||||||
|
|
|
@ -45,14 +45,14 @@ func (a *authorizationManager) HasPermission(permission string) bool {
|
||||||
}
|
}
|
||||||
prefix := permission[:1]
|
prefix := permission[:1]
|
||||||
if prefix == "c" {
|
if prefix == "c" {
|
||||||
return config.Get().ContainsAuthKey(a.token)
|
return config.ContainsAuthKey(a.token)
|
||||||
}
|
}
|
||||||
if a.server == nil {
|
if a.server == nil {
|
||||||
log.WithField("permission", permission).Error("Auth: Server required but none found.")
|
log.WithField("permission", permission).Error("Auth: Server required but none found.")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if prefix == "g" {
|
if prefix == "g" {
|
||||||
return config.Get().ContainsAuthKey(a.token)
|
return config.ContainsAuthKey(a.token)
|
||||||
}
|
}
|
||||||
if prefix == "s" {
|
if prefix == "s" {
|
||||||
return a.server.HasPermission(a.token, permission)
|
return a.server.HasPermission(a.token, permission)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
{
|
{
|
||||||
"debug": false,
|
"debug": false,
|
||||||
"web": {
|
"dataPath": "/srv/daemon-data",
|
||||||
|
"api": {
|
||||||
"host": "0.0.0.0",
|
"host": "0.0.0.0",
|
||||||
"port": 8080,
|
"port": 8080,
|
||||||
"ssl": {
|
"ssl": {
|
||||||
|
@ -20,7 +21,7 @@
|
||||||
"timezonePath": "/etc/timezone"
|
"timezonePath": "/etc/timezone"
|
||||||
},
|
},
|
||||||
"sftp": {
|
"sftp": {
|
||||||
"path": "/srv/daemon-data",
|
"host": "0.0.0.0",
|
||||||
"port": 2022
|
"port": 2022
|
||||||
},
|
},
|
||||||
"query": {
|
"query": {
|
||||||
|
|
|
@ -9,6 +9,8 @@ type Config struct {
|
||||||
// Debug enables debug mode
|
// Debug enables debug mode
|
||||||
Debug bool `mapstructure:"debug"`
|
Debug bool `mapstructure:"debug"`
|
||||||
|
|
||||||
|
DataPath string `mapstructure:"dataPath"`
|
||||||
|
|
||||||
// Web contains the settings of the api webserver
|
// Web contains the settings of the api webserver
|
||||||
Web struct {
|
Web struct {
|
||||||
// ListenHost is the host address to bind the api webserver to
|
// ListenHost is the host address to bind the api webserver to
|
||||||
|
@ -49,8 +51,6 @@ type Config struct {
|
||||||
|
|
||||||
// Sftp contains information on the integrated sftp server
|
// Sftp contains information on the integrated sftp server
|
||||||
Sftp struct {
|
Sftp struct {
|
||||||
// Path is the base path of the sftp server
|
|
||||||
Path string `mapstructure:"path"`
|
|
||||||
// Port is the port to bind the sftp server to
|
// Port is the port to bind the sftp server to
|
||||||
Port int16 `mapstructure:"port"`
|
Port int16 `mapstructure:"port"`
|
||||||
} `mapstructure:"sftp"`
|
} `mapstructure:"sftp"`
|
||||||
|
@ -80,6 +80,7 @@ type Config struct {
|
||||||
AuthKeys []string `mapstructure:"authKeys"`
|
AuthKeys []string `mapstructure:"authKeys"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var configPath string
|
||||||
var config *Config
|
var config *Config
|
||||||
|
|
||||||
// LoadConfiguration loads the configuration from a specified file
|
// LoadConfiguration loads the configuration from a specified file
|
||||||
|
@ -96,26 +97,38 @@ func LoadConfiguration(path string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
config = new(Config)
|
return nil
|
||||||
if err := viper.Unmarshal(config); err != nil {
|
}
|
||||||
return err
|
|
||||||
}
|
// StoreConfiguration stores the configuration to a specified file
|
||||||
|
func StoreConfiguration(path string) error {
|
||||||
|
// TODO: Implement
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get returns the configuration
|
|
||||||
func Get() *Config {
|
|
||||||
return config
|
|
||||||
}
|
|
||||||
|
|
||||||
func setDefaults() {
|
func setDefaults() {
|
||||||
|
viper.SetDefault(Debug, false)
|
||||||
|
viper.SetDefault(DataPath, "./data")
|
||||||
|
viper.SetDefault(APIHost, "0.0.0.0")
|
||||||
|
viper.SetDefault(APIPort, 8080)
|
||||||
|
viper.SetDefault(SSLEnabled, false)
|
||||||
|
viper.SetDefault(SSLGenerateLetsencrypt, false)
|
||||||
|
viper.SetDefault(UploadsMaximumSize, 100000)
|
||||||
|
viper.SetDefault(DockerSocket, "/var/run/docker.sock")
|
||||||
|
viper.SetDefault(DockerAutoupdateImages, true)
|
||||||
|
viper.SetDefault(DockerNetworkInterface, "127.18.0.0")
|
||||||
|
viper.SetDefault(DockerTimezonePath, "/etc/timezone")
|
||||||
|
viper.SetDefault(SftpHost, "0.0.0.0")
|
||||||
|
viper.SetDefault(SftpPort, "2202")
|
||||||
|
viper.SetDefault(LogPath, "./logs")
|
||||||
|
viper.SetDefault(LogLevel, "info")
|
||||||
|
viper.SetDefault(LogDeleteAfterDays, "30")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainsAuthKey checks wether the config contains a specified authentication key
|
// ContainsAuthKey checks wether the config contains a specified authentication key
|
||||||
func (c *Config) ContainsAuthKey(key string) bool {
|
func ContainsAuthKey(key string) bool {
|
||||||
for _, k := range c.AuthKeys {
|
for _, k := range viper.GetStringSlice(AuthKeys) {
|
||||||
if k == key {
|
if k == key {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
66
config/keys.go
Normal file
66
config/keys.go
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Debug is a boolean value that enables debug mode
|
||||||
|
Debug = "debug"
|
||||||
|
|
||||||
|
// DataPath is a string containing the path where data should
|
||||||
|
// be stored on the system
|
||||||
|
DataPath = "datapath"
|
||||||
|
|
||||||
|
// APIHost is a string containing the interface ip address
|
||||||
|
// on what the api should listen on
|
||||||
|
APIHost = "api.host"
|
||||||
|
// APIPort is an integer containing the port the api should
|
||||||
|
// listen on
|
||||||
|
APIPort = "api.port"
|
||||||
|
// SSLEnabled is a boolean that states whether ssl should be enabled or not
|
||||||
|
SSLEnabled = "api.ssl.enabled"
|
||||||
|
// SSLGenerateLetsencrypt is a boolean that enables automatic SSL certificate
|
||||||
|
// creation with letsencrypt
|
||||||
|
SSLGenerateLetsencrypt = "api.ssl.letsencrypt"
|
||||||
|
// SSLCertificate is a string containing the location of
|
||||||
|
// a ssl certificate to use
|
||||||
|
SSLCertificate = "api.ssl.certificate"
|
||||||
|
// SSLKey is a string containing the location of the key
|
||||||
|
// for the ssl certificate
|
||||||
|
SSLKey = "api.ssl.key"
|
||||||
|
// UploadsMaximumSize is an integer that sets the maximum size for
|
||||||
|
// file uploads through the api in Kilobytes
|
||||||
|
UploadsMaximumSize = "api.uploads.maximumSize"
|
||||||
|
|
||||||
|
// DockerSocket is a string containing the path to the docker socket
|
||||||
|
DockerSocket = "docker.socket"
|
||||||
|
// DockerAutoupdateImages is a boolean that enables automatic
|
||||||
|
// docker image updates on every server install
|
||||||
|
DockerAutoupdateImages = "docker.autoupdateImages"
|
||||||
|
// DockerNetworkInterface is a string containing the network interface
|
||||||
|
// to use for the wings docker network
|
||||||
|
DockerNetworkInterface = "docker.networkInterface"
|
||||||
|
// DockerTimezonePath is a string containing the path to the timezone
|
||||||
|
// file that should be mounted into all containers
|
||||||
|
DockerTimezonePath = "docker.timezonePath"
|
||||||
|
|
||||||
|
// SftpHost is a string containing the interface ip address on
|
||||||
|
// which the sftp server should be listening
|
||||||
|
SftpHost = "sftp.host"
|
||||||
|
// SftpPort is an integer containing the port the sftp servers hould
|
||||||
|
// be listening on
|
||||||
|
SftpPort = "sftp.port"
|
||||||
|
|
||||||
|
// Remote is a string containing the url to the Pterodactyl panel
|
||||||
|
// wings should send updates to
|
||||||
|
Remote = "remote"
|
||||||
|
|
||||||
|
// LogPath is a string containing the path where logfiles should be
|
||||||
|
// stored
|
||||||
|
LogPath = "log.path"
|
||||||
|
// LogLevel is a string containing the log level
|
||||||
|
LogLevel = "log.level"
|
||||||
|
// LogDeleteAfterDays is an integer containing the amounts of days
|
||||||
|
// logs should be stored. They will be deleted after. If set to 0
|
||||||
|
// logs will be stored indefinitely.
|
||||||
|
LogDeleteAfterDays = "log.deleteAfterDays"
|
||||||
|
// AuthKeys contains an array of auth keys that will be replaced by something better
|
||||||
|
AuthKeys = "authkeys"
|
||||||
|
)
|
|
@ -6,6 +6,7 @@ import (
|
||||||
rotatelogs "github.com/lestrrat/go-file-rotatelogs"
|
rotatelogs "github.com/lestrrat/go-file-rotatelogs"
|
||||||
"github.com/rifflock/lfshook"
|
"github.com/rifflock/lfshook"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
|
||||||
"github.com/Pterodactyl/wings/config"
|
"github.com/Pterodactyl/wings/config"
|
||||||
)
|
)
|
||||||
|
@ -21,11 +22,11 @@ func InitLogging() {
|
||||||
// ConfigureLogging configures logrus to our needs
|
// ConfigureLogging configures logrus to our needs
|
||||||
func ConfigureLogging() error {
|
func ConfigureLogging() error {
|
||||||
|
|
||||||
path := config.Get().Log.Path
|
path := viper.GetString(config.LogPath)
|
||||||
writer := rotatelogs.New(
|
writer := rotatelogs.New(
|
||||||
path+"wings.%Y%m%d-%H%M.log",
|
path+"wings.%Y%m%d-%H%M.log",
|
||||||
rotatelogs.WithLinkName(path),
|
rotatelogs.WithLinkName(path),
|
||||||
rotatelogs.WithMaxAge(time.Duration(config.Get().Log.DeleteAfterDays)*time.Hour*24),
|
rotatelogs.WithMaxAge(time.Duration(viper.GetInt(config.LogDeleteAfterDays))*time.Hour*24),
|
||||||
rotatelogs.WithRotationTime(time.Duration(604800)*time.Second),
|
rotatelogs.WithRotationTime(time.Duration(604800)*time.Second),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -37,10 +38,10 @@ func ConfigureLogging() error {
|
||||||
log.FatalLevel: writer,
|
log.FatalLevel: writer,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
level := config.Get().Log.Level
|
level := viper.GetString(config.LogLevel)
|
||||||
|
|
||||||
// In debug mode the log level is always debug
|
// In debug mode the log level is always debug
|
||||||
if config.Get().Debug {
|
if viper.GetBool(config.Debug) {
|
||||||
level = "debug"
|
level = "debug"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user