cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# -*- coding: utf-8 -*-
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox Installer Wrapper Driver.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThis installs VirtualBox, starts a sub driver which does the real testing,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncand then uninstall VirtualBox afterwards. This reduces the complexity of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncother VBox test drivers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCopyright (C) 2010-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncavailable from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncyou can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncGeneral Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncThe contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncof the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync(CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncYou may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncterms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Standard Python imports.
b3fc9a97b8ff24b51efa8074553b9271f96b523dvboxsync#import socket
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Only the main script needs to modify the path.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncg_ksValidationKitDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Validation Kit imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Implementation of a top level test driver.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## State file indicating that we've skipped installation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._asSubDriver = []; # The sub driver and it's arguments.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._asBuildUrls = []; # The URLs passed us on the command line.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._asBuildFiles = []; # The downloaded file names.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Base method we override
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # 0 1 2 3 4 5 6 7 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # 012345678901234567890123456789012345678901234567890123456789012345678901234567890
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' Comma separated list of URL to file to download and install or/and');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' unpack. URLs without a schema are assumed to be files on the');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' build share and will be copied off it.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' Indicates that the PUEL extension pack should not be installed if found.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' The default is to install it if found in the vbox-build.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' Indicates the end of our parameters and the start of the sub');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Parse our arguments.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # End of our parameters and start of the sub driver invocation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._asSubDriver[0] = self._asSubDriver[0].replace('/', os.path.sep);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # List of files to copy/download and install.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return TestDriverBase.parseOption(self, asArgs, iArg);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Check that we've got what we need.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('No build files specfiied ("--vbox-build file1[,file2[...]]")');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('No sub testdriver specified. (" -- test/stuff/tdStuff1.py args")');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Construct _asBuildFiles as an array parallel to _asBuildUrls.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sDstFile = os.path.join(self.sScratchPath, webutils.getFilename(sUrl));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('vboxinstall does not support extracting resources, you have to do that using the sub testdriver.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Kills all VBox process we see.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync This is only supposed to execute on a testbox so we don't need to go
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync all complicated wrt other users.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Install VBox and pass on the configure request to the sub testdriver.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is None: self._persistentVarSet(self.ksVar_Skipped, 'true');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else: self._persistentVarUnset(self.ksVar_Skipped);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo vbox.py still has bugs preventing us from invoking it seperately with each action.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is True and 'execute' not in self.asActions and 'all' not in self.asActions:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is True and 'execute' not in self.asActions and 'all' not in self.asActions:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Execute the sub testdriver.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Forward this to the sub testdriver, then uninstall VBox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if 'execute' not in self.asActions and 'all' not in self.asActions:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._executeSubDriver([ 'cleanup-after', ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self._uninstallVBox(self._persistentVarExists(self.ksVar_Skipped)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._darwinUnmountDmg(fIgnoreError = True); # paranoia
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Forward this to the sub testdriver first, then do the default pid file
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync based cleanup and finally swipe the scene with the heavy artillery.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Persistent variables.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo integrate into the base driver. Persisten accross scratch wipes?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """Returns the (full) filename for the given persistent variable."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync assert re.match(r'^[a-zA-Z0-9_-]*$', sVar) is not None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return os.path.join(self.sScratchPath, 'persistent-%s.var' % (sVar,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Sets a persistent variable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns True on success, False + reporter.error on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync May raise exception if the variable name is invalid or something
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unexpected happens.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Error creating "%s"' % (sFull,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Unsets a persistent variable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns True on success, False + reporter.error on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync May raise exception if the variable name is invalid or something
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unexpected happens.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Error unlinking "%s"' % (sFull,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Checks if a persistent variable exists.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync May raise exception if the variable name is invalid or something
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unexpected happens.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return os.path.exists(self.__persistentVarCalcName(sVar));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Gets the value of a persistent variable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns variable value on success.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns None if the variable doesn't exist or if an
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync error (reported) occured.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync May raise exception if the variable name is invalid or something
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unexpected happens.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Error creating "%s"' % (sFull,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Kills all virtual box related processes we find in the system.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Gather processes to kill.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sBase in [ 'vboxsvc', 'virtualbox', 'virtualboxvm', 'vboxheadless', 'vboxmanage', 'vboxsdl', 'vboxwebsrv',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'vboxautostart', 'vboxballoonctrl', 'vboxbfe', 'vboxextpackhelperapp', 'vboxnetdhcp',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'vboxnetadpctl', 'vboxtestogl', 'vboxtunctl', 'vboxvmmpreload', 'vboxxpcomipcd', 'vmCreator', ]:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if iIteration in [0, 21] and sBase in [ 'windbg', 'gdb', 'gdb-i386-apple-darwin', ]:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Warning: debugger running: %s (%s)' % (oProcess.iPid, sBase,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (iIteration, oProcess.iPid, oProcess.sImage if oProcess.sName is None else oProcess.sName,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Check if they're all dead like they should be.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Executes a child process synchronously.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns True if the process executed successfully and returned 0,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync otherwise False is returned.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iRc = utils.processCall(asArgs, shell = False, close_fds = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Exit code: %s (%s)' % (iRc, asArgs));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Executes a sudo child process synchronously.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns a tuple [True, 0] if the process executed successfully
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and returned 0, otherwise [False, rc] is returned.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iRc = utils.sudoProcessCall(asArgs, shell = False, close_fds = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Exit code [sudo]: %s (%s)' % (iRc, asArgs));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Execute the sub testdriver with the specified action.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _maybeUnpackArchive(self, sMaybeArchive, fNonFatal = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Attempts to unpack the given build file.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Updates _asBuildFiles.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns True/False. No exceptions.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asMembers = utils.unpackFile(sMaybeArchive, self.sScratchPath, reporter.log,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Download / copy the build files into the scratch area and install them.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Download the build files.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if webutils.downloadFile(self._asBuildUrls[i], self._asBuildFiles[i],
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sBuildPath, reporter.log, reporter.log) is not True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None; # Failed to get binaries, probably deleted. Skip the test run.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Unpack anything we know what is and append it to the build files
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # list. This allows us to use VBoxAll*.tar.gz files.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._maybeUnpackArchive(sFile, fNonFatal = True) is not True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None; # Failed to unpack. Probably local error, like busy
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # DLLs on windows, no reason for failing the build.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Go to system specific installation code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sHost == 'darwin': fRc = self._installVBoxOnDarwin();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif sHost == 'linux': fRc = self._installVBoxOnLinux();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif sHost == 'solaris': fRc = self._installVBoxOnSolaris();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif sHost == 'win': fRc = self._installVBoxOnWindows();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Unsupported host "%s".' % (sHost,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the extension pack.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testFailure('Extension pack installation error.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Some debugging...
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cMbFreeSpace = utils.getDiskUsage(self.sScratchPath);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Disk usage after VBox install: %d MB available at %s' % (cMbFreeSpace, self.sScratchPath,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.logXcpt('Unable to get disk free space. Ignored. Continuing.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Uninstall VirtualBox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sHost == 'darwin': fRc = self._uninstallVBoxOnDarwin();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif sHost == 'linux': fRc = self._uninstallVBoxOnLinux();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif sHost == 'solaris': fRc = self._uninstallVBoxOnSolaris();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif sHost == 'win': fRc = self._uninstallVBoxOnWindows();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Unsupported host "%s".' % (sHost,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns the first build file that matches the given regular expression
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (basename only).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns None if no match was found, logging it as an error if
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fMandatory is set.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if oRegExp.match(os.path.basename(sFile)) and os.path.exists(sFile):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Failed to find a file matching "%s" in %s.' % (sRegExp, self._asBuildFiles,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _waitForTestManagerConnectivity(self, cSecTimeout):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Check and wait for network connectivity to the test manager.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync This is used with the windows installation and uninstallation since
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync these usually disrupts network connectivity when installing the filter
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync driver. If we proceed to quickly, we might finish the test at a time
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync when we cannot report to the test manager and thus end up with an
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync abandonded test error.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync while reporter.checkTestManagerConnection() is False:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('_waitForTestManagerConnectivity: Giving up after %u secs.' % (cSecTimeout,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('_waitForTestManagerConnectivity: Waited %s secs.' % (cSecTimeout,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Darwin (Mac OS X).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Returns the path to the DMG mount."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return os.path.join(self.sScratchPath, 'DmgMountPoint');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Umount any DMG on at the default mount point.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._executeSync(['hdiutil', 'detach', sMountPath ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Failed to unmount DMG at %s' % sMountPath);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Remove dir.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Failed to remove directory %s' % sMountPath);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Mount the DMG at the default mount point.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._executeSync(['hdiutil', 'attach', '-readonly', '-mount', 'required', '-mountpoint', sMountPath, sDmg, ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Installs VBox on Mac OS X."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sDmg is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Mount the DMG.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Uninstall any previous vbox version first.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sUninstaller = os.path.join(self._darwinDmgPath(), 'VirtualBox_Uninstall.tool');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([sUninstaller, '--unattended',]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the package.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPkg = os.path.join(self._darwinDmgPath(), 'VirtualBox.pkg');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync(['installer', '-verbose', '-dumplog', '-pkg', sPkg, '-target', '/']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Unmount the DMG and we're done.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self._darwinUnmountDmg(fIgnoreError = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Uninstalls VBox on Mac OS X."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Is VirtualBox installed? If not, don't try uninstall it.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sVBox = self._getVBoxInstallPath(fFailIfNotFound = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Find the dmg.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sDmg is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Mount the DMG.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Execute the uninstaller.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sUninstaller = os.path.join(self._darwinDmgPath(), 'VirtualBox_Uninstall.tool');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([sUninstaller, '--unattended',]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Unmount the DMG and we're done.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self._darwinUnmountDmg(fIgnoreError = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Installs VBox on Linux."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sRun is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the new one.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Uninstalls VBox on Linux."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Is VirtualBox installed? If not, don't try uninstall it.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sVBox = self._getVBoxInstallPath(fFailIfNotFound = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Find the .run file and use it.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRun = self._findFile('^VirtualBox-.*\\.run$', fMandatory = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sRun is not None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([sRun, 'uninstall']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Try the installed uninstaller.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for sUninstaller in [os.path.join(sVBox, 'uninstall.sh'), '/opt/VirtualBox/uninstall.sh', ]:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Invoking "%s"...' % (sUninstaller,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([sUninstaller, 'uninstall']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Did not find any VirtualBox install to uninstall.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Generates an autoresponse file on solaris, returning the name.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync None is return on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPath = os.path.join(self.sScratchPath, 'SolarisAutoResponse');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'runlevel=nocheck\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'conflict=quit\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'setuid=nocheck\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'action=nocheck\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'partial=quit\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'instance=unique\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'idepend=quit\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'rdepend=quit\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'space=quit\n'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync 'mail=\n');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Installs VBox on Solaris."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPkg = self._findFile('^VirtualBox-.*\\.pkg$', fMandatory = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sPkg is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sTar = self._findFile('^VirtualBox-.*-SunOS-.*\\.tar.gz$', fMandatory = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sTar is not None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPkg = self._findFile('^VirtualBox-.*\\.pkg$', fMandatory = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRsp = self._findFile('^autoresponse$', fMandatory = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Uninstall first (ignore result).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the new one.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync(['pkgadd', '-d', sPkg, '-n', '-a', sRsp, 'SUNWvbox']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Uninstalls VBox on Solaris."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if utils.processCall(['pkginfo', '-q', 'SUNWvbox']) != 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync(['pkgrm', '-n', '-a', sRsp, 'SUNWvbox']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Installs VBox on Windows."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExe = self._findFile('^VirtualBox-.*-(MultiArch|Win).exe$');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sExe is None:
42d6ec2583d02cb39a47830c91542dc414590c18vboxsync # TEMPORARY HACK - START
42d6ec2583d02cb39a47830c91542dc414590c18vboxsync # It seems that running the NDIS cleanup script upon uninstallation is not
42d6ec2583d02cb39a47830c91542dc414590c18vboxsync # a good idea, so let's run it before installing VirtualBox.
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync #sHostName = socket.getfqdn();
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync #if not sHostName.startswith('testboxwin3') \
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # and not sHostName.startswith('testboxharp2') \
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # and not sHostName.startswith('wei01-b6ka-3') \
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # and utils.getHostOsVersion() in ['8', '8.1', '9', '2008Server', '2008ServerR2', '2012Server']:
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # reporter.log('Peforming extra NDIS cleanup...');
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # sMagicScript = os.path.abspath(os.path.join(g_ksValidationKitDir, 'testdriver', 'win-vbox-net-uninstall.ps1'));
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # fRc2, _ = self._sudoExecuteSync(['powershell.exe', '-Command', 'set-executionpolicy unrestricted']);
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # if not fRc2:
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # reporter.log('set-executionpolicy failed.');
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # self._sudoExecuteSync(['powershell.exe', '-Command', 'get-executionpolicy']);
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # fRc2, _ = self._sudoExecuteSync(['powershell.exe', '-File', sMagicScript]);
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # if not fRc2:
df9b0d3dc3cdb942a763574ee14a9cce55f62eadvboxsync # reporter.log('NDIS cleanup failed.');
42d6ec2583d02cb39a47830c91542dc414590c18vboxsync # TEMPORARY HACK - END
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Uninstall any previous vbox version first.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None; # There shouldn't be anything to uninstall, and if there is, it's not our fault.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the new one.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asArgs.extend(['--msiparams', 'REBOOT=ReallySuppress']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sVBoxInstallPath = os.environ.get('VBOX_INSTALL_PATH', None);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sVBoxInstallPath is not None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asArgs.extend(['INSTALLDIR="%s"' % (sVBoxInstallPath,)]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Note: Installer required a reboot to complete installation');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Optional, don't fail.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sLogFile = os.path.join(tempfile.gettempdir(), 'VirtualBox', 'VBoxInstallLog.txt');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sLogFile is not None \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.addLogFile(sLogFile, 'log/installer', "Verbose MSI installation log file");
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Uninstalls VBox on Windows, all installations we find to be on the safe side...
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync win32com.client.gencache.EnsureModule('{000C1092-0000-0000-C000-000000000046}', 1033, 1, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oInstaller = win32com.client.Dispatch('WindowsInstaller.Installer',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync resultCLSID = '{000C1090-0000-0000-C000-000000000046}')
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Search installed products for VirtualBox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sProdName = oInstaller.ProductInfo(sProdCode, "ProductName");
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #reporter.log('Info: %s=%s' % (sProdCode, sProdName));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Before we start uninstalling anything, just ruthlessly kill any
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # msiexec process we might find hanging around.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sBase is not None and sBase.lower() in [ 'msiexec', ]:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Killing MSI process: %s (%s)' % (oProcess.iPid, sBase));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Do the uninstalling.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sLogFile = os.path.join(self.sScratchPath, 'VBoxUninstallLog.txt');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Uninstalling %s (%s)...' % (sProdName, sProdCode));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc2, iRc = self._sudoExecuteSync(['msiexec', '/uninstall', sProdCode, '/quiet', '/passive', '/norestart',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Note: Uninstaller required a reboot to complete uninstallation');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Optional, don't fail.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.addLogFile(sLogFile, 'log/uninstaller', "Verbose MSI uninstallation log file");
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Extension pack.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Returns the default VBox installation path. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sProgFiles = os.environ.get('ProgramFiles', 'C:\\Program Files');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync os.path.join(sProgFiles, 'OracleVM', 'VirtualBox'),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLocs = [ '/opt/VirtualBox', '/opt/VirtualBox-3.2', '/opt/VirtualBox-3.1', '/opt/VirtualBox-3.0'];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLocs = [ '/Applications/VirtualBox.app/Contents/MacOS' ];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLocs.insert(0, os.environ.get('VBOX_INSTALL_PATH', None));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Failed to locate VirtualBox installation: %s' % (asLocs,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log2('Failed to locate VirtualBox installation: %s' % (asLocs,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Installs the extension pack. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sVBox = self._getVBoxInstallPath(fFailIfNotFound = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtPackDir = os.path.join(sVBox, 'ExtensionPacks');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtPack = self._findFile('Oracle_VM_VirtualBox_Extension_Pack.vbox-extpack');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtPack = self._findFile('Oracle_VM_VirtualBox_Extension_Pack.*.vbox-extpack');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sDstDir = os.path.join(sExtPackDir, 'Oracle_VM_VirtualBox_Extension_Pack');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Installing extension pack "%s" to "%s"...' % (sExtPack, sExtPackDir));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([ self.getBinTool('vts_tar'),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--extract',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--verbose',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Uninstalls all extension packs. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sVBox = self._getVBoxInstallPath(fFailIfNotFound = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtPackDir = os.path.join(sVBox, 'ExtensionPacks');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([self.getBinTool('vts_rm'), '-Rfv', '--', sExtPackDir]);