GraphQL API and utilities for the rpdata project
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

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
}