feat(sense): complete T-006 five-stream integration
Harness governance / validate (push) Has been cancelled
Harness governance / validate (pull_request) Has been cancelled

This commit is contained in:
QiuSW
2026-08-07 16:33:35 +08:00
parent 08692e33e9
commit 9567838045
19 changed files with 1658 additions and 14 deletions
+42
View File
@@ -7,6 +7,7 @@ import (
"net/url"
"os"
"strconv"
"strings"
"time"
)
@@ -16,6 +17,7 @@ const (
defaultMediaMTXURL = "http://127.0.0.1:9997"
defaultReconcilePeriod = 5 * time.Second
defaultProbePeriod = 10 * time.Second
defaultONVIFMode = "disabled"
)
type Config struct {
@@ -25,6 +27,10 @@ type Config struct {
MediaMTXURL string
ReconcileInterval time.Duration
ProbeInterval time.Duration
ONVIFMode string
RTSPRewriteHost string
RTSPRewritePort int
RTSPStripQuery bool
}
func Load() (Config, error) {
@@ -40,6 +46,14 @@ func Load() (Config, error) {
if err != nil {
return Config{}, err
}
rewritePort, err := intEnv("SENSE_ONVIF_RTSP_REWRITE_PORT", 0)
if err != nil {
return Config{}, err
}
stripQuery, err := boolEnv("SENSE_ONVIF_RTSP_STRIP_QUERY", false)
if err != nil {
return Config{}, err
}
cfg := Config{
HTTPAddress: stringEnv("SENSE_HTTP_ADDR", defaultHTTPAddress),
@@ -48,6 +62,10 @@ func Load() (Config, error) {
MediaMTXURL: stringEnv("SENSE_MEDIAMTX_URL", defaultMediaMTXURL),
ReconcileInterval: reconcilePeriod,
ProbeInterval: probePeriod,
ONVIFMode: stringEnv("SENSE_ONVIF_MODE", defaultONVIFMode),
RTSPRewriteHost: stringEnv("SENSE_ONVIF_RTSP_REWRITE_HOST", ""),
RTSPRewritePort: rewritePort,
RTSPStripQuery: stripQuery,
}
if err := cfg.Validate(); err != nil {
return Config{}, err
@@ -78,6 +96,18 @@ func (c Config) Validate() error {
if c.ReconcileInterval <= 0 || c.ProbeInterval <= 0 {
return fmt.Errorf("loop intervals must be positive")
}
if c.ONVIFMode != "" && c.ONVIFMode != "disabled" && c.ONVIFMode != "standard" {
return fmt.Errorf("SENSE_ONVIF_MODE must be disabled or standard")
}
if c.RTSPRewritePort < 0 || c.RTSPRewritePort > 65535 {
return fmt.Errorf("SENSE_ONVIF_RTSP_REWRITE_PORT must be between 0 and 65535")
}
if c.RTSPRewriteHost != "" {
if strings.TrimSpace(c.RTSPRewriteHost) != c.RTSPRewriteHost ||
strings.ContainsAny(c.RTSPRewriteHost, "/@") {
return fmt.Errorf("invalid SENSE_ONVIF_RTSP_REWRITE_HOST")
}
}
return nil
}
@@ -111,3 +141,15 @@ func durationEnv(name string, fallback time.Duration) (time.Duration, error) {
}
return parsed, nil
}
func intEnv(name string, fallback int) (int, error) {
value, ok := os.LookupEnv(name)
if !ok {
return fallback, nil
}
parsed, err := strconv.Atoi(value)
if err != nil {
return 0, fmt.Errorf("invalid %s: %w", name, err)
}
return parsed, nil
}