clientupdate: return true for CanAutoUpdate for macsys (#12746)

While `clientupdate.Updater` won't be able to apply updates on macsys,
we use `clientupdate.CanAutoUpdate` to gate the EditPrefs endpoint in
localAPI. We should allow the GUI client to set AutoUpdate.Apply on
macsys for it to properly get reported to the control plane. This also
allows the tailnet-wide default for auto-updates to propagate to macsys
clients.

Updates https://github.com/tailscale/corp/issues/21339

Signed-off-by: Andrew Lytvynov <awly@tailscale.com>
This commit is contained in:
Andrew Lytvynov 2024-07-08 15:54:50 -07:00 committed by GitHub
parent e21d8768f9
commit b8af91403d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 14 additions and 5 deletions

View File

@ -248,6 +248,11 @@ func (up *Updater) getUpdateFunction() (fn updateFunction, canAutoUpdate bool) {
// CanAutoUpdate reports whether auto-updating via the clientupdate package // CanAutoUpdate reports whether auto-updating via the clientupdate package
// is supported for the current os/distro. // is supported for the current os/distro.
func CanAutoUpdate() bool { func CanAutoUpdate() bool {
if version.IsMacSysExt() {
// Macsys uses Sparkle for auto-updates, which doesn't have an update
// function in this package.
return true
}
_, canAutoUpdate := (&Updater{}).getUpdateFunction() _, canAutoUpdate := (&Updater{}).getUpdateFunction()
return canAutoUpdate return canAutoUpdate
} }

View File

@ -210,6 +210,9 @@ func runSet(ctx context.Context, args []string) (retErr error) {
} }
} }
if maskedPrefs.AutoUpdateSet.ApplySet { if maskedPrefs.AutoUpdateSet.ApplySet {
if !clientupdate.CanAutoUpdate() {
return errors.New("automatic updates are not supported on this platform")
}
// On macsys, tailscaled will set the Sparkle auto-update setting. It // On macsys, tailscaled will set the Sparkle auto-update setting. It
// does not use clientupdate. // does not use clientupdate.
if version.IsMacSysExt() { if version.IsMacSysExt() {
@ -221,10 +224,6 @@ func runSet(ctx context.Context, args []string) (retErr error) {
if err != nil { if err != nil {
return fmt.Errorf("failed to enable automatic updates: %v, %q", err, out) return fmt.Errorf("failed to enable automatic updates: %v, %q", err, out)
} }
} else {
if !clientupdate.CanAutoUpdate() {
return errors.New("automatic updates are not supported on this platform")
}
} }
} }
checkPrefs := curPrefs.Clone() checkPrefs := curPrefs.Clone()

View File

@ -11,6 +11,7 @@
"tailscale.com/clientupdate" "tailscale.com/clientupdate"
"tailscale.com/ipn" "tailscale.com/ipn"
"tailscale.com/version"
) )
func (b *LocalBackend) stopOfflineAutoUpdate() { func (b *LocalBackend) stopOfflineAutoUpdate() {
@ -30,6 +31,10 @@ func (b *LocalBackend) maybeStartOfflineAutoUpdate(prefs ipn.PrefsView) {
if !clientupdate.CanAutoUpdate() { if !clientupdate.CanAutoUpdate() {
return return
} }
// On macsys, auto-updates are managed by Sparkle.
if version.IsMacSysExt() {
return
}
if b.offlineAutoUpdateCancel != nil { if b.offlineAutoUpdateCancel != nil {
// Already running. // Already running.

View File

@ -355,7 +355,7 @@ func (b *LocalBackend) newC2NUpdateResponse() tailcfg.C2NUpdateResponse {
prefs := b.Prefs().AutoUpdate() prefs := b.Prefs().AutoUpdate()
return tailcfg.C2NUpdateResponse{ return tailcfg.C2NUpdateResponse{
Enabled: envknob.AllowsRemoteUpdate() || prefs.Apply.EqualBool(true), Enabled: envknob.AllowsRemoteUpdate() || prefs.Apply.EqualBool(true),
Supported: clientupdate.CanAutoUpdate(), Supported: clientupdate.CanAutoUpdate() && !version.IsMacSysExt(),
} }
} }