import (
"context"
"embed"
- "encoding/json"
"flag"
"fmt"
"github.com/jhalter/mobius/hotline"
"io"
"log"
"log/slog"
- "net/http"
"os"
"os/signal"
"path"
netInterface := flag.String("interface", "", "IP addr of interface to listen on. Defaults to all interfaces.")
basePort := flag.Int("bind", 5500, "Base Hotline server port. File transfer port is base port + 1.")
- statsPort := flag.String("stats-port", "", "Enable stats HTTP endpoint on address and port")
+ apiAddr := flag.String("api-addr", "", "Enable HTTP API endpoint on address and port")
configDir := flag.String("config", configSearchPaths(), "Path to config root")
printVersion := flag.Bool("version", false, "Print version and exit")
logLevel := flag.String("log-level", "info", "Log level")
}
}
- reloadHandler := func(reloadFunc func()) func(w http.ResponseWriter, _ *http.Request) {
- return func(w http.ResponseWriter, _ *http.Request) {
- reloadFunc()
-
- _, _ = io.WriteString(w, `{ "msg": "config reloaded" }`)
- }
- }
-
- sh := APIHandler{hlServer: srv}
- if *statsPort != "" {
- http.HandleFunc("/", sh.RenderStats)
- http.HandleFunc("/api/v1/stats", sh.RenderStats)
- http.HandleFunc("/api/v1/reload", reloadHandler(reloadFunc))
-
- go func(srv *hotline.Server) {
- err = http.ListenAndServe(":"+*statsPort, nil)
- if err != nil {
- log.Fatal(err)
- }
- }(srv)
+ if *apiAddr != "" {
+ sh := mobius.NewAPIServer(srv, reloadFunc, slogger)
+ go sh.Serve(*apiAddr)
}
go func() {
log.Fatal(srv.ListenAndServe(ctx))
}
-type APIHandler struct {
- hlServer *hotline.Server
-}
-
-func (sh *APIHandler) RenderStats(w http.ResponseWriter, _ *http.Request) {
- u, err := json.Marshal(sh.hlServer.CurrentStats())
- if err != nil {
- panic(err)
- }
-
- _, _ = io.WriteString(w, string(u))
-}
-
func configSearchPaths() string {
for _, cfgPath := range mobius.ConfigSearchOrder {
if _, err := os.Stat(cfgPath); err == nil {