]> git.r.bdr.sh - rbdr/mobius/blame - cmd/mobius-hotline-server/main.go
Tests and minor fixes
[rbdr/mobius] / cmd / mobius-hotline-server / main.go
CommitLineData
6988a057
JH
1package main
2
3import (
4 "context"
5 "flag"
6 "fmt"
22c599ab 7 "github.com/jhalter/mobius/hotline"
6988a057
JH
8 "go.uber.org/zap"
9 "go.uber.org/zap/zapcore"
10 "os"
11)
12
13const (
14 defaultConfigPath = "/usr/local/var/mobius/config/" // matches Homebrew default config location
15 defaultPort = 5500
16)
17
18func main() {
19 ctx, cancelRoot := context.WithCancel(context.Background())
20
21 basePort := flag.Int("bind", defaultPort, "Bind address and port")
22 configDir := flag.String("config", defaultConfigPath, "Path to config root")
23 version := flag.Bool("version", false, "print version and exit")
24 logLevel := flag.String("log-level", "info", "Log level")
25 flag.Parse()
26
27 if *version {
28 fmt.Printf("v%s\n", hotline.VERSION)
29 os.Exit(0)
30 }
31
32 zapLvl, ok := zapLogLevel[*logLevel]
33 if !ok {
34 fmt.Printf("Invalid log level %s. Must be debug, info, warn, or error.\n", *logLevel)
35 os.Exit(0)
36 }
37
38 cores := []zapcore.Core{newStdoutCore(zapLvl)}
39 l := zap.New(zapcore.NewTee(cores...))
40 defer func() { _ = l.Sync() }()
41 logger := l.Sugar()
42
43 if _, err := os.Stat(*configDir); os.IsNotExist(err) {
44 logger.Fatalw("Configuration directory not found", "path", configDir)
45 }
46
00d1ef67
JH
47 hotline.FS = hotline.OSFileStore{}
48
6988a057
JH
49 srv, err := hotline.NewServer(*configDir, "", *basePort, logger)
50 if err != nil {
51 logger.Fatal(err)
52 }
53
54 // Serve Hotline requests until program exit
55 logger.Fatal(srv.ListenAndServe(ctx, cancelRoot))
56}
57
58func newStdoutCore(level zapcore.Level) zapcore.Core {
59 encoderCfg := zap.NewProductionEncoderConfig()
60 encoderCfg.TimeKey = "timestamp"
61 encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
62
63 return zapcore.NewCore(
64 zapcore.NewConsoleEncoder(encoderCfg),
65 zapcore.Lock(os.Stdout),
66 level,
67 )
68}
69
70var zapLogLevel = map[string]zapcore.Level{
71 "debug": zap.DebugLevel,
72 "info": zap.InfoLevel,
73 "warn": zap.WarnLevel,
74 "error": zap.ErrorLevel,
75}