split webgui,main from server.go
[arvados.git] / services / boot / runit.go
1 package main
2
3 import (
4         "context"
5         "fmt"
6         "io/ioutil"
7         "os"
8         "path"
9 )
10
11 type runitService struct {
12         name string
13         cmd  string
14         args []string
15 }
16
17 func (r *runitService) Start(ctx context.Context) error {
18         if err := installRunit.Boot(ctx); err != nil {
19                 return err
20         }
21         svdir := r.svdir(ctx)
22         if err := os.MkdirAll(svdir, 0755); err != nil {
23                 return err
24         }
25         tmp, err := ioutil.TempFile(svdir, "run~")
26         if err != nil {
27                 return err
28         }
29         fmt.Fprintf(tmp, "#!/bin/sh\n\nexec %q", r.cmd)
30         for _, arg := range r.args {
31                 fmt.Fprintf(tmp, " %q", arg)
32         }
33         fmt.Fprintf(tmp, " 2>&1\n")
34         tmp.Close()
35         if err := os.Chmod(tmp.Name(), 0755); err != nil {
36                 os.Remove(tmp.Name())
37                 return err
38         }
39         if err := os.Rename(tmp.Name(), path.Join(svdir, "run")); err != nil {
40                 os.Remove(tmp.Name())
41                 return err
42         }
43         return nil
44 }
45
46 func (r *runitService) Running(ctx context.Context) (bool, error) {
47         if err := installRunit.Boot(ctx); err != nil {
48                 return false, err
49         }
50         return runStatusCmd("sv", "stat", r.svdir(ctx))
51 }
52
53 func (r *runitService) svdir(ctx context.Context) string {
54         return path.Join(cfg(ctx).RunitSvDir, r.name)
55 }