more vault
[arvados.git] / lib / setup / setup.go
1 package setup
2
3 import (
4         "flag"
5         "fmt"
6         "log"
7         "os"
8
9         "git.curoverse.com/arvados.git/lib/agent"
10         "git.curoverse.com/arvados.git/sdk/go/config"
11         vaultAPI "github.com/hashicorp/vault/api"
12 )
13
14 func Command() *Setup {
15         hostname, err := os.Hostname()
16         if err != nil {
17                 log.Fatalf("hostname: %s", err)
18         }
19
20         return &Setup{
21                 Agent:      agent.Command(),
22                 LANHost:    hostname,
23                 PreloadDir: "/var/cache/arvados",
24         }
25 }
26
27 type Setup struct {
28         *agent.Agent
29         InitVault  bool
30         LANHost    string
31         PreloadDir string
32
33         encryptKey  string
34         masterToken string
35         vaultCfg    *vaultAPI.Config
36 }
37
38 func (s *Setup) ParseFlags(args []string) error {
39         fs := flag.NewFlagSet("setup", flag.ContinueOnError)
40         fs.StringVar(&s.ClusterID, "cluster-id", s.ClusterID, "five-character cluster ID")
41         fs.BoolVar(&s.InitVault, "init-vault", s.InitVault, "initialize the vault if needed")
42         fs.BoolVar(&s.Unseal, "unseal", s.Unseal, "unseal the vault automatically")
43         return fs.Parse(args)
44 }
45
46 func (s *Setup) Run() error {
47         err := config.LoadFile(s, s.DefaultConfigFile())
48         if err != nil && !os.IsNotExist(err) {
49                 return err
50         }
51         for _, f := range []func() error{
52                 s.makeDirs,
53                 (&osPackage{Debian: "ca-certificates"}).install,
54                 (&osPackage{Debian: "nginx"}).install,
55                 s.installRunit,
56                 s.installConsul,
57                 s.installVault,
58         } {
59                 err := f()
60                 if err != nil {
61                         return err
62                 }
63         }
64         return nil
65 }
66
67 func (s *Setup) makeDirs() error {
68         for _, path := range []string{s.DataDir, s.UsrDir, s.UsrDir + "/bin"} {
69                 if fi, err := os.Stat(path); err != nil {
70                         err = os.MkdirAll(path, 0755)
71                         if err != nil {
72                                 return err
73                         }
74                 } else if !fi.IsDir() {
75                         return fmt.Errorf("%s: is not a directory", path)
76                 }
77         }
78         return nil
79 }