8460: Accept 403 response from API as "not permitted", instead of "unexpected error".
[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/Sirupsen/logrus"
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         lvl, err := logrus.ParseLevel(cfg.LogLevel)
27         if err != nil {
28                 log.Fatal(err)
29         }
30         rootLogger.Level = lvl
31         switch cfg.LogFormat {
32         case "text":
33                 rootLogger.Formatter = &logrus.TextFormatter{
34                         FullTimestamp:   true,
35                         TimestampFormat: time.RFC3339Nano,
36                 }
37         case "json":
38                 rootLogger.Formatter = &logrus.JSONFormatter{
39                         TimestampFormat: time.RFC3339Nano,
40                 }
41         default:
42                 log.WithField("LogFormat", cfg.LogFormat).Fatal("unknown log format")
43         }
44
45         if *dumpConfig {
46                 txt, err := config.Dump(&cfg)
47                 if err != nil {
48                         log.Fatal(err)
49                 }
50                 fmt.Print(string(txt))
51                 return
52         }
53
54         eventSource := &pgEventSource{
55                 DataSource: cfg.Postgres.ConnectionString(),
56                 QueueSize:  cfg.ServerEventQueue,
57         }
58         srv := &http.Server{
59                 Addr:           cfg.Listen,
60                 ReadTimeout:    time.Minute,
61                 WriteTimeout:   time.Minute,
62                 MaxHeaderBytes: 1 << 20,
63                 Handler: &router{
64                         Config:      &cfg,
65                         eventSource: eventSource,
66                 },
67         }
68         eventSource.NewSink().Stop()
69
70         log.WithField("Listen", srv.Addr).Info("listening")
71         log.Fatal(srv.ListenAndServe())
72 }