]> git.r.bdr.sh - rbdr/mobius/blobdiff - cmd/mobius-hotline-server/main.go
Register server address on local network with Bonjour
[rbdr/mobius] / cmd / mobius-hotline-server / main.go
index 04b3c57a3597920b5a15a06df7b4d2c4748d6908..e2c7789b19877cd1313792e39f5121e4e070b66a 100644 (file)
@@ -3,16 +3,13 @@ package main
 import (
        "context"
        "embed"
-       "encoding/json"
        "flag"
        "fmt"
        "github.com/jhalter/mobius/hotline"
        "github.com/jhalter/mobius/internal/mobius"
-       "gopkg.in/natefinch/lumberjack.v2"
+       "github.com/oleksandr/bonjour"
        "io"
        "log"
-       "log/slog"
-       "net/http"
        "os"
        "os/signal"
        "path"
@@ -23,12 +20,6 @@ import (
 //go:embed mobius/config
 var cfgTemplate embed.FS
 
-var logLevels = map[string]slog.Level{
-       "debug": slog.LevelDebug,
-       "info":  slog.LevelInfo,
-       "error": slog.LevelError,
-}
-
 // Values swapped in by go-releaser at build time
 var (
        version = "dev"
@@ -44,7 +35,7 @@ func main() {
 
        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")
@@ -54,21 +45,11 @@ func main() {
        flag.Parse()
 
        if *printVersion {
-               fmt.Printf("mobius-hotline-server %s, commit %s, built at %s", version, commit, date)
+               fmt.Printf("mobius-hotline-server %s, commit %s, built on %s\n", version, commit, date)
                os.Exit(0)
        }
 
-       slogger := slog.New(
-               slog.NewTextHandler(
-                       io.MultiWriter(os.Stdout, &lumberjack.Logger{
-                               Filename:   *logFile,
-                               MaxSize:    100, // MB
-                               MaxBackups: 3,
-                               MaxAge:     365, // days
-                       }),
-                       &slog.HandlerOptions{Level: logLevels[*logLevel]},
-               ),
-       )
+       slogger := mobius.NewLogger(logLevel, logFile)
 
        // It's important for Windows compatibility to use path.Join and not filepath.Join for the config dir initialization.
        // https://github.com/golang/go/issues/44305
@@ -161,26 +142,9 @@ func main() {
                }
        }
 
-       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() {
@@ -200,31 +164,19 @@ func main() {
                }
        }()
 
-       slogger.Info("Hotline server started",
-               "version", version,
-               "config", *configDir,
-               "API port", fmt.Sprintf("%s:%v", *netInterface, *basePort),
-               "Transfer port", fmt.Sprintf("%s:%v", *netInterface, *basePort+1),
-       )
+       slogger.Info("Hotline server started", "version", version, "config", *configDir)
 
        // Assign functions to handle specific Hotline transaction types
        mobius.RegisterHandlers(srv)
 
-       // Serve Hotline requests until program exit
-       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())
+       s, err := bonjour.Register(srv.Config.Name, "_hotline._tcp", "", *basePort, []string{"txtv=1", "app=hotline"}, nil)
        if err != nil {
-               panic(err)
+               slogger.Error("Error registering Hotline server with Bonjour", "err", err)
        }
+       defer s.Shutdown()
 
-       _, _ = io.WriteString(w, string(u))
+       // Serve Hotline requests until program exit
+       log.Fatal(srv.ListenAndServe(ctx))
 }
 
 func configSearchPaths() string {