aboutsummaryrefslogtreecommitdiff
path: root/server/main.go
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2021-07-24 17:54:17 -0700
committerJeff Halter <868228+jhalter@users.noreply.github.com>2021-07-24 17:54:17 -0700
commit6988a0571d5d37ea0f38ee3e4066533158f608bc (patch)
tree172010de54ea7e732d7daa836db659021dc8a933 /server/main.go
Initial squashed commit
Diffstat (limited to 'server/main.go')
-rw-r--r--server/main.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/server/main.go b/server/main.go
new file mode 100644
index 0000000..0b9a09c
--- /dev/null
+++ b/server/main.go
@@ -0,0 +1,73 @@
+package main
+
+import (
+ "context"
+ "flag"
+ "fmt"
+ "github.com/jhalter/mobius"
+ "go.uber.org/zap"
+ "go.uber.org/zap/zapcore"
+ "os"
+)
+
+const (
+ defaultConfigPath = "/usr/local/var/mobius/config/" // matches Homebrew default config location
+ defaultPort = 5500
+)
+
+func main() {
+ ctx, cancelRoot := context.WithCancel(context.Background())
+
+ basePort := flag.Int("bind", defaultPort, "Bind address and port")
+ configDir := flag.String("config", defaultConfigPath, "Path to config root")
+ version := flag.Bool("version", false, "print version and exit")
+ logLevel := flag.String("log-level", "info", "Log level")
+ flag.Parse()
+
+ if *version {
+ fmt.Printf("v%s\n", hotline.VERSION)
+ os.Exit(0)
+ }
+
+ zapLvl, ok := zapLogLevel[*logLevel]
+ if !ok {
+ fmt.Printf("Invalid log level %s. Must be debug, info, warn, or error.\n", *logLevel)
+ os.Exit(0)
+ }
+
+ cores := []zapcore.Core{newStdoutCore(zapLvl)}
+ l := zap.New(zapcore.NewTee(cores...))
+ defer func() { _ = l.Sync() }()
+ logger := l.Sugar()
+
+ if _, err := os.Stat(*configDir); os.IsNotExist(err) {
+ logger.Fatalw("Configuration directory not found", "path", configDir)
+ }
+
+ srv, err := hotline.NewServer(*configDir, "", *basePort, logger)
+ if err != nil {
+ logger.Fatal(err)
+ }
+
+ // Serve Hotline requests until program exit
+ logger.Fatal(srv.ListenAndServe(ctx, cancelRoot))
+}
+
+func newStdoutCore(level zapcore.Level) zapcore.Core {
+ encoderCfg := zap.NewProductionEncoderConfig()
+ encoderCfg.TimeKey = "timestamp"
+ encoderCfg.EncodeTime = zapcore.ISO8601TimeEncoder
+
+ return zapcore.NewCore(
+ zapcore.NewConsoleEncoder(encoderCfg),
+ zapcore.Lock(os.Stdout),
+ level,
+ )
+}
+
+var zapLogLevel = map[string]zapcore.Level{
+ "debug": zap.DebugLevel,
+ "info": zap.InfoLevel,
+ "warn": zap.WarnLevel,
+ "error": zap.ErrorLevel,
+}