Merge branch '9988-cwl-arv-hints' closes #9988
[arvados.git] / services / arv-git-httpd / main.go
1 package main
2
3 import (
4         "encoding/json"
5         "flag"
6         "log"
7         "os"
8         "regexp"
9
10         "git.curoverse.com/arvados.git/sdk/go/arvados"
11         "git.curoverse.com/arvados.git/sdk/go/config"
12         "github.com/coreos/go-systemd/daemon"
13 )
14
15 // Server configuration
16 type Config struct {
17         Client     arvados.Client
18         Listen     string
19         GitCommand string
20         RepoRoot   string
21 }
22
23 var theConfig = defaultConfig()
24
25 func defaultConfig() *Config {
26         cwd, err := os.Getwd()
27         if err != nil {
28                 log.Fatalln("Getwd():", err)
29         }
30         return &Config{
31                 Listen:     ":80",
32                 GitCommand: "/usr/bin/git",
33                 RepoRoot:   cwd,
34         }
35 }
36
37 func init() {
38         const defaultCfgPath = "/etc/arvados/arv-git-httpd/config.json"
39         const deprecated = " (DEPRECATED -- use config file instead)"
40         flag.StringVar(&theConfig.Listen, "address", theConfig.Listen,
41                 "Address to listen on, \"host:port\" or \":port\"."+deprecated)
42         flag.StringVar(&theConfig.GitCommand, "git-command", theConfig.GitCommand,
43                 "Path to git or gitolite-shell executable. Each authenticated request will execute this program with a single argument, \"http-backend\"."+deprecated)
44         flag.StringVar(&theConfig.RepoRoot, "repo-root", theConfig.RepoRoot,
45                 "Path to git repositories."+deprecated)
46
47         cfgPath := flag.String("config", defaultCfgPath, "Configuration file `path`.")
48         flag.Usage = usage
49         flag.Parse()
50
51         err := config.LoadFile(theConfig, *cfgPath)
52         if err != nil {
53                 h := os.Getenv("ARVADOS_API_HOST")
54                 if h == "" || !os.IsNotExist(err) || *cfgPath != defaultCfgPath {
55                         log.Fatal(err)
56                 }
57                 log.Print("DEPRECATED: No config file found, but ARVADOS_API_HOST environment variable is set. Please use a config file instead.")
58                 theConfig.Client.APIHost = h
59                 if regexp.MustCompile("^(?i:1|yes|true)$").MatchString(os.Getenv("ARVADOS_API_HOST_INSECURE")) {
60                         theConfig.Client.Insecure = true
61                 }
62                 if j, err := json.MarshalIndent(theConfig, "", "    "); err == nil {
63                         log.Print("Current configuration:\n", string(j))
64                 }
65         }
66 }
67
68 func main() {
69         srv := &server{}
70         if err := srv.Start(); err != nil {
71                 log.Fatal(err)
72         }
73         if _, err := daemon.SdNotify("READY=1"); err != nil {
74                 log.Printf("Error notifying init daemon: %v", err)
75         }
76         log.Println("Listening at", srv.Addr)
77         log.Println("Repository root", theConfig.RepoRoot)
78         if err := srv.Wait(); err != nil {
79                 log.Fatal(err)
80         }
81 }