fleet/ee/maintained-apps/inputs/homebrew/scripts/teleport-suite-uninstall.sh

119 lines
4 KiB
Bash
Executable file

#!/bin/sh
# variables
LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
# functions
expand_pkgid_and_map() {
local PKGID="$1"
local FUNC="$2"
if [[ "$PKGID" == *"*" ]]; then
local prefix="${PKGID%\*}"
# Convert (.*) to .* for regex matching to handle patterns like (.*).com.example.app
local regex_pattern=$(echo "$prefix" | sed 's/(\.\*)/.*/g')
echo "Expanding wildcard for PKGID: $PKGID (pattern: ^${regex_pattern})"
for receipt in $(pkgutil --pkgs | grep -E "^${regex_pattern}"); do
echo "Processing $receipt"
"$FUNC" "$receipt"
done
else
"$FUNC" "$PKGID"
fi
}
forget_pkg() {
local PKGID="$1"
expand_pkgid_and_map "$PKGID" forget_receipt
}
forget_receipt() {
local PKGID="$1"
sudo pkgutil --forget "$PKGID"
}
remove_pkg_files() {
local PKGID="$1"
expand_pkgid_and_map "$PKGID" remove_receipt_files
}
remove_receipt_files() {
local PKGID="$1"
local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION
echo "pkgutil --pkg-info-plist \"$PKGID\""
PKGINFO=$(pkgutil --pkg-info-plist "$PKGID")
VOLUME=$(echo "$PKGINFO" | awk '/<key>volume<\/key>/ {getline; gsub(/.*<string>|<\/string>.*/, ""); print}')
INSTALL_LOCATION=$(echo "$PKGINFO" | awk '/<key>install-location<\/key>/ {getline; gsub(/.*<string>|<\/string>.*/, ""); print}')
if [ -z "$INSTALL_LOCATION" ] || [ "$INSTALL_LOCATION" = "/" ]; then
FULL_INSTALL_LOCATION="$VOLUME"
else
FULL_INSTALL_LOCATION="$VOLUME/$INSTALL_LOCATION"
FULL_INSTALL_LOCATION=$(echo "$FULL_INSTALL_LOCATION" | sed 's|//|/|g')
fi
echo "sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | tr '\\\\n' '\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf"
sudo pkgutil --only-files --files "$PKGID" | sed "s|^|${FULL_INSTALL_LOCATION}/|" | tr '\n' '\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf
echo "sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\\\n' '\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf"
sudo pkgutil --only-dirs --files "$PKGID" | sed "s|^|${FULL_INSTALL_LOCATION}/|" | grep '\.app$' | tr '\n' '\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf
root_app_dir=$(
sudo pkgutil --only-dirs --files "$PKGID" \
| sed "s|^|${FULL_INSTALL_LOCATION}/|" \
| grep 'Applications' \
| awk '{ print length, $0 }' \
| sort -n \
| head -n1 \
| cut -d' ' -f2-
)
if [ -n "$root_app_dir" ]; then
echo "sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :"
sudo rmdir -p "$root_app_dir" 2>/dev/null || :
fi
}
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
target_file="/Users/$logged_in_user${target_file:1}"
fi
local trash="/Users/$logged_in_user/.Trash"
local file_name="$(basename "${target_file}")"
if [[ -e "$target_file" ]]; then
echo "removing $target_file."
mv -f "$target_file" "$trash/${file_name}_${timestamp}_${rand}"
else
echo "$target_file doesn't exist."
fi
}
# Remove teleport-suite packages (handles wildcard patterns with (.*))
remove_pkg_files '(.*).com.gravitational.teleport.tctl'
forget_pkg '(.*).com.gravitational.teleport.tctl'
remove_pkg_files '(.*).com.gravitational.teleport.tsh'
forget_pkg '(.*).com.gravitational.teleport.tsh'
remove_pkg_files 'com.gravitational.teleport'
forget_pkg 'com.gravitational.teleport'
# Explicitly remove apps from /Applications (in case pkgutil removal didn't catch them)
sudo rm -rf '/Applications/tctl.app'
sudo rm -rf '/Applications/tsh.app'
# Remove binaries
sudo rm -rf '/usr/local/bin/fdpass-teleport'
sudo rm -rf '/usr/local/bin/tbot'
sudo rm -rf '/usr/local/bin/tctl'
sudo rm -rf '/usr/local/bin/teleport'
sudo rm -rf '/usr/local/bin/tsh'
# Remove user data
trash $LOGGED_IN_USER '~/.tsh'