Fix uninstall for Warp and Box (#23652)

#22773
This commit is contained in:
Dante Catalfamo
2024-11-11 14:20:31 -05:00
committed by GitHub
parent ddbf6f1f29
commit 915213a0a3
4 changed files with 44 additions and 21 deletions
+1
View File
@@ -0,0 +1 @@
- Fix some cases where Fleet Maintained Apps generated incorrect uninstall scripts
+9 -1
View File
@@ -12,7 +12,15 @@
{
"identifier": "box-drive",
"bundle_identifier": "com.box.desktop",
"installer_format": "pkg"
"installer_format": "pkg",
"pre_uninstall_scripts": [
"(cd /Users/$LOGGED_IN_USER; sudo -u $LOGGED_IN_USER fileproviderctl domain remove -A com.box.desktop.boxfileprovider)",
"(cd /Users/$LOGGED_IN_USER; sudo -u $LOGGED_IN_USER /Applications/Box.app/Contents/MacOS/fpe/streem --remove-fpe-domain-and-archive-unsynced-content Box)",
"(cd /Users/$LOGGED_IN_USER; sudo -u $LOGGED_IN_USER /Applications/Box.app/Contents/MacOS/fpe/streem --remove-fpe-domain-and-preserve-unsynced-content Box)",
"(cd /Users/$LOGGED_IN_USER; defaults delete com.box.desktop)",
"echo \"${LOGGED_IN_USER} ALL = (root) NOPASSWD: /Library/Application\\ Support/Box/uninstall_box_drive_r\" >> /etc/sudoers.d/box_uninstall"
],
"post_uninstall_scripts": ["rm /etc/sudoers.d/box_uninstall"]
},
{
"identifier": "brave-browser",
+19 -12
View File
@@ -25,9 +25,11 @@ import (
var appsJSON []byte
type maintainedApp struct {
Identifier string `json:"identifier"`
BundleIdentifier string `json:"bundle_identifier"`
InstallerFormat string `json:"installer_format"`
Identifier string `json:"identifier"`
BundleIdentifier string `json:"bundle_identifier"`
InstallerFormat string `json:"installer_format"`
PreUninstallScripts []string `json:"pre_uninstall_scripts"`
PostUninstallScripts []string `json:"post_uninstall_scripts"`
}
const baseBrewAPIURL = "https://formulae.brew.sh/api/"
@@ -164,6 +166,9 @@ func (i ingester) ingestOne(ctx context.Context, app maintainedApp, client *http
if err != nil {
return ctxerr.Wrapf(ctx, err, "create install script for cask %s", app.Identifier)
}
cask.PreUninstallScripts = app.PreUninstallScripts
cask.PostUninstallScripts = app.PostUninstallScripts
uninstallScript := uninstallScriptForApp(&cask)
_, err = i.ds.UpsertMaintainedApp(ctx, &fleet.MaintainedApp{
@@ -182,15 +187,17 @@ func (i ingester) ingestOne(ctx context.Context, app maintainedApp, client *http
}
type brewCask struct {
Token string `json:"token"`
FullToken string `json:"full_token"`
Tap string `json:"tap"`
Name []string `json:"name"`
Desc string `json:"desc"`
URL string `json:"url"`
Version string `json:"version"`
SHA256 string `json:"sha256"`
Artifacts []*brewArtifact `json:"artifacts"`
Token string `json:"token"`
FullToken string `json:"full_token"`
Tap string `json:"tap"`
Name []string `json:"name"`
Desc string `json:"desc"`
URL string `json:"url"`
Version string `json:"version"`
SHA256 string `json:"sha256"`
Artifacts []*brewArtifact `json:"artifacts"`
PreUninstallScripts []string `json:"-"`
PostUninstallScripts []string `json:"-"`
}
// brew artifacts are objects that have one and only one of their fields set.
+15 -8
View File
@@ -77,9 +77,15 @@ func uninstallScriptForApp(cask *brewCask) string {
}
case len(artifact.Uninstall) > 0:
sortUninstall(artifact.Uninstall)
if len(cask.PreUninstallScripts) > 0 {
sb.Write(strings.Join(cask.PreUninstallScripts, "\n"))
}
for _, u := range artifact.Uninstall {
processUninstallArtifact(u, sb)
}
if len(cask.PostUninstallScripts) > 0 {
sb.Write(strings.Join(cask.PostUninstallScripts, "\n"))
}
case len(artifact.Zap) > 0:
sortUninstall(artifact.Zap)
for _, z := range artifact.Zap {
@@ -179,11 +185,11 @@ func processUninstallArtifact(u *brewUninstall, sb *scriptBuilder) {
if u.Script.IsOther {
addUserVar()
for _, path := range u.Script.Other {
sb.Writef(`sudo -u "$LOGGED_IN_USER" '%s'`, path)
sb.Writef(`(cd /Users/$LOGGED_IN_USER && sudo -u "$LOGGED_IN_USER" '%s')`, path)
}
} else if len(u.Script.String) > 0 {
addUserVar()
sb.Writef(`sudo -u "$LOGGED_IN_USER" '%s'`, u.Script.String)
sb.Writef(`(cd /Users/$LOGGED_IN_USER && sudo -u "$LOGGED_IN_USER" '%s')`, u.Script.String)
}
process(u.PkgUtil, func(pkgID string) {
@@ -365,15 +371,15 @@ const removeLaunchctlServiceFunc = `remove_launchctl_service() {
local booleans=("true" "false")
local plist_status
local paths
local sudo
local should_sudo
echo "Removing launchctl service ${service}"
for sudo in "${booleans[@]}"; do
for should_sudo in "${booleans[@]}"; do
plist_status=$(launchctl list "${service}" 2>/dev/null)
if [[ $plist_status == \{* ]]; then
if [[ $sudo == "true" ]]; then
if [[ $should_sudo == "true" ]]; then
sudo launchctl remove "${service}"
else
launchctl remove "${service}"
@@ -387,7 +393,7 @@ const removeLaunchctlServiceFunc = `remove_launchctl_service() {
)
# if not using sudo, prepend the home directory to the paths
if [[ $sudo == "false" ]]; then
if [[ $should_sudo == "false" ]]; then
for i in "${!paths[@]}"; do
paths[i]="${HOME}${paths[i]}"
done
@@ -395,7 +401,7 @@ const removeLaunchctlServiceFunc = `remove_launchctl_service() {
for path in "${paths[@]}"; do
if [[ -e "$path" ]]; then
if [[ $sudo == "true" ]]; then
if [[ $should_sudo == "true" ]]; then
sudo rm -f -- "$path"
else
rm -f -- "$path"
@@ -450,6 +456,7 @@ const trashFunc = `trash() {
local logged_in_user="$1"
local target_file="$2"
local timestamp="$(date +%Y-%m-%d-%s)"
local rand="$(jot -r 1 0 99999)"
# replace ~ with /Users/$logged_in_user
if [[ "$target_file" == ~* ]]; then
@@ -461,7 +468,7 @@ const trashFunc = `trash() {
if [[ -e "$target_file" ]]; then
echo "removing $target_file."
mv -f "$target_file" "$trash/${file_name}_${timestamp}"
mv -f "$target_file" "$trash/${file_name}_${timestamp}_${rand}"
else
echo "$target_file doesn't exist."
fi