systemd_linux.go 879 B

12345678910111213141516171819202122232425262728293031323334353637
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package clientupdate
  4. import (
  5. "context"
  6. "errors"
  7. "fmt"
  8. "github.com/coreos/go-systemd/v22/dbus"
  9. )
  10. func restartSystemdUnit(ctx context.Context) error {
  11. c, err := dbus.NewWithContext(ctx)
  12. if err != nil {
  13. // Likely not a systemd-managed distro.
  14. return errors.ErrUnsupported
  15. }
  16. defer c.Close()
  17. if err := c.ReloadContext(ctx); err != nil {
  18. return fmt.Errorf("failed to reload tailsacled.service: %w", err)
  19. }
  20. ch := make(chan string, 1)
  21. if _, err := c.RestartUnitContext(ctx, "tailscaled.service", "replace", ch); err != nil {
  22. return fmt.Errorf("failed to restart tailsacled.service: %w", err)
  23. }
  24. select {
  25. case res := <-ch:
  26. if res != "done" {
  27. return fmt.Errorf("systemd service restart failed with result %q", res)
  28. }
  29. case <-ctx.Done():
  30. return ctx.Err()
  31. }
  32. return nil
  33. }