1 #!/bin/sh 2 3 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 4 # Use of this source code is governed by a BSD-style license that can be 5 # found in the LICENSE file. 6 7 # Version = @@VERSION@@ 8 9 HELPERTOOLS=/Library/PrivilegedHelperTools 10 SERVICE_NAME=org.chromium.chromoting 11 CONFIG_FILE="$HELPERTOOLS/$SERVICE_NAME.json" 12 SCRIPT_FILE="$HELPERTOOLS/$SERVICE_NAME.me2me.sh" 13 USERS_TMP_FILE="$SCRIPT_FILE.users" 14 PLIST=/Library/LaunchAgents/org.chromium.chromoting.plist 15 ENABLED_FILE="$HELPERTOOLS/$SERVICE_NAME.me2me_enabled" 16 ENABLED_FILE_BACKUP="$ENABLED_FILE.backup" 17 18 # In case of errors, log the fact, but continue to unload launchd jobs as much 19 # as possible. When finished, this preflight script should exit successfully in 20 # case this is a Keystone-triggered update which must be allowed to proceed. 21 function on_error { 22 logger An error occurred during Chrome Remote Desktop setup. 23 } 24 25 function find_users_with_active_hosts { 26 ps -eo uid,command | awk -v script="$SCRIPT_FILE" ' 27 $2 == "/bin/sh" && $3 == script && $4 == "--run-from-launchd" { 28 print $1 29 }' 30 } 31 32 function find_login_window_for_user { 33 # This function mimics the behaviour of pgrep, which may not be installed 34 # on Mac OS X. 35 local user=$1 36 ps -ec -u "$user" -o comm,pid | awk '$1 == "loginwindow" { print $2; exit }' 37 } 38 39 trap on_error ERR 40 41 logger Running Chrome Remote Desktop preflight script @@VERSION@@ 42 43 # If there is an _enabled file, rename it while upgrading. 44 if [[ -f "$ENABLED_FILE" ]]; then 45 mv "$ENABLED_FILE" "$ENABLED_FILE_BACKUP" 46 fi 47 48 # Stop and unload the service for each user currently running the service, and 49 # record the user IDs so the service can be restarted for the same users in the 50 # postflight script. 51 rm -f "$USERS_TMP_FILE" 52 53 for uid in $(find_users_with_active_hosts); do 54 if [[ -n "$uid" ]]; then 55 echo "$uid" >> "$USERS_TMP_FILE" 56 if [[ "$uid" = "0" ]]; then 57 context="LoginWindow" 58 else 59 context="Aqua" 60 fi 61 pid="$(find_login_window_for_user "$uid")" 62 if [[ -n "$pid" ]]; then 63 launchctl bsexec "$pid" sudo -u "#$uid" launchctl stop "$SERVICE_NAME" 64 launchctl bsexec "$pid" sudo -u "#$uid" launchctl unload -w -S \ 65 "$context" "$PLIST" 66 fi 67 fi 68 done 69 70 exit 0 71