76 lines
1.5 KiB
Go
76 lines
1.5 KiB
Go
// Copyright 2015 Daniel Theophanes.
|
|
// Use of this source code is governed by a zlib-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package service
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
type linuxSystemService struct {
|
|
name string
|
|
detect func() bool
|
|
interactive func() bool
|
|
new func(i Interface, c *Config) (Service, error)
|
|
}
|
|
|
|
func (sc linuxSystemService) String() string {
|
|
return sc.name
|
|
}
|
|
func (sc linuxSystemService) Detect() bool {
|
|
return sc.detect()
|
|
}
|
|
func (sc linuxSystemService) Interactive() bool {
|
|
return sc.interactive()
|
|
}
|
|
func (sc linuxSystemService) New(i Interface, c *Config) (Service, error) {
|
|
return sc.new(i, c)
|
|
}
|
|
|
|
func init() {
|
|
ChooseSystem(linuxSystemService{
|
|
name: "linux-systemd",
|
|
detect: isSystemd,
|
|
interactive: func() bool {
|
|
is, _ := isInteractive()
|
|
return is
|
|
},
|
|
new: newSystemdService,
|
|
},
|
|
linuxSystemService{
|
|
name: "linux-upstart",
|
|
detect: isUpstart,
|
|
interactive: func() bool {
|
|
is, _ := isInteractive()
|
|
return is
|
|
},
|
|
new: newUpstartService,
|
|
},
|
|
linuxSystemService{
|
|
name: "unix-systemv",
|
|
detect: func() bool { return true },
|
|
interactive: func() bool {
|
|
is, _ := isInteractive()
|
|
return is
|
|
},
|
|
new: newSystemVService,
|
|
},
|
|
)
|
|
}
|
|
|
|
func isInteractive() (bool, error) {
|
|
// TODO: This is not true for user services.
|
|
return os.Getppid() != 1, nil
|
|
}
|
|
|
|
var tf = map[string]interface{}{
|
|
"cmd": func(s string) string {
|
|
return `"` + strings.Replace(s, `"`, `\"`, -1) + `"`
|
|
},
|
|
"cmdEscape": func(s string) string {
|
|
return strings.Replace(s, " ", `\x20`, -1)
|
|
},
|
|
}
|