diff --git a/cmd/goatak_server/config.go b/cmd/goatak_server/config.go index 04ebff0..e8e3f0a 100644 --- a/cmd/goatak_server/config.go +++ b/cmd/goatak_server/config.go @@ -4,8 +4,13 @@ import ( "crypto/tls" "crypto/x509" "fmt" + "log/slog" "os" + "strings" + "github.com/knadh/koanf/parsers/yaml" + "github.com/knadh/koanf/providers/env" + "github.com/knadh/koanf/providers/file" "github.com/knadh/koanf/v2" "github.com/kdudkov/goatak/pkg/tlsutil" @@ -20,6 +25,51 @@ type AppConfig struct { ca []*x509.Certificate } +func NewAppConfig() *AppConfig { + c := &AppConfig{k: koanf.New(".")} + + setDefaults(c.k) + + return c +} + +func (c *AppConfig) Load(filename ...string) bool { + loaded := false + + for _, name := range filename { + if err := c.k.Load(file.Provider(name), yaml.Parser()); err != nil { + slog.Info(fmt.Sprintf("error loading config: %s", err.Error())) + } else { + loaded = true + } + } + + return loaded +} + +func (c *AppConfig) LoadEnv(prefix string) error { + return c.k.Load(env.Provider(prefix, ".", func(s string) string { + return strings.Replace(strings.ToLower( + strings.TrimPrefix(s, prefix)), "_", ".", -1) + }), nil) +} + +func (c *AppConfig) Bool(key string) bool { + return c.k.Bool(key) +} + +func (c *AppConfig) String(key string) string { + return c.k.String(key) +} + +func (c *AppConfig) Float64(key string) float64 { + return c.k.Float64(key) +} + +func (c *AppConfig) Int(key string) int { + return c.k.Int(key) +} + func (c *AppConfig) DataDir() string { return c.k.String("data_dir") } @@ -115,7 +165,7 @@ func loadPem(name string) ([]*x509.Certificate, error) { return tlsutil.DecodeAllCerts(pemBytes) } -func SetDefaults(k *koanf.Koanf) { +func setDefaults(k *koanf.Koanf) { k.Set("udp_addr", ":8999") k.Set("tcp_addr", ":8999") k.Set("ssl_addr", ":8089") diff --git a/cmd/goatak_server/main.go b/cmd/goatak_server/main.go index d968d9c..475a9c1 100644 --- a/cmd/goatak_server/main.go +++ b/cmd/goatak_server/main.go @@ -19,10 +19,6 @@ import ( "github.com/glebarez/sqlite" "github.com/google/uuid" - "github.com/knadh/koanf/parsers/yaml" - "github.com/knadh/koanf/providers/env" - "github.com/knadh/koanf/providers/file" - "github.com/knadh/koanf/v2" "github.com/prometheus/client_golang/prometheus" "gorm.io/gorm" "gorm.io/gorm/logger" @@ -456,25 +452,15 @@ func getDatabase() (*gorm.DB, error) { func main() { fmt.Printf("version %s\n", getVersion()) - conf := flag.String("config", "goatak_server.yml", "name of config file") + configName := flag.String("config", "goatak_server.yml", "name of config file") flag.Parse() - k := koanf.New(".") - - SetDefaults(k) - - if err := k.Load(file.Provider(*conf), yaml.Parser()); err != nil { - fmt.Printf("error loading config: %s", err.Error()) - return - } - - _ = k.Load(env.Provider("GOATAK_", ".", func(s string) string { - return strings.Replace(strings.ToLower( - strings.TrimPrefix(s, "GOATAK_")), "_", ".", -1) - }), nil) + config := NewAppConfig() + config.Load(*configName) + _ = config.LoadEnv("GOATAK_") var h slog.Handler - if k.Bool("debug") { + if config.Bool("debug") { h = slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug}) } else { h = slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelInfo}) @@ -482,18 +468,14 @@ func main() { slog.SetDefault(slog.New(h)) - config := &AppConfig{ - k: k, - } - if err := config.processCerts(); err != nil { slog.Default().Error(err.Error()) } app := NewApp(config) - app.lat = k.Float64("me.lat") - app.lon = k.Float64("me.lon") - app.zoom = int8(k.Int("me.zoom")) + app.lat = config.Float64("me.lat") + app.lon = config.Float64("me.lon") + app.zoom = int8(config.Int("me.zoom")) app.Run() }