From e31d68d64e8dc16c43cc5a897cac5dddb5baf6a3 Mon Sep 17 00:00:00 2001 From: Aaron Klotz Date: Tue, 22 Feb 2022 10:39:09 -0700 Subject: [PATCH] hostinfo: use the sentinel value set by the MSI installer to detect MSI package type The MSI installer sets a special sentinel value that we can use to detect it. I also removed the code that bails out when the installation path is not `Program Files`, as both the NSIS and MSI installers permit the user to install to a different path. Signed-off-by: Aaron Klotz --- cmd/tailscale/depaware.txt | 2 ++ hostinfo/hostinfo_windows.go | 24 ++++++------------------ 2 files changed, 8 insertions(+), 18 deletions(-) diff --git a/cmd/tailscale/depaware.txt b/cmd/tailscale/depaware.txt index ad13374f6..3a237ad24 100644 --- a/cmd/tailscale/depaware.txt +++ b/cmd/tailscale/depaware.txt @@ -81,6 +81,8 @@ tailscale.com/cmd/tailscale dependencies: (generated by github.com/tailscale/dep W tailscale.com/util/endian from tailscale.com/net/netns tailscale.com/util/groupmember from tailscale.com/cmd/tailscale/cli tailscale.com/util/lineread from tailscale.com/net/interfaces+ + W tailscale.com/util/winutil from tailscale.com/hostinfo + W 💣 tailscale.com/util/winutil/vss from tailscale.com/util/winutil tailscale.com/version from tailscale.com/cmd/tailscale/cli+ tailscale.com/version/distro from tailscale.com/cmd/tailscale/cli+ tailscale.com/wgengine/filter from tailscale.com/types/netmap diff --git a/hostinfo/hostinfo_windows.go b/hostinfo/hostinfo_windows.go index aa78cde2e..023f92463 100644 --- a/hostinfo/hostinfo_windows.go +++ b/hostinfo/hostinfo_windows.go @@ -8,11 +8,11 @@ "fmt" "os" "path/filepath" - "strings" "sync/atomic" "golang.org/x/sys/windows" "golang.org/x/sys/windows/registry" + "tailscale.com/util/winutil" ) func init() { @@ -65,32 +65,20 @@ func packageTypeWindows() string { if _, err := os.Stat(`C:\ProgramData\chocolatey\lib\tailscale`); err == nil { return "choco" } + if msiSentinel := winutil.GetRegInteger("MSI", 0); msiSentinel == 1 { + return "msi" + } exe, err := os.Executable() if err != nil { return "" } dir := filepath.Dir(exe) - if !strings.Contains(dir, "Program Files") { - // Atypical. Not worth trying to detect. Likely open - // source tailscaled or a developer running by hand. - return "" - } nsisUninstaller := filepath.Join(dir, "Uninstall-Tailscale.exe") _, err = os.Stat(nsisUninstaller) if err == nil { return "nsis" } - if os.IsNotExist(err) { - _, cliErr := os.Stat(filepath.Join(dir, "tailscale.exe")) - _, daemonErr := os.Stat(filepath.Join(dir, "tailscaled.exe")) - if cliErr == nil && daemonErr == nil { - // Almost certainly MSI. - // We have tailscaled.exe and tailscale.exe - // next to each other in Program Files, but no - // uninstaller. - // TODO(bradfitz,dblohm7): tighter heuristic? - return "msi" - } - } + // Atypical. Not worth trying to detect. Likely open + // source tailscaled or a developer running by hand. return "" }