A cross-platform service manager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

67 lines
1.4 KiB

//go:generate go run -mod=vendor github.com/UnnoTed/fileb0x b0x.toml
package installer
import (
"fmt"
"os"
"path/filepath"
"strings"
"git.rootprojects.org/root/go-serviceman/service"
)
// 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) error {
if "" == c.Exec {
c.Exec = c.Name
}
if !c.System {
home, err := os.UserHomeDir()
if nil != err {
fmt.Fprintf(os.Stderr, "Unrecoverable Error: %s", err)
os.Exit(4)
return err
} else {
c.Home = home
}
}
err := install(c)
if nil != err {
return err
}
err = os.MkdirAll(c.Logdir, 0755)
if nil != err {
return err
}
return nil
}
// Returns true if we suspect that the current user (or process) will be able
// to write to system folders, bind to privileged ports, and otherwise
// successfully run a system service.
func IsPrivileged() bool {
return isPrivileged()
}
func WhereIs(exec string) (string, error) {
// TODO use exec.LookPath instead
exec = filepath.ToSlash(exec)
if strings.Contains(exec, "/") {
// it's a path (so we don't allow filenames with slashes)
stat, err := os.Stat(exec)
if nil != err {
return "", err
}
if stat.IsDir() {
return "", fmt.Errorf("'%s' is not an executable file", exec)
}
return filepath.Abs(exec)
}
return whereIs(exec)
}