dev privileges, db
[arvados.git] / services / boot / os_package.go
1 package main
2
3 import (
4         "context"
5         "fmt"
6         "os"
7         "strings"
8         "sync"
9 )
10
11 var (
12         installCerts = &osPackage{
13                 Debian: "ca-certificates",
14         }
15         installNginx = &osPackage{
16                 Debian: "nginx",
17         }
18         installRunit = &osPackage{
19                 Debian: "runit",
20         }
21 )
22
23 type osPackage struct {
24         Debian string
25         RedHat string
26 }
27
28 var (
29         osPackageMutex     sync.Mutex
30         osPackageDidUpdate bool
31 )
32
33 func (pkg *osPackage) Boot(ctx context.Context) error {
34         osPackageMutex.Lock()
35         defer osPackageMutex.Unlock()
36
37         if _, err := os.Stat("/var/lib/dpkg/info/" + pkg.Debian + ".list"); err == nil {
38                 return nil
39         }
40         if !osPackageDidUpdate {
41                 d, err := os.Open("/var/lib/apt/lists")
42                 if err != nil {
43                         return err
44                 }
45                 defer d.Close()
46                 if files, err := d.Readdir(4); len(files) < 4 || err != nil {
47                         err = pkg.aptGet("update")
48                         if err != nil {
49                                 return err
50                         }
51                         osPackageDidUpdate = true
52                 }
53         }
54         return pkg.aptGet("install", "-y", "--no-install-recommends", pkg.Debian)
55 }
56
57 func (*osPackage) aptGet(args ...string) error {
58         cmd := command("apt-get", args...)
59         for _, kv := range os.Environ() {
60                 if !strings.HasPrefix(kv, "DEBIAN_FRONTEND=") {
61                         cmd.Env = append(cmd.Env, kv)
62                 }
63         }
64         cmd.Env = append(cmd.Env, "DEBIAN_FRONTEND=noninteractive")
65         err := cmd.Run()
66         if err != nil {
67                 return fmt.Errorf("%s: %s", cmd.Args, err)
68         }
69         return nil
70 }