18947: Use git-ls-files instead of git-grep to find go dirs.
[arvados.git] / services / arv-git-httpd / main.go
index 98695c9a9df806164afc59c128e204cb52547cc9..b926ac273520d4d92788bbcd11b5bcd68bf304be 100644 (file)
@@ -1,49 +1,76 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
 package main
 
 import (
        "flag"
-       "log"
+       "fmt"
        "os"
+
+       "git.arvados.org/arvados.git/lib/cmd"
+       "git.arvados.org/arvados.git/lib/config"
+       "github.com/coreos/go-systemd/daemon"
+       "github.com/ghodss/yaml"
+       log "github.com/sirupsen/logrus"
 )
 
-type config struct {
-       Addr       string
-       GitCommand string
-       Root       string
-}
+var version = "dev"
+
+func main() {
+       logger := log.New()
+       log.SetFormatter(&log.JSONFormatter{
+               TimestampFormat: "2006-01-02T15:04:05.000000000Z07:00",
+       })
+
+       flags := flag.NewFlagSet(os.Args[0], flag.ContinueOnError)
+       loader := config.NewLoader(os.Stdin, logger)
+       loader.SetupFlags(flags)
+
+       dumpConfig := flags.Bool("dump-config", false, "write current configuration to stdout and exit (useful for migrating from command line flags to config file)")
+       getVersion := flags.Bool("version", false, "print version information and exit.")
+
+       args := loader.MungeLegacyConfigArgs(logger, os.Args[1:], "-legacy-git-httpd-config")
+       if ok, code := cmd.ParseFlags(flags, os.Args[0], args, "", os.Stderr); !ok {
+               os.Exit(code)
+       } else if *getVersion {
+               fmt.Printf("arv-git-httpd %s\n", version)
+               return
+       }
 
-var theConfig *config
+       cfg, err := loader.Load()
+       if err != nil {
+               log.Fatal(err)
+       }
 
-func init() {
-       theConfig = &config{}
-       flag.StringVar(&theConfig.Addr, "address", "0.0.0.0:80",
-               "Address to listen on, \"host:port\".")
-       flag.StringVar(&theConfig.GitCommand, "git-command", "/usr/bin/git",
-               "Path to git or gitolite-shell executable. Each authenticated request will execute this program with a single argument, \"http-backend\".")
-       cwd, err := os.Getwd()
+       cluster, err := cfg.GetCluster("")
        if err != nil {
-               log.Fatalln("Getwd():", err)
+               log.Fatal(err)
        }
-       flag.StringVar(&theConfig.Root, "repo-root", cwd,
-               "Path to git repositories.")
-
-       // MakeArvadosClient returns an error if token is unset (even
-       // though we don't need to do anything requiring
-       // authentication yet). We can't do this in newArvadosClient()
-       // just before calling MakeArvadosClient(), though, because
-       // that interferes with the env var needed by "run test
-       // servers".
-       os.Setenv("ARVADOS_API_TOKEN", "xxx")
-}
 
-func main() {
-       flag.Parse()
-       srv := &server{}
+       if *dumpConfig {
+               out, err := yaml.Marshal(cfg)
+               if err != nil {
+                       log.Fatal(err)
+               }
+               _, err = os.Stdout.Write(out)
+               if err != nil {
+                       log.Fatal(err)
+               }
+               return
+       }
+
+       srv := &server{cluster: cluster}
        if err := srv.Start(); err != nil {
                log.Fatal(err)
        }
+       if _, err := daemon.SdNotify(false, "READY=1"); err != nil {
+               log.Printf("Error notifying init daemon: %v", err)
+       }
+       log.Printf("arv-git-httpd %s started", version)
        log.Println("Listening at", srv.Addr)
-       log.Println("Repository root", theConfig.Root)
+       log.Println("Repository root", cluster.Git.Repositories)
        if err := srv.Wait(); err != nil {
                log.Fatal(err)
        }