ec906adefe61b6017a1fe86f7055c26aabf269e3
[arvados.git] / services / boot / runit.go
1 package main
2
3 import (
4         "bytes"
5         "context"
6         "fmt"
7         "io/ioutil"
8         "os"
9         "path"
10 )
11
12 type runitService struct {
13         name string
14         cmd  string
15         args []string
16 }
17
18 func (r *runitService) Start(ctx context.Context) error {
19         if err := installRunit.Boot(ctx); err != nil {
20                 return err
21         }
22
23         var script bytes.Buffer
24         fmt.Fprintf(script, "#!/bin/sh\n\nexec %q", r.cmd)
25         for _, arg := range r.args {
26                 fmt.Fprintf(script, " %q", arg)
27         }
28         fmt.Fprintf(script, " 2>&1\n")
29
30         return atomicWriteFile(path.Join(r.svdir(ctx), "run"), script.Bytes(), 0755)
31 }
32
33 func (r *runitService) Running(ctx context.Context) (bool, error) {
34         if err := installRunit.Boot(ctx); err != nil {
35                 return false, err
36         }
37         return runStatusCmd("sv", "stat", r.svdir(ctx))
38 }
39
40 func (r *runitService) svdir(ctx context.Context) string {
41         return path.Join(cfg(ctx).RunitSvDir, r.name)
42 }