go-serviceman/manager/install.go

92 lines
1.9 KiB
Go
Raw Normal View History

2019-07-01 08:44:48 +00:00
//go:generate go run -mod=vendor github.com/UnnoTed/fileb0x b0x.toml
2019-07-04 07:36:35 +00:00
package manager
2019-07-01 08:44:48 +00:00
import (
2019-07-02 06:02:09 +00:00
"fmt"
2019-07-01 08:44:48 +00:00
"os"
2019-07-03 08:11:50 +00:00
"os/exec"
2019-07-01 08:44:48 +00:00
"path/filepath"
"strings"
2019-07-01 08:44:48 +00:00
2019-07-03 05:51:30 +00:00
"git.rootprojects.org/root/go-serviceman/service"
)
2019-07-01 08:44:48 +00:00
// Install will do a best-effort attempt to install a start-on-startup
// user or system service via systemd, launchd, or reg.exe
func Install(c *service.Service) (string, error) {
2019-07-01 08:44:48 +00:00
if "" == c.Exec {
c.Exec = c.Name
}
if !c.System {
home, err := os.UserHomeDir()
if nil != err {
2019-07-02 06:02:09 +00:00
fmt.Fprintf(os.Stderr, "Unrecoverable Error: %s", err)
os.Exit(4)
return "", err
2019-07-02 06:02:09 +00:00
} else {
2019-07-03 05:51:30 +00:00
c.Home = home
2019-07-01 08:44:48 +00:00
}
}
name, err := install(c)
2019-07-01 08:44:48 +00:00
if nil != err {
return "", err
2019-07-01 08:44:48 +00:00
}
2019-07-02 06:25:16 +00:00
err = os.MkdirAll(c.Logdir, 0755)
2019-07-01 08:44:48 +00:00
if nil != err {
return "", err
2019-07-01 08:44:48 +00:00
}
return name, nil
2019-07-01 08:44:48 +00:00
}
func Start(conf *service.Service) error {
return start(conf)
}
func Stop(conf *service.Service) error {
return stop(conf)
}
2019-08-02 20:53:43 +00:00
func List(conf *service.Service) ([]string, []string, []error) {
return list(conf)
}
2019-07-03 08:11:50 +00:00
// IsPrivileged returns true if we suspect that the current user (or process) will be able
2019-07-01 08:44:48 +00:00
// to write to system folders, bind to privileged ports, and otherwise
// successfully run a system service.
func IsPrivileged() bool {
return isPrivileged()
}
2019-07-03 08:11:50 +00:00
// WhereIs uses exec.LookPath to return an absolute filepath with forward slashes
func WhereIs(exe string) (string, error) {
exepath, err := exec.LookPath(exe)
if nil != err {
return "", err
2019-07-01 08:44:48 +00:00
}
2019-07-03 08:11:50 +00:00
return filepath.Abs(filepath.ToSlash(exepath))
2019-07-01 08:44:48 +00:00
}
2019-08-02 20:53:43 +00:00
type ManageError struct {
Name string
Hint string
Parent error
}
func (e *ManageError) Error() string {
return e.Name + ": " + e.Hint + ": " + e.Parent.Error()
}
type ErrDaemonize struct {
DaemonArgs []string
error string
}
func (e *ErrDaemonize) Error() string {
return e.error + "\nYou need to switch on ErrDaemonize, and use .DaemonArgs, which would run this:" + strings.Join(e.DaemonArgs, " ")
}