feat(config): reading from env variables (#474)

* chore(config): remove agent config

* feat(config): support env variables

* refactor(config): ordinal priority
This commit is contained in:
Chotow
2024-11-13 23:12:48 +08:00
committed by GitHub
parent bd0d355bd6
commit 9b6d8ad0f2
3 changed files with 67 additions and 86 deletions
+40 -38
View File
@@ -1,12 +1,15 @@
package model
import (
"errors"
"os"
"strconv"
"strings"
"github.com/spf13/viper"
"sigs.k8s.io/yaml"
"github.com/knadh/koanf/parsers/yaml"
"github.com/knadh/koanf/providers/env"
"github.com/knadh/koanf/providers/file"
"github.com/knadh/koanf/v2"
)
var Languages = map[string]string{
@@ -46,35 +49,6 @@ const (
ConfigCoverIgnoreAll
)
type AgentConfig struct {
HardDrivePartitionAllowlist []string
NICAllowlist map[string]bool
v *viper.Viper
}
// Read 从给定的文件目录加载配置文件
func (c *AgentConfig) Read(path string) error {
c.v = viper.New()
c.v.SetConfigFile(path)
err := c.v.ReadInConfig()
if err != nil {
return err
}
err = c.v.Unmarshal(c)
if err != nil {
return err
}
return nil
}
func (c *AgentConfig) Save() error {
data, err := yaml.Marshal(c)
if err != nil {
return err
}
return os.WriteFile(c.v.ConfigFileUsed(), data, 0600)
}
// Config 站点配置
type Config struct {
Debug bool // debug模式开关
@@ -122,28 +96,52 @@ type Config struct {
Location string // 时区,默认为 Asia/Shanghai
v *viper.Viper
IgnoredIPNotificationServerIDs map[uint64]bool // [ServerID] -> bool(值为true代表当前ServerID在特定服务器列表内)
MaxTCPPingValue int32
AvgPingCount int
DNSServers string
k *koanf.Koanf
filePath string
}
// Read 读取配置文件并应用
func (c *Config) Read(path string) error {
c.v = viper.New()
c.v.SetConfigFile(path)
err := c.v.ReadInConfig()
c.k = koanf.New(".")
c.filePath = path
// 先读取环境变量,然后读取配置文件;后者可以覆盖前者,因为哪吒支持在线修改配置
err := c.k.Load(env.Provider("NZ_", ".", func(s string) string {
return strings.Replace(strings.ToLower(strings.TrimPrefix(s, "NZ_")), "_", ".", -1)
}), nil)
if err != nil {
return err
}
err = c.v.Unmarshal(c)
if _, err := os.Stat(path); err == nil {
err = c.k.Load(file.Provider(path), yaml.Parser())
if err != nil {
return err
}
}
err = c.k.Unmarshal("", c)
if err != nil {
return err
}
if c.Oauth2.Type == "" || c.Oauth2.Admin == "" || c.Oauth2.ClientID == "" || c.Oauth2.ClientSecret == "" {
return errors.New("missing oauth2 config")
}
if c.Site.Brand == "" {
c.Site.Brand = "NeZha"
}
if c.Site.CookieName == "" {
c.Site.CookieName = "nezha-dashboard"
}
if c.Site.Theme == "" {
c.Site.Theme = "default"
}
@@ -153,6 +151,9 @@ func (c *Config) Read(path string) error {
if c.Language == "" {
c.Language = "zh-CN"
}
if c.HTTPPort == 0 {
c.HTTPPort = 80
}
if c.GRPCPort == 0 {
c.GRPCPort = 5555
}
@@ -181,6 +182,7 @@ func (c *Config) Read(path string) error {
c.Oauth2.OidcGroupClaim = "groups"
}
panic(1)
c.updateIgnoredIPNotificationID()
return nil
}
@@ -200,9 +202,9 @@ func (c *Config) updateIgnoredIPNotificationID() {
// Save 保存配置文件
func (c *Config) Save() error {
c.updateIgnoredIPNotificationID()
data, err := yaml.Marshal(c)
data, err := c.k.Marshal(yaml.Parser())
if err != nil {
return err
}
return os.WriteFile(c.v.ConfigFileUsed(), data, 0600)
return os.WriteFile(c.filePath, data, 0600)
}