#!/bin/bash # # probo-agent macOS PKG preinstall script. # # Runs as root before the payload is laid down. Used to stop previous # LaunchAgent / LaunchDaemon instances so upgrades replace cleanly. # Failures here are non-fatal: a stuck launchctl must not block install. set -u LOG_FILE="/var/log/probo-agent-install.log" TRAY_LABEL="com.probo.agent.tray" TRAY_PLIST="/Library/LaunchAgents/${TRAY_LABEL}.plist" DAEMON_PLIST="/Library/LaunchDaemons/com.probo.agent.plist" HELPER_LABEL="com.probo.agent.helper" HELPER_PLIST="/Library/LaunchDaemons/${HELPER_LABEL}.plist" HELPER_BINARY="/Library/PrivilegedHelperTools/${HELPER_LABEL}" mkdir -p "$(dirname "${LOG_FILE}")" exec > >(tee -a "${LOG_FILE}") 2>&1 echo echo "=== probo-agent preinstall $(date -u +%Y-%m-%dT%H:%M:%SZ) ===" bootout_tray_for_user() { local username="$1" local user_uid if [ -z "${username}" ] || \ [ "${username}" = "root" ] || \ [ "${username}" = "loginwindow" ]; then return 0 fi user_uid="$(id -u "${username}" 2>/dev/null || true)" if [ -z "${user_uid}" ]; then return 0 fi launchctl bootout "gui/${user_uid}/${TRAY_LABEL}" 2>/dev/null || true } seen_users=" " for username in $(users 2>/dev/null || true); do case "${seen_users}" in *" ${username} "*) continue ;; esac seen_users="${seen_users}${username} " bootout_tray_for_user "${username}" done console_user=$(stat -f "%Su" /dev/console 2>/dev/null || true) bootout_tray_for_user "${console_user}" if [ -f "${DAEMON_PLIST}" ]; then launchctl bootout system "${DAEMON_PLIST}" 2>/dev/null || true echo "Booted out LaunchDaemon at ${DAEMON_PLIST}." fi if [ -f "${HELPER_PLIST}" ]; then launchctl bootout system "${HELPER_PLIST}" 2>/dev/null || true rm -f "${HELPER_PLIST}" echo "Removed privileged helper LaunchDaemon at ${HELPER_PLIST}." fi if [ -f "${HELPER_BINARY}" ]; then rm -f "${HELPER_BINARY}" echo "Removed privileged helper binary at ${HELPER_BINARY}." fi if [ -f "${TRAY_PLIST}" ]; then echo "Existing tray LaunchAgent will be replaced by postinstall." fi echo "=== preinstall done ===" exit 0