From e0687db9e2178c49fa62f922589b820720b9ea8e Mon Sep 17 00:00:00 2001 From: seydx Date: Tue, 20 May 2025 23:07:04 +0200 Subject: [PATCH] add template parsing --- internal/app/secrets.go | 35 +++++++++++++++++++++++++++++++++++ internal/streams/handlers.go | 13 +++++++++++++ 2 files changed, 48 insertions(+) diff --git a/internal/app/secrets.go b/internal/app/secrets.go index e0acc901..c3c4f95e 100644 --- a/internal/app/secrets.go +++ b/internal/app/secrets.go @@ -2,6 +2,8 @@ package app import ( "fmt" + "regexp" + "strings" "sync" "github.com/AlexxIT/go2rtc/pkg/yaml" @@ -10,6 +12,8 @@ import ( var secrets = make(map[string]*Secret) var secretsMu sync.Mutex +var templateRegex = regexp.MustCompile(`\{\{\s*([^\}]+)\s*\}\}`) + type Secrets interface { Get(key string) any Set(key string, value any) @@ -53,6 +57,10 @@ func NewSecret(name string, values interface{}) *Secret { return s } +func GetSecret(name string) *Secret { + return secrets[name] +} + func (s *Secret) Get(key string) any { secretsMu.Lock() defer secretsMu.Unlock() @@ -72,6 +80,33 @@ func (s *Secret) Set(key string, value any) { secrets[s.Name] = s } +func (s *Secret) Parse(template string) string { + if !templateRegex.MatchString(template) { + return template + } + + secretsMu.Lock() + defer secretsMu.Unlock() + + if _, exists := secrets[s.Name]; !exists { + return template + } + + result := templateRegex.ReplaceAllStringFunc(template, func(match string) string { + varName := strings.TrimSpace(templateRegex.FindStringSubmatch(match)[1]) + pathParts := strings.Split(varName, ".") + value := getNestedValue(s.Values, pathParts) + + if value != nil { + return stringify(value) + } + + return "" + }) + + return result +} + func (s *Secret) Marshal(v any) ([]byte, error) { secretsMu.Lock() defer secretsMu.Unlock() diff --git a/internal/streams/handlers.go b/internal/streams/handlers.go index 3240abb5..991b69c9 100644 --- a/internal/streams/handlers.go +++ b/internal/streams/handlers.go @@ -4,6 +4,7 @@ import ( "errors" "strings" + "github.com/AlexxIT/go2rtc/internal/app" "github.com/AlexxIT/go2rtc/pkg/core" ) @@ -46,6 +47,18 @@ func GetProducer(url string) (core.Producer, error) { } if handler, ok := handlers[scheme]; ok { + index := strings.IndexByte(url, '#') + if index > 0 { + _, query := url[:index], ParseQuery(url[index+1:]) + secretsName := query.Get("secrets") + if secretsName != "" { + secrets := app.GetSecret(secretsName) + if secrets != nil { + url = secrets.Parse(url) + } + } + } + return handler(url) } }