inn2-fudforum-auth/configuration/config.go

76 lines
1.9 KiB
Go

package configuration
import (
"log"
"os"
"path/filepath"
"strings"
"gopkg.in/yaml.v2"
)
// This structure represents application's configuration.
type config struct {
Debug bool `yaml:"debug"`
Database struct {
DSN string `yaml:"dsn"`
Parameters string `yaml:"parameters"`
Prefix string `yaml:"prefix"`
} `yaml:"database"`
Groups struct {
Default string `yaml:"default"`
Groups []struct {
Group string `yaml:"group"`
Users []string `yaml:"users"`
}
} `yaml:"groups"`
}
// Checks necessary parameters for filling.
func (c *config) checkParameters() {
if c.Database.DSN == "" {
log.Fatalln("database/dsn parameter isn't filled, don't know to which database I should connect!")
}
}
// Initialize initializes configuration structure by reading configuration
// file and populate structure with it's data.
func (c *config) Initialize() {
// If -config wasn't provided or empty - do nothing.
if configPath == "" {
log.Fatalln("-config parameter is empty, don't know where configuration is!")
}
// Normalize configuration path.
if strings.HasPrefix(configPath, "~") {
userDir, err := os.UserHomeDir()
if err != nil {
log.Fatalln("Failed to get user's home directory for user! Error was: " + err.Error())
}
configPath = strings.Replace(configPath, "~", userDir, 1)
}
absolutePath, err := filepath.Abs(configPath)
if err != nil {
log.Fatalln("Failed to get configuration file's absolute path! Error was: " + err.Error())
}
// Read and parse.
dataAsBytes, err1 := os.ReadFile(absolutePath)
if err1 != nil {
log.Fatalln("Failed to read configuration file! Error was: " + err1.Error())
}
err2 := yaml.Unmarshal(dataAsBytes, c)
if err2 != nil {
log.Fatalln("Failed to parse configuration file! Error was: " + err2.Error())
}
if c.Debug {
log.Printf("Configuration parsed: %+v\n", c)
}
c.checkParameters()
}