VirtualBox

source: vbox/trunk/src/VBox/Installer/darwin/DiskImage/VirtualBox_Uninstall.tool@ 74886

Last change on this file since 74886 was 73855, checked in by vboxsync, 6 years ago

Installer/darwin: In the uninstall script wait for user confirmation on failure, since too many people disable the default behavior of leaving Terminal windows upen after the activity in them ended. This means they wouldn't see the diagnostics.

  • Property svn:eol-style set to LF
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 12.1 KB
Line 
1#!/bin/bash
2# $Id: VirtualBox_Uninstall.tool 73855 2018-08-23 08:58:12Z vboxsync $
3## @file
4# VirtualBox Uninstaller Script.
5#
6
7#
8# Copyright (C) 2007-2017 Oracle Corporation
9#
10# This file is part of VirtualBox Open Source Edition (OSE), as
11# available from http://www.virtualbox.org. This file is free software;
12# you can redistribute it and/or modify it under the terms of the GNU
13# General Public License (GPL) as published by the Free Software
14# Foundation, in version 2 as it comes in the "COPYING" file of the
15# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17#
18
19# Override any funny stuff from the user.
20export PATH="/bin:/usr/bin:/sbin:/usr/sbin:$PATH"
21
22#
23# Display a simple welcome message first.
24#
25echo ""
26echo "Welcome to the VirtualBox uninstaller script."
27echo ""
28
29#
30# Check for arguments and display
31#
32my_default_prompt=0
33if test "$#" != "0"; then
34 if test "$#" != "1" -o "$1" != "--unattended"; then
35 echo "Error: Unknown argument(s): $*"
36 echo ""
37 echo "Usage: uninstall.sh [--unattended]"
38 echo ""
39 echo "If the '--unattended' option is not given, you will be prompted"
40 echo "for a Yes/No before doing the actual uninstallation."
41 echo ""
42 exit 4;
43 fi
44 my_default_prompt="Yes"
45fi
46
47#
48# Collect directories and files to remove.
49# Note: Do NOT attempt adding directories or filenames with spaces!
50#
51declare -a my_directories
52declare -a my_files
53
54# Users files first
55test -f "${HOME}/Library/LaunchAgents/org.virtualbox.vboxwebsrv.plist" && my_files+=("${HOME}/Library/LaunchAgents/org.virtualbox.vboxwebsrv.plist")
56
57test -d /Library/StartupItems/VirtualBox/ && my_directories+=("/Library/StartupItems/VirtualBox/")
58test -d /Library/Receipts/VBoxStartupItems.pkg/ && my_directories+=("/Library/Receipts/VBoxStartupItems.pkg/")
59
60test -d "/Library/Application Support/VirtualBox/LaunchDaemons/" && my_directories+=("/Library/Application Support/VirtualBox/LaunchDaemons/")
61test -d "/Library/Application Support/VirtualBox/VBoxDrv.kext/" && my_directories+=("/Library/Application Support/VirtualBox/VBoxDrv.kext/")
62test -d "/Library/Application Support/VirtualBox/VBoxUSB.kext/" && my_directories+=("/Library/Application Support/VirtualBox/VBoxUSB.kext/")
63test -d "/Library/Application Support/VirtualBox/VBoxNetFlt.kext/" && my_directories+=("/Library/Application Support/VirtualBox/VBoxNetFlt.kext/")
64test -d "/Library/Application Support/VirtualBox/VBoxNetAdp.kext/" && my_directories+=("/Library/Application Support/VirtualBox/VBoxNetAdp.kext/")
65# Pre 4.3.0rc1 locations:
66test -d /Library/Extensions/VBoxDrv.kext/ && my_directories+=("/Library/Extensions/VBoxDrv.kext/")
67test -d /Library/Extensions/VBoxUSB.kext/ && my_directories+=("/Library/Extensions/VBoxUSB.kext/")
68test -d /Library/Extensions/VBoxNetFlt.kext/ && my_directories+=("/Library/Extensions/VBoxNetFlt.kext/")
69test -d /Library/Extensions/VBoxNetAdp.kext/ && my_directories+=("/Library/Extensions/VBoxNetAdp.kext/")
70# Tiger support is obsolete, but we leave it here for a clean removing of older
71# VirtualBox versions
72test -d /Library/Extensions/VBoxDrvTiger.kext/ && my_directories+=("/Library/Extensions/VBoxDrvTiger.kext/")
73test -d /Library/Extensions/VBoxUSBTiger.kext/ && my_directories+=("/Library/Extensions/VBoxUSBTiger.kext/")
74test -d /Library/Receipts/VBoxKEXTs.pkg/ && my_directories+=("/Library/Receipts/VBoxKEXTs.pkg/")
75
76test -f /usr/bin/VirtualBox && my_files+=("/usr/bin/VirtualBox")
77test -f /usr/bin/VBoxManage && my_files+=("/usr/bin/VBoxManage")
78test -f /usr/bin/VBoxVRDP && my_files+=("/usr/bin/VBoxVRDP")
79test -f /usr/bin/VBoxHeadless && my_files+=("/usr/bin/VBoxHeadless")
80test -f /usr/bin/vboxwebsrv && my_files+=("/usr/bin/vboxwebsrv")
81test -f /usr/bin/VBoxBugReport && my_files+=("/usr/bin/VBoxBugReport")
82test -f /usr/bin/VBoxBalloonCtrl && my_files+=("/usr/bin/VBoxBalloonCtrl")
83test -f /usr/bin/VBoxAutostart && my_files+=("/usr/bin/VBoxAutostart")
84test -f /usr/bin/VBoxDTrace && my_files+=("/usr/bin/VBoxDTrace")
85test -f /usr/bin/vbox-img && my_files+=("/usr/bin/vbox-img")
86test -f /usr/local/bin/VirtualBox && my_files+=("/usr/local/bin/VirtualBox")
87test -f /usr/local/bin/VBoxManage && my_files+=("/usr/local/bin/VBoxManage")
88test -f /usr/local/bin/VBoxVRDP && my_files+=("/usr/local/bin/VBoxVRDP")
89test -f /usr/local/bin/VBoxHeadless && my_files+=("/usr/local/bin/VBoxHeadless")
90test -f /usr/local/bin/vboxwebsrv && my_files+=("/usr/local/bin/vboxwebsrv")
91test -f /usr/local/bin/VBoxBugReport && my_files+=("/usr/local/bin/VBoxBugReport")
92test -f /usr/local/bin/VBoxBalloonCtrl && my_files+=("/usr/local/bin/VBoxBalloonCtrl")
93test -f /usr/local/bin/VBoxAutostart && my_files+=("/usr/local/bin/VBoxAutostart")
94test -f /usr/local/bin/VBoxDTrace && my_files+=("/usr/local/bin/VBoxDTrace")
95test -f /usr/local/bin/vbox-img && my_files+=("/usr/local/bin/vbox-img")
96test -d /Library/Receipts/VirtualBoxCLI.pkg/ && my_directories+=("/Library/Receipts/VirtualBoxCLI.pkg/")
97test -f /Library/LaunchDaemons/org.virtualbox.startup.plist && my_files+=("/Library/LaunchDaemons/org.virtualbox.startup.plist")
98
99test -d /Applications/VirtualBox.app/ && my_directories+=("/Applications/VirtualBox.app/")
100test -d /Library/Receipts/VirtualBox.pkg/ && my_directories+=("/Library/Receipts/VirtualBox.pkg/")
101
102# legacy
103test -d /Library/Receipts/VBoxDrv.pkg/ && my_directories+=("/Library/Receipts/VBoxDrv.pkg/")
104test -d /Library/Receipts/VBoxUSB.pkg/ && my_directories+=("/Library/Receipts/VBoxUSB.pkg/")
105
106# python stuff
107python_versions="2.3 2.5 2.6 2.7"
108for p in $python_versions; do
109 test -f /Library/Python/$p/site-packages/vboxapi/VirtualBox_constants.py && my_files+=("/Library/Python/$p/site-packages/vboxapi/VirtualBox_constants.py")
110 test -f /Library/Python/$p/site-packages/vboxapi/VirtualBox_constants.pyc && my_files+=("/Library/Python/$p/site-packages/vboxapi/VirtualBox_constants.pyc")
111 test -f /Library/Python/$p/site-packages/vboxapi/__init__.py && my_files+=("/Library/Python/$p/site-packages/vboxapi/__init__.py")
112 test -f /Library/Python/$p/site-packages/vboxapi/__init__.pyc && my_files+=("/Library/Python/$p/site-packages/vboxapi/__init__.pyc")
113 test -f /Library/Python/$p/site-packages/vboxapi-1.0-py$p.egg-info && my_files+=("/Library/Python/$p/site-packages/vboxapi-1.0-py$p.egg-info")
114 test -d /Library/Python/$p/site-packages/vboxapi/ && my_directories+=("/Library/Python/$p/site-packages/vboxapi/")
115done
116
117#
118# Collect KEXTs to remove.
119# Note that the unload order is significant.
120#
121declare -a my_kexts
122for kext in org.virtualbox.kext.VBoxUSB org.virtualbox.kext.VBoxNetFlt org.virtualbox.kext.VBoxNetAdp org.virtualbox.kext.VBoxDrv; do
123 if /usr/sbin/kextstat -b $kext -l | grep -q $kext; then
124 my_kexts+=("$kext")
125 fi
126done
127
128#
129# Collect packages to forget
130#
131my_pb='org\.virtualbox\.pkg\.'
132my_pkgs=`/usr/sbin/pkgutil --pkgs="${my_pb}vboxkexts|${my_pb}vboxstartupitems|${my_pb}virtualbox|${my_pb}virtualboxcli"`
133
134#
135# Did we find anything to uninstall?
136#
137if test -z "${my_directories[*]}" -a -z "${my_files[*]}" -a -z "${my_kexts[*]}" -a -z "$my_pkgs"; then
138 echo "No VirtualBox files, directories, KEXTs or packages to uninstall."
139 echo "Done."
140 exit 0;
141fi
142
143#
144# Look for running VirtualBox processes and warn the user
145# if something is running. Since deleting the files of
146# running processes isn't fatal as such, we will leave it
147# to the user to choose whether to continue or not.
148#
149# Note! comm isn't supported on Tiger, so we make -c to do the stripping.
150#
151my_processes="`ps -axco 'pid uid command' | grep -wEe '(VirtualBox|VirtualBoxVM|VBoxManage|VBoxHeadless|vboxwebsrv|VBoxXPCOMIPCD|VBoxSVC|VBoxNetDHCP|VBoxNetNAT)' | grep -vw grep | grep -vw VirtualBox_Uninstall.tool | tr '\n' '\a'`";
152if test -n "$my_processes"; then
153 echo 'Warning! Found the following active VirtualBox processes:'
154 echo "$my_processes" | tr '\a' '\n'
155 echo ""
156 echo "We recommend that you quit all VirtualBox processes before"
157 echo "uninstalling the product."
158 echo ""
159 if test "$my_default_prompt" != "Yes"; then
160 echo "Do you wish to continue none the less (Yes/No)?"
161 read my_answer
162 if test "$my_answer" != "Yes" -a "$my_answer" != "YES" -a "$my_answer" != "yes"; then
163 echo "Aborting uninstall. (answer: '$my_answer')".
164 exit 2;
165 fi
166 echo ""
167 my_answer=""
168 fi
169fi
170
171#
172# Display the files and directories that will be removed
173# and get the user's consent before continuing.
174#
175if test -n "${my_files[*]}" -o -n "${my_directories[*]}"; then
176 echo "The following files and directories (bundles) will be removed:"
177 for file in "${my_files[@]}"; do echo " $file"; done
178 for dir in "${my_directories[@]}"; do echo " $dir"; done
179 echo ""
180fi
181if test -n "${my_kexts[*]}"; then
182 echo "And the following KEXTs will be unloaded:"
183 for kext in "${my_kexts[@]}"; do echo " $kext"; done
184 echo ""
185fi
186if test -n "$my_pkgs"; then
187 echo "And the traces of following packages will be removed:"
188 for kext in $my_pkgs; do echo " $kext"; done
189 echo ""
190fi
191
192if test "$my_default_prompt" != "Yes"; then
193 echo "Do you wish to uninstall VirtualBox (Yes/No)?"
194 read my_answer
195 if test "$my_answer" != "Yes" -a "$my_answer" != "YES" -a "$my_answer" != "yes"; then
196 echo "Aborting uninstall. (answer: '$my_answer')".
197 exit 2;
198 fi
199 echo ""
200fi
201
202#
203# Unregister has to be done before the files are removed.
204#
205LSREGISTER=/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister
206if [ -e ${LSREGISTER} ]; then
207 ${LSREGISTER} -u /Applications/VirtualBox.app > /dev/null
208 ${LSREGISTER} -u /Applications/VirtualBox.app/Contents/Resources/vmstarter.app > /dev/null
209fi
210
211#
212# Display the sudo usage instructions and execute the command.
213#
214echo "The uninstallation processes requires administrative privileges"
215echo "because some of the installed files cannot be removed by a normal"
216echo "user. You may be prompted for your password now..."
217echo ""
218
219if test -n "${my_files[*]}" -o -n "${my_directories[*]}"; then
220 /usr/bin/sudo -p "Please enter %u's password:" /bin/rm -Rf "${my_files[@]}" "${my_directories[@]}"
221 my_rc=$?
222 if test "$my_rc" -ne 0; then
223 echo "An error occurred durning 'sudo rm', there should be a message above. (rc=$my_rc)"
224 test -x /usr/bin/sudo || echo "warning: Cannot find /usr/bin/sudo or it's not an executable."
225 test -x /bin/rm || echo "warning: Cannot find /bin/rm or it's not an executable"
226 echo ""
227 echo "The uninstall failed. Please retry."
228 test "$my_default_prompt" != "Yes" && read -p "Press <ENTER> to exit"
229 exit 1;
230 fi
231fi
232
233my_rc=0
234for kext in "${my_kexts[@]}"; do
235 echo unloading $kext
236 /usr/bin/sudo -p "Please enter %u's password (unloading $kext):" /sbin/kextunload -m $kext
237 my_rc2=$?
238 if test "$my_rc2" -ne 0; then
239 echo "An error occurred durning 'sudo /sbin/kextunload -m $kext', there should be a message above. (rc=$my_rc2)"
240 test -x /usr/bin/sudo || echo "warning: Cannot find /usr/bin/sudo or it's not an executable."
241 test -x /sbin/kextunload || echo "warning: Cannot find /sbin/kextunload or it's not an executable"
242 my_rc=$my_rc2
243 fi
244done
245if test "$my_rc" -eq 0; then
246 echo "Successfully unloaded VirtualBox kernel extensions."
247else
248 echo "Failed to unload one or more KEXTs, please reboot the machine to complete the uninstall."
249 test "$my_default_prompt" != "Yes" && read -p "Press <ENTER> to exit"
250 exit 1;
251fi
252
253# Cleaning up pkgutil database
254for my_pkg in $my_pkgs; do
255 /usr/bin/sudo -p "Please enter %u's password (removing $my_pkg):" /usr/sbin/pkgutil --forget "$my_pkg"
256done
257
258echo "Done."
259exit 0;
260
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette