8460: Merge branch 'master' into 8460-websocket-go
[arvados.git] / services / ws / main.go
1 package main
2
3 import (
4         "flag"
5         "fmt"
6         "net/http"
7         "time"
8
9         "git.curoverse.com/arvados.git/sdk/go/config"
10         "github.com/coreos/go-systemd/daemon"
11 )
12
13 func main() {
14         log := logger(nil)
15
16         configPath := flag.String("config", "/etc/arvados/ws/ws.yml", "`path` to config file")
17         dumpConfig := flag.Bool("dump-config", false, "show current configuration and exit")
18         cfg := defaultConfig()
19         flag.Parse()
20
21         err := config.LoadFile(&cfg, *configPath)
22         if err != nil {
23                 log.Fatal(err)
24         }
25
26         loggerConfig(cfg)
27
28         if *dumpConfig {
29                 txt, err := config.Dump(&cfg)
30                 if err != nil {
31                         log.Fatal(err)
32                 }
33                 fmt.Print(string(txt))
34                 return
35         }
36
37         log.Info("started")
38         eventSource := &pgEventSource{
39                 DataSource: cfg.Postgres.ConnectionString(),
40                 QueueSize:  cfg.ServerEventQueue,
41         }
42         srv := &http.Server{
43                 Addr:           cfg.Listen,
44                 ReadTimeout:    time.Minute,
45                 WriteTimeout:   time.Minute,
46                 MaxHeaderBytes: 1 << 20,
47                 Handler: &router{
48                         Config:         &cfg,
49                         eventSource:    eventSource,
50                         newPermChecker: func() permChecker { return newPermChecker(cfg.Client) },
51                 },
52         }
53         // Bootstrap the eventSource by attaching a dummy subscriber
54         // and hanging up.
55         eventSource.NewSink().Stop()
56
57         if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
58                 log.WithError(err).Warn("error notifying init daemon")
59         }
60
61         log.WithField("Listen", srv.Addr).Info("listening")
62         log.Fatal(srv.ListenAndServe())
63 }