fathom/pkg/config/config.go

79 lines
1.7 KiB
Go
Raw Normal View History

2018-05-15 11:54:36 +00:00
package config
import (
"math/rand"
"os"
"path/filepath"
2018-05-15 11:54:36 +00:00
"github.com/joho/godotenv"
"github.com/kelseyhightower/envconfig"
log "github.com/sirupsen/logrus"
"github.com/usefathom/fathom/pkg/datastore/sqlstore"
)
2018-05-21 09:54:01 +00:00
// Config wraps the configuration structs for the various application parts
2018-05-15 11:54:36 +00:00
type Config struct {
Database *sqlstore.Config
2018-05-21 09:54:01 +00:00
Secret string
2018-05-15 11:54:36 +00:00
}
2018-05-21 09:54:01 +00:00
// Parses the supplied file + environment into a Config struct
2018-05-15 11:54:36 +00:00
func Parse(file string) *Config {
var cfg Config
var err error
if file != "" {
absfile, _ := filepath.Abs(file)
// check if file exists
_, err := os.Stat(absfile)
fileNotExists := os.IsNotExist(err)
2018-05-23 07:11:28 +00:00
if file == ".env" && fileNotExists {
log.Warnf("Missing configuration file. Using defaults.")
} else {
log.Printf("Configuration file: %s", absfile)
}
2018-05-23 07:11:28 +00:00
if fileNotExists {
if file != ".env" {
log.Fatalf("Error reading configuration. File `%s` does not exist.", file)
}
} else {
// read file into env values
err = godotenv.Load(absfile)
if err != nil {
log.Fatalf("Error parsing configuration file: %s", err)
}
}
2018-05-15 11:54:36 +00:00
}
// with config file loaded into env values, we can now parse env into our config struct
2018-05-15 11:54:36 +00:00
err = envconfig.Process("Fathom", &cfg)
if err != nil {
log.Fatalf("Error parsing configuration from environment: %s", err)
2018-05-15 11:54:36 +00:00
}
// alias sqlite to sqlite3
if cfg.Database.Driver == "sqlite" {
cfg.Database.Driver = "sqlite3"
}
// if secret key is empty, use a randomly generated one
if cfg.Secret == "" {
cfg.Secret = randomString(40)
}
return &cfg
}
func randomString(len int) string {
bytes := make([]byte, len)
for i := 0; i < len; i++ {
bytes[i] = byte(65 + rand.Intn(25)) //A=65 and Z = 65+25
}
return string(bytes)
}