#!/bin/sh
HELPERTOOLS=/Library/PrivilegedHelperTools
SERVICE_NAME=org.chromium.chromoting
HOST_BUNDLE_NAME=@@HOST_BUNDLE_NAME@@
CONFIG_FILE="$HELPERTOOLS/$SERVICE_NAME.json"
OLD_SCRIPT_FILE="$HELPERTOOLS/$SERVICE_NAME.me2me.sh"
HOST_BUNDLE_PATH="$HELPERTOOLS/$HOST_BUNDLE_NAME"
HOST_SERVICE_BINARY="$HELPERTOOLS/$HOST_BUNDLE_NAME/Contents/MacOS/remoting_me2me_host_service"
USERS_TMP_FILE="$HOST_SERVICE_BINARY.users"
PLIST=/Library/LaunchAgents/org.chromium.chromoting.plist
BROKER_PLIST=/Library/LaunchDaemons/org.chromium.chromoting.broker.plist
ENABLED_FILE="$HELPERTOOLS/$SERVICE_NAME.me2me_enabled"
ENABLED_FILE_BACKUP="$ENABLED_FILE.backup"
PREF_PANE=/Library/PreferencePanes/ChromeRemoteDesktop.prefPane
BROKER_SERVICE_TARGET="system/org.chromium.chromoting.broker"
function on_error {
logger An error occurred during Chrome Remote Desktop setup.
}
function find_users_with_active_hosts {
ps -eo uid,command |
awk -v script="$OLD_SCRIPT_FILE" -v binary="$HOST_SERVICE_BINARY" '
($2 == "/bin/sh" && $3 == script && $4 == "--run-from-launchd") ||
($2 == binary && $3 == "--run-from-launchd") {
print $1
}' | sort | uniq
}
function find_login_window_for_user {
local user=$1
ps -ec -u "$user" -o comm,pid | awk '$1 == "loginwindow" { print $2; exit }'
}
function is_el_capitan_or_newer {
local full_version=$(sw_vers -productVersion)
local version
IFS='.' read -a version <<< "${full_version}"
local v0="${version[0]}"
local v1="${version[1]}"
if [[ $v0 -gt 10 || ( $v0 -eq 10 && $v1 -ge 11 ) ]]; then
return 0
else
return 1
fi
}
trap on_error ERR
logger Running Chrome Remote Desktop preflight script @@VERSION@@
if [[ -f "$ENABLED_FILE" ]]; then
logger Moving _enabled file
mv "$ENABLED_FILE" "$ENABLED_FILE_BACKUP"
fi
if [[ -f "$OLD_SCRIPT_FILE" ]]; then
logger Backing up launchd agent
cp "$OLD_SCRIPT_FILE" "$INSTALLER_TEMP/script_backup"
fi
rm -f "$USERS_TMP_FILE"
for uid in $(find_users_with_active_hosts); do
logger Unloading service for user "$uid"
if [[ -n "$uid" ]]; then
echo "$uid" >> "$USERS_TMP_FILE"
if [[ "$uid" = "0" ]]; then
context="LoginWindow"
else
context="Aqua"
fi
stop="launchctl stop $SERVICE_NAME"
unload="launchctl unload -w -S $context $PLIST"
if is_el_capitan_or_newer; then
bootstrap_user="launchctl asuser $uid"
else
pid="$(find_login_window_for_user "$uid")"
if [[ ! -n "$pid" ]]; then
exit 1
fi
sudo_user="sudo -u #$uid"
bootstrap_user="launchctl bsexec $pid"
fi
logger $bootstrap_user $sudo_user $stop
$bootstrap_user $sudo_user $stop
logger $bootstrap_user $sudo_user $unload
$bootstrap_user $sudo_user $unload
fi
done
logger Unloading broker service
logger launchctl bootout $BROKER_SERVICE_TARGET
launchctl bootout $BROKER_SERVICE_TARGET
logger Killing all processes in $HOST_BUNDLE_PATH
logger pkill -9 -f "^$HOST_BUNDLE_PATH"'.*$'
pkill -9 -f "^$HOST_BUNDLE_PATH"'.*$'
rm -rf "$PREF_PANE"
exit 0