mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-30 05:25:35 +00:00
4e72992900
As a fallback to package managers, allow updating tailscale that was self-installed in some way. There are some tricky bits around updating the systemd unit (should we stick to local binary paths or to the ones in tailscaled.service?), so leaving that out for now. Updates #6995 Signed-off-by: Andrew Lytvynov <awly@tailscale.com>
38 lines
879 B
Go
38 lines
879 B
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package clientupdate
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/coreos/go-systemd/v22/dbus"
|
|
)
|
|
|
|
func restartSystemdUnit(ctx context.Context) error {
|
|
c, err := dbus.NewWithContext(ctx)
|
|
if err != nil {
|
|
// Likely not a systemd-managed distro.
|
|
return errors.ErrUnsupported
|
|
}
|
|
defer c.Close()
|
|
if err := c.ReloadContext(ctx); err != nil {
|
|
return fmt.Errorf("failed to reload tailsacled.service: %w", err)
|
|
}
|
|
ch := make(chan string, 1)
|
|
if _, err := c.RestartUnitContext(ctx, "tailscaled.service", "replace", ch); err != nil {
|
|
return fmt.Errorf("failed to restart tailsacled.service: %w", err)
|
|
}
|
|
select {
|
|
case res := <-ch:
|
|
if res != "done" {
|
|
return fmt.Errorf("systemd service restart failed with result %q", res)
|
|
}
|
|
case <-ctx.Done():
|
|
return ctx.Err()
|
|
}
|
|
return nil
|
|
}
|