X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/blobdiff_plain/fd740bc499ebc6d3a381479316f74cdc736d02de..d03ffd881e4a8bd93a2936556fd09214b4ad0bd1:/cmd/mobius-hotline-server/main.go diff --git a/cmd/mobius-hotline-server/main.go b/cmd/mobius-hotline-server/main.go index 04b3c57..1390dda 100644 --- a/cmd/mobius-hotline-server/main.go +++ b/cmd/mobius-hotline-server/main.go @@ -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,21 @@ 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()) - if err != nil { - panic(err) + if srv.Config.EnableBonjour { + s, err := bonjour.Register(srv.Config.Name, "_hotline._tcp", "", *basePort, []string{"txtv=1", "app=hotline"}, nil) + if err != nil { + 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 {