83 lines
1.5 KiB
Go
83 lines
1.5 KiB
Go
package config
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/fsnotify/fsnotify"
|
|
"github.com/khlieng/dispatch/storage"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
type Config struct {
|
|
Address string
|
|
Port string
|
|
Dev bool
|
|
HexIP bool
|
|
VerifyCertificates bool `mapstructure:"verify_certificates"`
|
|
Headers map[string]string
|
|
Defaults *Defaults
|
|
HTTPS *HTTPS
|
|
LetsEncrypt *LetsEncrypt
|
|
}
|
|
|
|
type Defaults struct {
|
|
Name string
|
|
Host string
|
|
Port int
|
|
Channels []string
|
|
Password string
|
|
SSL bool
|
|
ReadOnly bool
|
|
ShowDetails bool `mapstructure:"show_details"`
|
|
}
|
|
|
|
type HTTPS struct {
|
|
Enabled bool
|
|
Port string
|
|
Cert string
|
|
Key string
|
|
HSTS *HSTS
|
|
}
|
|
|
|
type HSTS struct {
|
|
Enabled bool
|
|
MaxAge string `mapstructure:"max_age"`
|
|
IncludeSubdomains bool `mapstructure:"include_subdomains"`
|
|
Preload bool
|
|
}
|
|
|
|
type LetsEncrypt struct {
|
|
Domain string
|
|
Email string
|
|
}
|
|
|
|
func LoadConfig() (*Config, chan *Config) {
|
|
viper.SetConfigName("config")
|
|
viper.AddConfigPath(storage.Path.Root())
|
|
viper.ReadInConfig()
|
|
|
|
config := &Config{}
|
|
viper.Unmarshal(config)
|
|
|
|
viper.WatchConfig()
|
|
|
|
configCh := make(chan *Config, 1)
|
|
|
|
prev := time.Now()
|
|
viper.OnConfigChange(func(e fsnotify.Event) {
|
|
now := time.Now()
|
|
// fsnotify sometimes fires twice
|
|
if now.Sub(prev) > time.Second {
|
|
config := &Config{}
|
|
err := viper.Unmarshal(config)
|
|
if err == nil {
|
|
configCh <- config
|
|
}
|
|
|
|
prev = now
|
|
}
|
|
})
|
|
|
|
return config, configCh
|
|
}
|