You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.7 KiB
128 lines
3.7 KiB
package config
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"log"
|
|
"os"
|
|
"strconv"
|
|
"strings"
|
|
"sync"
|
|
|
|
"gopkg.in/yaml.v2"
|
|
)
|
|
|
|
var globalMutex sync.Mutex
|
|
var global *Config
|
|
|
|
// Config is configuration data
|
|
type Config struct {
|
|
Space Space `json:"space" yaml:"space"`
|
|
Database Database `json:"database" yaml:"database"`
|
|
Wiki Wiki `json:"wiki" yaml:"wiki"`
|
|
}
|
|
|
|
// Space is configuration for spaces.
|
|
type Space struct {
|
|
Enabled bool `json:"enabled" yaml:"enabled"`
|
|
Host string `json:"host" yaml:"host"`
|
|
AccessKey string `json:"accessKey" yaml:"accessKey"`
|
|
SecretKey string `json:"secretKey" yaml:"secretKey"`
|
|
Bucket string `json:"bucket" yaml:"bucket"`
|
|
MaxSize int64 `json:"maxSize" yaml:"maxSize"`
|
|
Root string `json:"root" yaml:"root"`
|
|
URLRoot string `json:"urlRoot" yaml:"urlRoot"`
|
|
}
|
|
|
|
// Database is configuration for spaces.
|
|
type Database struct {
|
|
Driver string `json:"driver" yaml:"driver"`
|
|
Host string `json:"host" yaml:"host"`
|
|
Port int `json:"port" yaml:"port"`
|
|
Db string `json:"db" yaml:"db"`
|
|
Username string `json:"username" yaml:"username"`
|
|
Password string `json:"password" yaml:"password"`
|
|
Mechanism string `json:"mechanism" yaml:"mechanism"`
|
|
RestoreIDs bool `json:"restoreIDs" yaml:"restoreIDs"`
|
|
SSL bool `json:"ssl" yaml:"ssl"`
|
|
}
|
|
|
|
// Wiki is the wiki stuff.
|
|
type Wiki struct {
|
|
URL string `json:"url" yaml:"url"`
|
|
}
|
|
|
|
func (config *Config) LoadEnv() {
|
|
config.Wiki.URL = os.Getenv("RPDATA_WIKI_URL")
|
|
config.Space.Enabled = os.Getenv("RPDATA_SPACE_ENABLED") == "true"
|
|
config.Space.Host = os.Getenv("RPDATA_SPACE_HOST")
|
|
config.Space.AccessKey = os.Getenv("RPDATA_SPACE_ACCESS_KEY")
|
|
config.Space.SecretKey = os.Getenv("RPDATA_SPACE_SECRET_KEY")
|
|
config.Space.Bucket = os.Getenv("RPDATA_SPACE_BUCKET")
|
|
config.Space.MaxSize, _ = strconv.ParseInt(os.Getenv("RPDATA_SPACE_MAX_SIZE"), 10, 64)
|
|
config.Space.Root = os.Getenv("RPDATA_SPACE_ROOT")
|
|
config.Space.URLRoot = os.Getenv("RPDATA_SPACE_URL_ROOT")
|
|
config.Database.Driver = os.Getenv("RPDATA_DATABASE_DRIVER")
|
|
config.Database.Host = os.Getenv("RPDATA_DATABASE_HOST")
|
|
config.Database.Port, _ = strconv.Atoi(os.Getenv("RPDATA_DATABASE_PORT"))
|
|
config.Database.Db = os.Getenv("RPDATA_DATABASE_DB")
|
|
config.Database.Username = os.Getenv("RPDATA_DATABASE_USERNAME")
|
|
config.Database.Password = os.Getenv("RPDATA_DATABASE_PASSWORD")
|
|
config.Database.Mechanism = os.Getenv("RPDATA_DATABASE_MECHANISM")
|
|
config.Database.RestoreIDs = os.Getenv("RPDATA_DATABASE_RESTORE_IDS") == "true"
|
|
config.Database.SSL = os.Getenv("RPDATA_DATABASE_SSL") == "true"
|
|
}
|
|
|
|
// Load loads config stuff
|
|
func (config *Config) Load(filename string) error {
|
|
log.Println("Trying to load config from " + filename)
|
|
|
|
stat, err := os.Stat(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if stat.Size() < 1 {
|
|
return errors.New("File is empty")
|
|
}
|
|
|
|
file, err := os.Open(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if strings.HasSuffix(filename, ".json") {
|
|
return json.NewDecoder(file).Decode(config)
|
|
}
|
|
|
|
return yaml.NewDecoder(file).Decode(config)
|
|
}
|
|
|
|
// LoadAny loads the first of these files it can find
|
|
func (config *Config) LoadAny(filenames ...string) error {
|
|
for _, filename := range filenames {
|
|
if err := config.Load(filename); err != nil {
|
|
continue
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
return errors.New("Failed to load configuration files")
|
|
}
|
|
|
|
// Global gets the global configuration, loading it if this is the first caller
|
|
func Global() Config {
|
|
globalMutex.Lock()
|
|
if global == nil {
|
|
global = &Config{}
|
|
global.LoadEnv()
|
|
err := global.LoadAny("/etc/aiterp/rpdata.yaml", "/etc/aiterp/rpdata.json", "./config.yaml", "./config.json")
|
|
if err != nil {
|
|
log.Println("No config files were loaded.")
|
|
}
|
|
}
|
|
globalMutex.Unlock()
|
|
|
|
return *global
|
|
}
|