hostinfo: detect NSIS vs MSI package type on Windows

Change-Id: I624a4cb04803e483553eb53c952060393029c435
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2022-02-20 06:53:52 -08:00 committed by Brad Fitzpatrick
parent d19a63ddf6
commit 300d897fd7

View File

@ -51,15 +51,47 @@ func GetOSVersion() string {
return "" return ""
} }
func packageType() string { func packageType() (ret string) {
if v, _ := packagingType.Load().(string); v != "" { if v, _ := packagingType.Load().(string); v != "" {
return v return v
} }
switch runtime.GOOS { switch runtime.GOOS {
case "windows": case "windows":
defer func() {
if ret != "" {
packagingType.Store(ret)
}
}()
if _, err := os.Stat(`C:\ProgramData\chocolatey\lib\tailscale`); err == nil { if _, err := os.Stat(`C:\ProgramData\chocolatey\lib\tailscale`); err == nil {
return "choco" return "choco"
} }
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"
}
}
case "darwin": case "darwin":
// Using tailscaled or IPNExtension? // Using tailscaled or IPNExtension?
exe, _ := os.Executable() exe, _ := os.Executable()