Code refactoring for #1744
This commit is contained in:
@@ -67,7 +67,6 @@ func Init() {
|
||||
Info["revision"] = revision
|
||||
|
||||
initConfig(config)
|
||||
initSecrets()
|
||||
initLogger()
|
||||
|
||||
platform := fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH)
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/AlexxIT/go2rtc/pkg/shell"
|
||||
"github.com/AlexxIT/go2rtc/pkg/creds"
|
||||
"github.com/AlexxIT/go2rtc/pkg/yaml"
|
||||
)
|
||||
|
||||
@@ -71,13 +71,15 @@ func initConfig(confs flagConfig) {
|
||||
// config as file
|
||||
if ConfigPath == "" {
|
||||
ConfigPath = conf
|
||||
initStorage()
|
||||
}
|
||||
|
||||
if data, _ = os.ReadFile(conf); data == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
data = []byte(shell.ReplaceEnvVars(string(data)))
|
||||
loadEnv(data)
|
||||
data = creds.ReplaceVars(data)
|
||||
configs = append(configs, data)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/AlexxIT/go2rtc/pkg/creds"
|
||||
"github.com/mattn/go-isatty"
|
||||
"github.com/rs/zerolog"
|
||||
)
|
||||
@@ -88,6 +89,8 @@ func initLogger() {
|
||||
writer = MemoryLog
|
||||
}
|
||||
|
||||
writer = creds.SecretWriter(writer)
|
||||
|
||||
lvl, _ := zerolog.ParseLevel(modules["level"])
|
||||
Logger = zerolog.New(writer).Level(lvl)
|
||||
|
||||
|
||||
@@ -1,136 +0,0 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/AlexxIT/go2rtc/pkg/secrets"
|
||||
"github.com/AlexxIT/go2rtc/pkg/yaml"
|
||||
)
|
||||
|
||||
var (
|
||||
secretsMap = make(map[string]*Secret)
|
||||
secretsMu sync.Mutex
|
||||
)
|
||||
|
||||
// SecretsManager implements secrets.SecretsManager interface
|
||||
type SecretsManager struct{}
|
||||
|
||||
func (m *SecretsManager) NewSecret(name string, values interface{}) (secrets.Secret, error) {
|
||||
secretsMu.Lock()
|
||||
defer secretsMu.Unlock()
|
||||
|
||||
if s, exists := secretsMap[name]; exists {
|
||||
return s, nil
|
||||
}
|
||||
|
||||
s := &Secret{Name: name, Values: make(map[string]string)}
|
||||
|
||||
data, err := yaml.Encode(values, 2)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := yaml.Unmarshal(data, &s.Values); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
secretsMap[name] = s
|
||||
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (m *SecretsManager) GetSecret(name string) secrets.Secret {
|
||||
secretsMu.Lock()
|
||||
defer secretsMu.Unlock()
|
||||
return secretsMap[name]
|
||||
}
|
||||
|
||||
// Secret implements secrets.Secret interface
|
||||
type Secret struct {
|
||||
Name string
|
||||
Values map[string]string
|
||||
}
|
||||
|
||||
func (s *Secret) Get(key string) any {
|
||||
secretsMu.Lock()
|
||||
defer secretsMu.Unlock()
|
||||
|
||||
if s.Values == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return s.Values[key]
|
||||
}
|
||||
|
||||
func (s *Secret) Set(key string, value string) {
|
||||
secretsMu.Lock()
|
||||
defer secretsMu.Unlock()
|
||||
|
||||
if s.Values == nil {
|
||||
s.Values = make(map[string]string)
|
||||
}
|
||||
|
||||
s.Values[key] = value
|
||||
}
|
||||
|
||||
func (s *Secret) Marshal() (interface{}, error) {
|
||||
secretsMu.Lock()
|
||||
defer secretsMu.Unlock()
|
||||
|
||||
if s.Values == nil {
|
||||
return make(map[string]any), nil
|
||||
}
|
||||
|
||||
return s.Values, nil
|
||||
}
|
||||
|
||||
func (s *Secret) Unmarshal(value any) error {
|
||||
secretsMu.Lock()
|
||||
defer secretsMu.Unlock()
|
||||
|
||||
if s.Values == nil {
|
||||
s.Values = make(map[string]string)
|
||||
}
|
||||
|
||||
data, err := yaml.Encode(value, 2)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := yaml.Unmarshal(data, value); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Secret) Save() error {
|
||||
secretsMu.Lock()
|
||||
defer secretsMu.Unlock()
|
||||
return PatchConfig([]string{"secrets", s.Name}, s.Values)
|
||||
}
|
||||
|
||||
func initSecrets() {
|
||||
var cfg struct {
|
||||
Secrets map[string]map[string]string `yaml:"secrets"`
|
||||
}
|
||||
|
||||
LoadConfig(&cfg)
|
||||
|
||||
if cfg.Secrets == nil {
|
||||
return
|
||||
}
|
||||
|
||||
secretsMu.Lock()
|
||||
defer secretsMu.Unlock()
|
||||
|
||||
for name, values := range cfg.Secrets {
|
||||
secretsMap[name] = &Secret{
|
||||
Name: name,
|
||||
Values: values,
|
||||
}
|
||||
}
|
||||
|
||||
// Register
|
||||
secrets.SetManager(&SecretsManager{})
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/AlexxIT/go2rtc/pkg/creds"
|
||||
"github.com/AlexxIT/go2rtc/pkg/yaml"
|
||||
)
|
||||
|
||||
func initStorage() {
|
||||
storage = &envStorage{data: make(map[string]string)}
|
||||
creds.SetStorage(storage)
|
||||
}
|
||||
|
||||
func loadEnv(data []byte) {
|
||||
var cfg struct {
|
||||
Env map[string]string `yaml:"env"`
|
||||
}
|
||||
|
||||
if err := yaml.Unmarshal(data, &cfg); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
storage.mu.Lock()
|
||||
for name, value := range cfg.Env {
|
||||
storage.data[name] = value
|
||||
creds.AddSecret(value)
|
||||
}
|
||||
storage.mu.Unlock()
|
||||
}
|
||||
|
||||
var storage *envStorage
|
||||
|
||||
type envStorage struct {
|
||||
data map[string]string
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
func (s *envStorage) SetValue(name, value string) error {
|
||||
if err := PatchConfig([]string{"env", name}, value); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s.mu.Lock()
|
||||
s.data[name] = value
|
||||
s.mu.Unlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *envStorage) GetValue(name string) (value string, ok bool) {
|
||||
s.mu.Lock()
|
||||
value, ok = s.data[name]
|
||||
s.mu.Unlock()
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user