add consul task
[arvados.git] / services / boot / systemd.go
1 package main
2
3 import (
4         "fmt"
5         "os"
6         "os/exec"
7 )
8
9 type supervisor interface {
10         Check() (bool, error)
11         Start() error
12 }
13
14 func newSupervisor(name, cmd string, args ...string) supervisor {
15         return &systemdUnit{
16                 name: name,
17                 cmd: cmd,
18                 args: args,
19         }
20 }
21
22 type systemdUnit struct {
23         name string
24         cmd string
25         args []string
26 }
27
28 func (u *systemdUnit) Start() error {
29         cmd := exec.Command("systemd-run", append([]string{"--unit=arvados-"+u.name, u.cmd}, u.args...)...)
30         cmd.Stdout = os.Stderr
31         cmd.Stderr = os.Stderr
32         err := cmd.Run()
33         if err != nil {
34                 err = fmt.Errorf("systemd-run: %s", err)
35         }
36         return err
37 }
38
39 func (u *systemdUnit) Check() (bool, error) {
40         cmd := exec.Command("systemctl", "status", "arvados-"+u.name)
41         cmd.Stdout = os.Stderr
42         cmd.Stderr = os.Stderr
43         err := cmd.Run()
44         switch err.(type) {
45         case *exec.ExitError:
46                 return false, nil
47         case nil:
48                 return true, nil
49         default:
50                 return false, err
51         }
52 }