diff --git a/cmd/api/api.go b/cmd/api/api.go index e5d29f34..c90e0c7d 100644 --- a/cmd/api/api.go +++ b/cmd/api/api.go @@ -7,6 +7,8 @@ import ( "github.com/rs/zerolog" "net" "net/http" + "os" + "strconv" ) func Init() { @@ -35,6 +37,8 @@ func Init() { initStatic(cfg.Mod.StaticDir) initWS(cfg.Mod.Origin) + HandleFunc("api/config", configHandler) + HandleFunc("api/exit", exitHandler) HandleFunc("api/streams", streamsHandler) HandleFunc("api/ws", apiWS) @@ -96,6 +100,17 @@ func middlewareCORS(next http.Handler) http.Handler { }) } +func exitHandler(w http.ResponseWriter, r *http.Request) { + if r.Method != "POST" { + http.Error(w, "", http.StatusBadRequest) + return + } + + s := r.URL.Query().Get("code") + code, _ := strconv.Atoi(s) + os.Exit(code) +} + func streamsHandler(w http.ResponseWriter, r *http.Request) { src := r.URL.Query().Get("src") name := r.URL.Query().Get("name") diff --git a/cmd/api/config.go b/cmd/api/config.go new file mode 100644 index 00000000..9e56fd22 --- /dev/null +++ b/cmd/api/config.go @@ -0,0 +1,42 @@ +package api + +import ( + "github.com/AlexxIT/go2rtc/cmd/app" + "gopkg.in/yaml.v3" + "io" + "net/http" + "os" +) + +func configHandler(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case "GET": + data, err := os.ReadFile(app.ConfigPath) + if err != nil { + http.NotFound(w, r) + return + } + if _, err = w.Write(data); err != nil { + log.Warn().Err(err).Caller().Send() + } + + case "POST": + data, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + // validate config + var tmp struct{} + if err = yaml.Unmarshal(data, &tmp); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + if err = os.WriteFile(app.ConfigPath, data, 0644); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } +} diff --git a/cmd/app/app.go b/cmd/app/app.go index 170c8484..0311131d 100644 --- a/cmd/app/app.go +++ b/cmd/app/app.go @@ -13,16 +13,17 @@ import ( var Version = "0.1-rc.8" var UserAgent = "go2rtc/" + Version +var ConfigPath string + func Init() { - config := flag.String( - "config", - "go2rtc.yaml", + flag.StringVar( + &ConfigPath, "config", "go2rtc.yaml", "Path to go2rtc configuration file", ) flag.Parse() - data, _ = os.ReadFile(*config) + data, _ = os.ReadFile(ConfigPath) var cfg struct { Mod map[string]string `yaml:"log"` diff --git a/cmd/debug/debug.go b/cmd/debug/debug.go index a50c3ed8..e2092ee5 100644 --- a/cmd/debug/debug.go +++ b/cmd/debug/debug.go @@ -4,24 +4,14 @@ import ( "github.com/AlexxIT/go2rtc/cmd/api" "github.com/AlexxIT/go2rtc/cmd/streams" "github.com/AlexxIT/go2rtc/pkg/streamer" - "net/http" - "os" - "strconv" ) func Init() { api.HandleFunc("api/stack", stackHandler) - api.HandleFunc("api/exit", exitHandler) streams.HandleFunc("null", nullHandler) } -func exitHandler(_ http.ResponseWriter, r *http.Request) { - s := r.URL.Query().Get("code") - code, _ := strconv.Atoi(s) - os.Exit(code) -} - func nullHandler(string) (streamer.Producer, error) { return nil, nil } diff --git a/www/editor.html b/www/editor.html new file mode 100644 index 00000000..8765b966 --- /dev/null +++ b/www/editor.html @@ -0,0 +1,59 @@ + + + + File Editor + + + + + + + +
+ +
+
+
+ + + diff --git a/www/main.js b/www/main.js index f7551d26..297fd6df 100644 --- a/www/main.js +++ b/www/main.js @@ -47,6 +47,7 @@ nav li {
  • Streams
  • Devices
  • HomeKit
  • +
  • Config
  • ` + document.body.innerHTML;