Merge branch 'master' into 14716-webdav-cluster-config
[arvados.git] / services / keep-web / main.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package main
6
7 import (
8         "flag"
9         "fmt"
10         "os"
11
12         "git.curoverse.com/arvados.git/lib/config"
13         "git.curoverse.com/arvados.git/sdk/go/arvados"
14         "github.com/coreos/go-systemd/daemon"
15         "github.com/ghodss/yaml"
16         log "github.com/sirupsen/logrus"
17 )
18
19 var (
20         version = "dev"
21 )
22
23 // Config specifies server configuration.
24 type Config struct {
25         Client  arvados.Client
26         Cache   cache
27         cluster *arvados.Cluster
28 }
29
30 func newConfig(arvCfg *arvados.Config) *Config {
31         cfg := Config{}
32         var cls *arvados.Cluster
33         var err error
34         if cls, err = arvCfg.GetCluster(""); err != nil {
35                 log.Fatal(err)
36         }
37         cfg.cluster = cls
38         cfg.Cache.config = &cfg.cluster.Collections.WebDAVCache
39         return &cfg
40 }
41
42 func init() {
43         // MakeArvadosClient returns an error if this env var isn't
44         // available as a default token (even if we explicitly set a
45         // different token before doing anything with the client). We
46         // set this dummy value during init so it doesn't clobber the
47         // one used by "run test servers".
48         if os.Getenv("ARVADOS_API_TOKEN") == "" {
49                 os.Setenv("ARVADOS_API_TOKEN", "xxx")
50         }
51
52         log.SetFormatter(&log.JSONFormatter{
53                 TimestampFormat: "2006-01-02T15:04:05.000000000Z07:00",
54         })
55 }
56
57 func configure(logger log.FieldLogger, args []string) *Config {
58         flags := flag.NewFlagSet(args[0], flag.ExitOnError)
59
60         loader := config.NewLoader(os.Stdin, logger)
61         loader.SetupFlags(flags)
62
63         dumpConfig := flags.Bool("dump-config", false,
64                 "write current configuration to stdout and exit")
65         getVersion := flags.Bool("version", false,
66                 "print version information and exit.")
67
68         args = loader.MungeLegacyConfigArgs(logger, args[1:], "-legacy-keepweb-config")
69         flags.Parse(args)
70
71         // Print version information if requested
72         if *getVersion {
73                 fmt.Printf("keep-web %s\n", version)
74                 return nil
75         }
76
77         arvCfg, err := loader.Load()
78         if err != nil {
79                 log.Fatal(err)
80         }
81         cfg := newConfig(arvCfg)
82
83         if *dumpConfig {
84                 out, err := yaml.Marshal(cfg)
85                 if err != nil {
86                         log.Fatal(err)
87                 }
88                 _, err = os.Stdout.Write(out)
89                 if err != nil {
90                         log.Fatal(err)
91                 }
92                 return nil
93         }
94         return cfg
95 }
96
97 func main() {
98         logger := log.New()
99
100         cfg := configure(logger, os.Args)
101         if cfg == nil {
102                 return
103         }
104
105         log.Printf("keep-web %s started", version)
106
107         os.Setenv("ARVADOS_API_HOST", cfg.cluster.Services.Controller.ExternalURL.Host)
108         srv := &server{Config: cfg}
109         if err := srv.Start(); err != nil {
110                 log.Fatal(err)
111         }
112         if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
113                 log.Printf("Error notifying init daemon: %v", err)
114         }
115         log.Println("Listening at", srv.Addr)
116         if err := srv.Wait(); err != nil {
117                 log.Fatal(err)
118         }
119 }