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"
|
2019-07-10 07:16:45 +00:00
|
|
|
"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
|
2019-07-03 05:51:30 +00:00
|
|
|
func Install(c *service.Service) 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)
|
2019-07-01 08:44:48 +00:00
|
|
|
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
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
err := install(c)
|
|
|
|
if nil != err {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2019-07-10 07:16:45 +00:00
|
|
|
func Start(conf *service.Service) error {
|
|
|
|
return start(conf)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Stop(conf *service.Service) error {
|
|
|
|
return stop(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-07-10 07:16:45 +00:00
|
|
|
|
|
|
|
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, " ")
|
|
|
|
}
|