fix: viewer port starts/stops dynamically on config save, auth bypass removed

This commit is contained in:
Claus Lohmar 2026-08-06 18:52:02 +01:00
parent 2032402597
commit 72e936d3f1
2 changed files with 23 additions and 7 deletions

23
main.go
View file

@ -8,6 +8,7 @@ package main
import ( import (
"fmt" "fmt"
"log" "log"
"net/http"
"os" "os"
"os/signal" "os/signal"
"syscall" "syscall"
@ -82,8 +83,19 @@ func main() {
if app.go2rtc != nil { app.go2rtc.Stop() } if app.go2rtc != nil { app.go2rtc.Stop() }
if app.snapshots != nil { app.snapshots.StopAll() } if app.snapshots != nil { app.snapshots.StopAll() }
if app.recorder != nil { app.recorder.StopAll() } if app.recorder != nil { app.recorder.StopAll() }
// Restart with the updated config from the server's in-memory copy. // Handle viewer server toggle.
liveCfg := app.server.appConfig liveCfg := app.server.appConfig
if liveCfg.Auth.Viewer.Enabled && app.viewerSrv == nil {
go func() {
v, err := app.server.StartViewerServer()
if err != nil { log.Printf("Viewer server: %v", err) }
app.viewerSrv = v
}()
} else if !liveCfg.Auth.Viewer.Enabled && app.viewerSrv != nil {
log.Println("Stopping viewer server...")
app.viewerSrv.Close()
app.viewerSrv = nil
}
if liveCfg.Go2RTC.Enabled { if liveCfg.Go2RTC.Enabled {
app.go2rtc = NewGo2RTCManager(liveCfg.Go2RTC) app.go2rtc = NewGo2RTCManager(liveCfg.Go2RTC)
app.go2rtc.Start(liveCfg.Cameras) app.go2rtc.Start(liveCfg.Cameras)
@ -104,9 +116,11 @@ func main() {
// Start viewer server only if enabled. // Start viewer server only if enabled.
if cfg.Auth.Viewer.Enabled { if cfg.Auth.Viewer.Enabled {
go func() { go func() {
if err := app.server.StartViewerServer(); err != nil { v, err := app.server.StartViewerServer()
if err != nil {
log.Printf("Viewer server: %v", err) log.Printf("Viewer server: %v", err)
} }
app.viewerSrv = v
}() }()
} else { } else {
log.Println("Viewer server: disabled in config") log.Println("Viewer server: disabled in config")
@ -156,6 +170,7 @@ type App struct {
snapshots *SnapshotEngine snapshots *SnapshotEngine
recorder *RecorderManager recorder *RecorderManager
cleaner *Cleaner cleaner *Cleaner
viewerSrv *http.Server
} }
// StartServer initializes and starts the HTTP server. // StartServer initializes and starts the HTTP server.
@ -169,9 +184,9 @@ func (a *App) StartServer() error {
} }
// StartViewerServer launches the viewer-only server. // StartViewerServer launches the viewer-only server.
func (a *App) StartViewerServer() error { func (a *App) StartViewerServer() (*http.Server, error) {
if a.server == nil { if a.server == nil {
return fmt.Errorf("main server not initialized") return nil, fmt.Errorf("main server not initialized")
} }
return a.server.StartViewerServer() return a.server.StartViewerServer()
} }

View file

@ -60,16 +60,17 @@ func (s *Server) ListenAndServe() error {
} }
// StartViewerServer launches the viewer-only server on the configured port. // StartViewerServer launches the viewer-only server on the configured port.
func (s *Server) StartViewerServer() error { func (s *Server) StartViewerServer() (*http.Server, error) {
viewerAddr := s.config.Server.BindHost + s.config.Server.ViewerPort viewerAddr := s.config.Server.BindHost + s.config.Server.ViewerPort
if viewerAddr == "" || viewerAddr == ":0" || viewerAddr == ":" { if viewerAddr == "" || viewerAddr == ":0" || viewerAddr == ":" {
return nil // viewer port not configured return nil, nil
} }
viewerMux := http.NewServeMux() viewerMux := http.NewServeMux()
viewerMux.Handle("/", s.middleware(s.viewerOnly(s.mux))) viewerMux.Handle("/", s.middleware(s.viewerOnly(s.mux)))
v := &http.Server{Addr: viewerAddr, Handler: viewerMux}
log.Printf("Viewer server listening on %s (live wall only, no auth)", viewerAddr) log.Printf("Viewer server listening on %s (live wall only, no auth)", viewerAddr)
return http.ListenAndServe(viewerAddr, viewerMux) return v, v.ListenAndServe()
} }
// Close shuts down the HTTP server. // Close shuts down the HTTP server.