18947: Refactor arv-git-httpd as an arvados-server subcommand.
[arvados.git] / cmd / arvados-server / cmd.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         "encoding/json"
9         "fmt"
10         "io"
11         "net/http"
12         "os"
13
14         "git.arvados.org/arvados.git/lib/boot"
15         "git.arvados.org/arvados.git/lib/cloud/cloudtest"
16         "git.arvados.org/arvados.git/lib/cmd"
17         "git.arvados.org/arvados.git/lib/config"
18         "git.arvados.org/arvados.git/lib/controller"
19         "git.arvados.org/arvados.git/lib/crunchrun"
20         "git.arvados.org/arvados.git/lib/dispatchcloud"
21         "git.arvados.org/arvados.git/lib/install"
22         "git.arvados.org/arvados.git/lib/lsf"
23         "git.arvados.org/arvados.git/lib/recovercollection"
24         "git.arvados.org/arvados.git/services/githttpd"
25         "git.arvados.org/arvados.git/services/keepproxy"
26         "git.arvados.org/arvados.git/services/keepstore"
27         "git.arvados.org/arvados.git/services/ws"
28 )
29
30 var (
31         handler = cmd.Multi(map[string]cmd.Handler{
32                 "version":   cmd.Version,
33                 "-version":  cmd.Version,
34                 "--version": cmd.Version,
35
36                 "boot":               boot.Command,
37                 "cloudtest":          cloudtest.Command,
38                 "config-check":       config.CheckCommand,
39                 "config-defaults":    config.DumpDefaultsCommand,
40                 "config-dump":        config.DumpCommand,
41                 "controller":         controller.Command,
42                 "crunch-run":         crunchrun.Command,
43                 "dispatch-cloud":     dispatchcloud.Command,
44                 "dispatch-lsf":       lsf.DispatchCommand,
45                 "git-httpd":          githttpd.Command,
46                 "install":            install.Command,
47                 "init":               install.InitCommand,
48                 "keepproxy":          keepproxy.Command,
49                 "keepstore":          keepstore.Command,
50                 "recover-collection": recovercollection.Command,
51                 "workbench2":         wb2command{},
52                 "ws":                 ws.Command,
53         })
54 )
55
56 func main() {
57         os.Exit(handler.RunCommand(os.Args[0], os.Args[1:], os.Stdin, os.Stdout, os.Stderr))
58 }
59
60 type wb2command struct{}
61
62 func (wb2command) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
63         if len(args) != 3 {
64                 fmt.Fprintf(stderr, "usage: %s api-host listen-addr app-dir\n", prog)
65                 return 1
66         }
67         configJSON, err := json.Marshal(map[string]string{"API_HOST": args[0]})
68         if err != nil {
69                 fmt.Fprintf(stderr, "json.Marshal: %s\n", err)
70                 return 1
71         }
72         mux := http.NewServeMux()
73         mux.Handle("/", http.FileServer(http.Dir(args[2])))
74         mux.HandleFunc("/config.json", func(w http.ResponseWriter, _ *http.Request) {
75                 w.Write(configJSON)
76         })
77         mux.HandleFunc("/_health/ping", func(w http.ResponseWriter, _ *http.Request) {
78                 io.WriteString(w, `{"health":"OK"}`)
79         })
80         err = http.ListenAndServe(args[1], mux)
81         if err != nil {
82                 fmt.Fprintln(stderr, err.Error())
83                 return 1
84         }
85         return 0
86 }