99 lines
2.4 KiB
Go
99 lines
2.4 KiB
Go
|
package config
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"fmt"
|
||
|
"github.com/spf13/viper"
|
||
|
"os"
|
||
|
|
||
|
consulapi "github.com/hashicorp/consul/api"
|
||
|
_ "github.com/spf13/viper/remote"
|
||
|
"gopkg.in/yaml.v3"
|
||
|
)
|
||
|
|
||
|
type WebConfig struct {
|
||
|
Name string `yaml:"name,omitempty"`
|
||
|
Host string `yaml:"host,omitempty"`
|
||
|
Port int `yaml:"port,omitempty"`
|
||
|
Mode string `yaml:"mode,omitempty"`
|
||
|
Consul ConsulConfig `yaml:"consul,omitempty"`
|
||
|
Db DbConfig `yaml:"db"`
|
||
|
Cache CacheConfig `yaml:"cache"`
|
||
|
}
|
||
|
type ConsulConfig struct {
|
||
|
Host string `yaml:"host,omitempty"`
|
||
|
Port int `yaml:"port,omitempty"`
|
||
|
Interval int `yaml:"interval,omitempty"`
|
||
|
Timeout int `yaml:"timeout,omitempty"`
|
||
|
Deregister int `yaml:"deregister,omitempty"`
|
||
|
Tags []string `yaml:"tags,omitempty"`
|
||
|
}
|
||
|
type DbConfig struct {
|
||
|
Conn string `yaml:"conn"`
|
||
|
DriveName string `yaml:"drive_name"`
|
||
|
}
|
||
|
type CacheConfig struct {
|
||
|
Host string `yaml:"host,omitempty"`
|
||
|
Port int `yaml:"port,omitempty"`
|
||
|
Pass string `yaml:"pass,omitempty"`
|
||
|
DB int `yaml:"db,omitempty"`
|
||
|
PoolSize int `yaml:"pool_size,omitempty"`
|
||
|
}
|
||
|
|
||
|
func ParseConfigByFile(path string) (cfg *WebConfig, err error) {
|
||
|
buffer, err := os.ReadFile(path)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return load(buffer)
|
||
|
}
|
||
|
|
||
|
func load(buf []byte) (cfg *WebConfig, err error) {
|
||
|
cViper := viper.New()
|
||
|
cViper.SetConfigType("yaml")
|
||
|
cfg = new(WebConfig)
|
||
|
cViper.ReadConfig(bytes.NewBuffer(buf))
|
||
|
err = cViper.Unmarshal(cfg)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func UpdateLocalConfig(cfg *WebConfig, fn string) error {
|
||
|
data, err := yaml.Marshal(cfg)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
err = os.WriteFile(fn, data, 0600)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func UpdateRemoteConfig(cfg *WebConfig) error {
|
||
|
consulClient, err := consulapi.NewClient(&consulapi.Config{Address: fmt.Sprintf("%s:%d", cfg.Consul.Host, cfg.Consul.Port)})
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
val, err := yaml.Marshal(cfg)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
p := &consulapi.KVPair{Key: fmt.Sprintf("hpds-pavement/hpds_web/%s/%s", cfg.Mode, cfg.Name), Value: val}
|
||
|
if _, err = consulClient.KV().Put(p, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func GetRemoteConfig(remoteAddr, path string) (cfg *WebConfig, err error) {
|
||
|
consulClient, err := consulapi.NewClient(&consulapi.Config{Address: remoteAddr})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
kv, _, err := consulClient.KV().Get(path, nil)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return load(kv.Value)
|
||
|
}
|