diff --git a/service_systemd_linux.go b/service_systemd_linux.go index 73e064a..88cbf9f 100644 --- a/service_systemd_linux.go +++ b/service_systemd_linux.go @@ -10,6 +10,7 @@ import ( "fmt" "os" "os/signal" + "path/filepath" "regexp" "strconv" "strings" @@ -66,15 +67,21 @@ func (s *systemd) Platform() string { return s.platform } -// Systemd services should be supported, but are not currently. -var errNoUserServiceSystemd = errors.New("User services are not supported on systemd.") - func (s *systemd) configPath() (cp string, err error) { - if s.Option.bool(optionUserService, optionUserServiceDefault) { - err = errNoUserServiceSystemd + if !s.Option.bool(optionUserService, optionUserServiceDefault) { + cp = "/etc/systemd/system/" + s.Config.Name + ".service" return } - cp = "/etc/systemd/system/" + s.Config.Name + ".service" + homeDir, err := os.UserHomeDir() + if err != nil { + return + } + systemdUserDir := filepath.Join(homeDir, ".config/systemd/user") + err = os.MkdirAll(systemdUserDir, os.ModePerm) + if err != nil { + return + } + cp = filepath.Join(systemdUserDir, s.Config.Name + ".service") return } @@ -168,15 +175,30 @@ func (s *systemd) Install() error { return err } - err = run("systemctl", "enable", s.Name+".service") + if s.Option.bool(optionUserService, optionUserServiceDefault) { + err = run("systemctl", "enable", "--user", s.Name+".service") + } else { + err = run("systemctl", "enable", s.Name+".service") + } if err != nil { return err } - return run("systemctl", "daemon-reload") + + if s.Option.bool(optionUserService, optionUserServiceDefault) { + err = run("systemctl", "daemon-reload", "--user") + } else { + err = run("systemctl", "daemon-reload") + } + return err } func (s *systemd) Uninstall() error { - err := run("systemctl", "disable", s.Name+".service") + var err error + if s.Option.bool(optionUserService, optionUserServiceDefault) { + err = run("systemctl", "disable", "--user", s.Name+".service") + } else { + err = run("systemctl", "disable", s.Name+".service") + } if err != nil { return err } diff --git a/service_test.go b/service_test.go index 6d1851b..6e6086c 100644 --- a/service_test.go +++ b/service_test.go @@ -40,6 +40,29 @@ func TestRunInterrupt(t *testing.T) { } } +// Should always run, without asking for any permission +func TestUserRunInterrupt(t *testing.T) { + p := &program{} + options := make(service.KeyValue) + options["UserService"] = true + sc := &service.Config{ + Name: "go_user_service_test", + Option: options, + } + s, err := service.New(p, sc) + if err != nil { + t.Fatalf("New err: %s", err) + } + err = s.Install() + if err != nil { + t.Errorf("Install err: %s", err) + } + err = s.Uninstall() + if err != nil { + t.Fatalf("Uninstall err: %s", err) + } +} + type program struct { numStopped int }