cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#!/usr/bin/env python
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# -*- coding: utf-8 -*-
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncVirtualBox Installer Wrapper Driver.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync__copyright__ = \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncCopyright (C) 2010-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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"""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync__version__ = "$Revision$"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Standard Python imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncimport os
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncimport sys
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncimport re
b3fc9a97b8ff24b51efa8074553b9271f96b523dvboxsync#import socket
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncimport tempfile
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncimport time
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Only the main script needs to modify the path.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsynctry: __file__
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncexcept: __file__ = sys.argv[0];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncg_ksValidationKitDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncsys.path.append(g_ksValidationKitDir);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# Validation Kit imports.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom common import utils, webutils;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom testdriver import reporter;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncfrom testdriver.base import TestDriverBase;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncclass VBoxInstallerTestDriver(TestDriverBase):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Implementation of a top level test driver.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## State file indicating that we've skipped installation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ksVar_Skipped = 'vboxinstaller-skipped';
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def __init__(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TestDriverBase.__init__(self);
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 self._fAutoInstallPuelExtPack = True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Base method we override
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def showUsage(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync rc = TestDriverBase.showUsage(self);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # 0 1 2 3 4 5 6 7 8
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # 012345678901234567890123456789012345678901234567890123456789012345678901234567890
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('vboxinstaller Options:');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' --vbox-build <url[,url2[,..]]>');
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(' --no-puel-extpack');
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(' --');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' Indicates the end of our parameters and the start of the sub');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log(' testdriver and its arguments.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return rc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def parseOption(self, asArgs, iArg):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Parse our arguments.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if asArgs[iArg] == '--':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # End of our parameters and start of the sub driver invocation.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iArg = self.requireMoreArgs(1, asArgs, iArg);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync assert len(self._asSubDriver) == 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._asSubDriver = asArgs[iArg:];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._asSubDriver[0] = self._asSubDriver[0].replace('/', os.path.sep);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iArg = len(asArgs) - 1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif asArgs[iArg] == '--vbox-build':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # List of files to copy/download and install.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iArg = self.requireMoreArgs(1, asArgs, iArg);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._asBuildUrls = asArgs[iArg].split(',');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif asArgs[iArg] == '--no-puel-extpack':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._fAutoInstallPuelExtPack = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif asArgs[iArg] == '--puel-extpack':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._fAutoInstallPuelExtPack = True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return TestDriverBase.parseOption(self, asArgs, iArg);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return iArg + 1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def completeOptions(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Check that we've got what we need.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(self._asBuildUrls) == 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('No build files specfiied ("--vbox-build file1[,file2[...]]")');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(self._asSubDriver) == 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('No sub testdriver specified. (" -- test/stuff/tdStuff1.py args")');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Construct _asBuildFiles as an array parallel to _asBuildUrls.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for sUrl in self._asBuildUrls:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sDstFile = os.path.join(self.sScratchPath, webutils.getFilename(sUrl));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._asBuildFiles.append(sDstFile);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return TestDriverBase.completeOptions(self);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def actionExtract(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('vboxinstall does not support extracting resources, you have to do that using the sub testdriver.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def actionCleanupBefore(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Kills all VBox process we see.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync This is only supposed to execute on a testbox so we don't need to go
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync all complicated wrt other users.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._killAllVBoxProcesses();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def actionConfig(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Install VBox and pass on the configure request to the sub testdriver.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._installVBox();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is None: self._persistentVarSet(self.ksVar_Skipped, 'true');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else: self._persistentVarUnset(self.ksVar_Skipped);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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 fRc = self._executeSubDriver([ 'verify', ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is True and 'execute' not in self.asActions and 'all' not in self.asActions:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._executeSubDriver([ 'config', ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def actionExecute(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Execute the sub testdriver.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._executeSubDriver(self.asActions);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def actionCleanupAfter(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Forward this to the sub testdriver, then uninstall VBox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if 'execute' not in self.asActions and 'all' not in self.asActions:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._executeSubDriver([ 'cleanup-after', ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self._killAllVBoxProcesses():
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self._uninstallVBox(self._persistentVarExists(self.ksVar_Skipped)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if utils.getHostOs() == 'darwin':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._darwinUnmountDmg(fIgnoreError = True); # paranoia
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not TestDriverBase.actionCleanupAfter(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def actionAbort(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
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 """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc1 = self._executeSubDriver([ 'abort', ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc2 = TestDriverBase.actionAbort(self);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc3 = self._killAllVBoxProcesses();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc1 and fRc2 and fRc3;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Persistent variables.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ## @todo integrate into the base driver. Persisten accross scratch wipes?
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def __persistentVarCalcName(self, sVar):
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _persistentVarSet(self, sVar, sValue = ''):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Sets a persistent variable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns True on success, False + reporter.error on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync May raise exception if the variable name is invalid or something
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unexpected happens.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sFull = self.__persistentVarCalcName(sVar);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oFile = open(sFull, 'w');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if len(sValue) > 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oFile.write(sValue.encode('utf-8'));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oFile.close();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Error creating "%s"' % (sFull,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _persistentVarUnset(self, sVar):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Unsets a persistent variable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns True on success, False + reporter.error on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync May raise exception if the variable name is invalid or something
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unexpected happens.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sFull = self.__persistentVarCalcName(sVar);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if os.path.exists(sFull):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync os.unlink(sFull);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Error unlinking "%s"' % (sFull,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _persistentVarExists(self, sVar):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Checks if a persistent variable exists.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns true/false.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync May raise exception if the variable name is invalid or something
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unexpected happens.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return os.path.exists(self.__persistentVarCalcName(sVar));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _persistentVarGet(self, sVar):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Gets the value of a persistent variable.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns variable value on success.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns None if the variable doesn't exist or if an
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync error (reported) occured.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync May raise exception if the variable name is invalid or something
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync unexpected happens.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sFull = self.__persistentVarCalcName(sVar);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not os.path.exists(sFull):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oFile = open(sFull, 'r');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sValue = oFile.read().decode('utf-8');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oFile.close();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Error creating "%s"' % (sFull,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return sValue;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Helpers.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _killAllVBoxProcesses(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Kills all virtual box related processes we find in the system.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for iIteration in range(22):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Gather processes to kill.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync aoTodo = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for oProcess in utils.processListAll():
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sBase = oProcess.getBaseImageNameNoExeSuff();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sBase is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync continue;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sBase = sBase.lower();
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 aoTodo.append(oProcess);
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 if len(aoTodo) == 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Kill.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for oProcess in aoTodo:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Loop #%d - Killing %s (%s)'
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync % (iIteration, oProcess.iPid, oProcess.sImage if oProcess.sName is None else oProcess.sName,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync utils.processKill(oProcess.iPid); # No mercy.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Check if they're all dead like they should be.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync time.sleep(0.1);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for oProcess in aoTodo:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if utils.processExists(oProcess.iPid):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync time.sleep(2);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _executeSync(self, asArgs):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Executes a child process synchronously.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns True if the process executed successfully and returned 0,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync otherwise False is returned.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Executing: %s' % (asArgs, ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.flushall();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iRc = utils.processCall(asArgs, shell = False, close_fds = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Exit code: %s (%s)' % (iRc, asArgs));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return iRc is 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _sudoExecuteSync(self, asArgs):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
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 """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Executing [sudo]: %s' % (asArgs, ));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.flushall();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iRc = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync iRc = utils.sudoProcessCall(asArgs, shell = False, close_fds = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return (False, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Exit code [sudo]: %s (%s)' % (iRc, asArgs));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return (iRc is 0, iRc);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _executeSubDriver(self, asActions):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Execute the sub testdriver with the specified action.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asArgs = list(self._asSubDriver)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asArgs.append('--no-wipe-clean');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asArgs.extend(asActions);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._executeSync(asArgs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _maybeUnpackArchive(self, sMaybeArchive, fNonFatal = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Attempts to unpack the given build file.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Updates _asBuildFiles.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns True/False. No exceptions.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asMembers = utils.unpackFile(sMaybeArchive, self.sScratchPath, reporter.log,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log if fNonFatal else reporter.error);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if asMembers is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._asBuildFiles.extend(asMembers);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _installVBox(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Download / copy the build files into the scratch area and install them.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testStart('Installing VirtualBox');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('CWD=%s' % (os.getcwd(),)); # curious
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Download the build files.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for i in range(len(self._asBuildUrls)):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if webutils.downloadFile(self._asBuildUrls[i], self._asBuildFiles[i],
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self.sBuildPath, reporter.log, reporter.log) is not True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testDone(fSkipped = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None; # Failed to get binaries, probably deleted. Skip the test run.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
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 #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for sFile in list(self._asBuildFiles):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._maybeUnpackArchive(sFile, fNonFatal = True) is not True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testDone(fSkipped = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None; # Failed to unpack. Probably local error, like busy
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # DLLs on windows, no reason for failing the build.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Go to system specific installation code.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHost = utils.getHostOs()
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 else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Unsupported host "%s".' % (sHost,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is False:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testFailure('Installation error.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the extension pack.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is True and self._fAutoInstallPuelExtPack:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._installExtPack();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is False:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testFailure('Extension pack installation error.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Some debugging...
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cMbFreeSpace = utils.getDiskUsage(self.sScratchPath);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Disk usage after VBox install: %d MB available at %s' % (cMbFreeSpace, self.sScratchPath,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.logXcpt('Unable to get disk free space. Ignored. Continuing.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testDone();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _uninstallVBox(self, fIgnoreError = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Uninstall VirtualBox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testStart('Uninstalling VirtualBox');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHost = utils.getHostOs()
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 else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Unsupported host "%s".' % (sHost,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is False and not fIgnoreError:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testFailure('Uninstallation failed.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc2 = self._uninstallAllExtPacks();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not fRc2 and fRc:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = fRc2;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.testDone(fSkipped = (fRc is None));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _findFile(self, sRegExp, fMandatory = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns the first build file that matches the given regular expression
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync (basename only).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Returns None if no match was found, logging it as an error if
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fMandatory is set.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oRegExp = re.compile(sRegExp);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for sFile in self._asBuildFiles:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if oRegExp.match(os.path.basename(sFile)) and os.path.exists(sFile):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return sFile;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fMandatory:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Failed to find a file matching "%s" in %s.' % (sRegExp, self._asBuildFiles,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _waitForTestManagerConnectivity(self, cSecTimeout):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Check and wait for network connectivity to the test manager.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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 """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cSecElapsed = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync secStart = utils.timestampSecond();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync while reporter.checkTestManagerConnection() is False:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cSecElapsed = utils.timestampSecond() - secStart;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if cSecElapsed >= cSecTimeout:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('_waitForTestManagerConnectivity: Giving up after %u secs.' % (cSecTimeout,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync time.sleep(2);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if cSecElapsed > 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('_waitForTestManagerConnectivity: Waited %s secs.' % (cSecTimeout,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Darwin (Mac OS X).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _darwinDmgPath(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Returns the path to the DMG mount."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return os.path.join(self.sScratchPath, 'DmgMountPoint');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _darwinUnmountDmg(self, fIgnoreError):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Umount any DMG on at the default mount point.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sMountPath = self._darwinDmgPath();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not os.path.exists(sMountPath):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Unmount.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._executeSync(['hdiutil', 'detach', sMountPath ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not fRc and not fIgnoreError:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Failed to unmount DMG at %s' % sMountPath);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Remove dir.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync os.rmdir(sMountPath);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not fIgnoreError:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.errorXcpt('Failed to remove directory %s' % sMountPath);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _darwinMountDmg(self, sDmg):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Mount the DMG at the default mount point.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._darwinUnmountDmg(fIgnoreError = True)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sMountPath = self._darwinDmgPath();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not os.path.exists(sMountPath):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync os.mkdir(sMountPath, 0755);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.logXcpt();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return self._executeSync(['hdiutil', 'attach', '-readonly', '-mount', 'required', '-mountpoint', sMountPath, sDmg, ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _installVBoxOnDarwin(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Installs VBox on Mac OS X."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sDmg = self._findFile('^VirtualBox-.*\\.dmg$');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sDmg is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Mount the DMG.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._darwinMountDmg(sDmg);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is not True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Uninstall any previous vbox version first.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sUninstaller = os.path.join(self._darwinDmgPath(), 'VirtualBox_Uninstall.tool');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([sUninstaller, '--unattended',]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the package.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPkg = os.path.join(self._darwinDmgPath(), 'VirtualBox.pkg');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync(['installer', '-verbose', '-dumplog', '-pkg', sPkg, '-target', '/']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Unmount the DMG and we're done.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self._darwinUnmountDmg(fIgnoreError = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _uninstallVBoxOnDarwin(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Uninstalls VBox on Mac OS X."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Is VirtualBox installed? If not, don't try uninstall it.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sVBox = self._getVBoxInstallPath(fFailIfNotFound = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sVBox is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Find the dmg.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sDmg = self._findFile('^VirtualBox-.*\\.dmg$');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sDmg is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not os.path.exists(sDmg):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Mount the DMG.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._darwinMountDmg(sDmg);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is not True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Execute the uninstaller.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sUninstaller = os.path.join(self._darwinDmgPath(), 'VirtualBox_Uninstall.tool');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([sUninstaller, '--unattended',]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Unmount the DMG and we're done.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not self._darwinUnmountDmg(fIgnoreError = False):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # GNU/Linux
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _installVBoxOnLinux(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Installs VBox on Linux."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRun = self._findFile('^VirtualBox-.*\\.run$');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sRun is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync utils.chmodPlusX(sRun);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the new one.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([sRun,]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _uninstallVBoxOnLinux(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Uninstalls VBox on Linux."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Is VirtualBox installed? If not, don't try uninstall it.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sVBox = self._getVBoxInstallPath(fFailIfNotFound = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sVBox is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Find the .run file and use it.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRun = self._findFile('^VirtualBox-.*\\.run$', fMandatory = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sRun is not None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync utils.chmodPlusX(sRun);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([sRun, 'uninstall']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Try the installed uninstaller.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for sUninstaller in [os.path.join(sVBox, 'uninstall.sh'), '/opt/VirtualBox/uninstall.sh', ]:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if os.path.isfile(sUninstaller):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Invoking "%s"...' % (sUninstaller,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([sUninstaller, 'uninstall']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Did not find any VirtualBox install to uninstall.');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Solaris
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _generateAutoResponseOnSolaris(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Generates an autoresponse file on solaris, returning the name.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync None is return on failure.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPath = os.path.join(self.sScratchPath, 'SolarisAutoResponse');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oFile = utils.openNoInherit(sPath, 'wt');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync oFile.write('basedir=default\n'
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 oFile.close();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return sPath;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _installVBoxOnSolaris(self):
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 if self._maybeUnpackArchive(sTar) is not True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sPkg = self._findFile('^VirtualBox-.*\\.pkg$', fMandatory = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRsp = self._findFile('^autoresponse$', fMandatory = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sPkg is None or sRsp is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Uninstall first (ignore result).
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._uninstallVBoxOnSolaris();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the new one.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync(['pkgadd', '-d', sPkg, '-n', '-a', sRsp, 'SUNWvbox']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _uninstallVBoxOnSolaris(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Uninstalls VBox on Solaris."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.flushall();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if utils.processCall(['pkginfo', '-q', 'SUNWvbox']) != 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sRsp = self._generateAutoResponseOnSolaris();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync(['pkgrm', '-n', '-a', sRsp, 'SUNWvbox']);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Windows
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _installVBoxOnWindows(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Installs VBox on Windows."""
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExe = self._findFile('^VirtualBox-.*-(MultiArch|Win).exe$');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sExe is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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
42d6ec2583d02cb39a47830c91542dc414590c18vboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Uninstall any previous vbox version first.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = self._uninstallVBoxOnWindows();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is not True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None; # There shouldn't be anything to uninstall, and if there is, it's not our fault.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Install the new one.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asArgs = [sExe, '-vvvv', '--silent', '--logging'];
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 fRc2, iRc = self._sudoExecuteSync(asArgs);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc2 is False:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if iRc == 3010: # ERROR_SUCCESS_REBOOT_REQUIRED
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Note: Installer required a reboot to complete installation');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Optional, don't fail.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sLogFile = os.path.join(tempfile.gettempdir(), 'VirtualBox', 'VBoxInstallLog.txt');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sLogFile is not None \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync and os.path.isfile(sLogFile):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.addLogFile(sLogFile, 'log/installer', "Verbose MSI installation log file");
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._waitForTestManagerConnectivity(30);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _uninstallVBoxOnWindows(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Uninstalls VBox on Windows, all installations we find to be on the safe side...
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync import win32com.client; # pylint: disable=F0401
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
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Search installed products for VirtualBox.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asProdCodes = [];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for sProdCode in oInstaller.Products:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync try:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sProdName = oInstaller.ProductInfo(sProdCode, "ProductName");
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync except:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.logXcpt();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync continue;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #reporter.log('Info: %s=%s' % (sProdCode, sProdName));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sProdName.startswith('Oracle VM VirtualBox') \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync or sProdName.startswith('Sun VirtualBox'):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asProdCodes.append([sProdCode, sProdName]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Before we start uninstalling anything, just ruthlessly kill any
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # msiexec process we might find hanging around.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cKilled = 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for oProcess in utils.processListAll():
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sBase = oProcess.getBaseImageNameNoExeSuff();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sBase is not None and sBase.lower() in [ 'msiexec', ]:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Killing MSI process: %s (%s)' % (oProcess.iPid, sBase));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync utils.processKill(oProcess.iPid);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync cKilled += 1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if cKilled > 0:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync time.sleep(16); # fudge.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Do the uninstalling.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sLogFile = os.path.join(self.sScratchPath, 'VBoxUninstallLog.txt');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for sProdCode, sProdName in asProdCodes:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Uninstalling %s (%s)...' % (sProdName, sProdCode));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc2, iRc = self._sudoExecuteSync(['msiexec', '/uninstall', sProdCode, '/quiet', '/passive', '/norestart',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '/L*v', '%s' % (sLogFile), ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc2 is False:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if iRc == 3010: # ERROR_SUCCESS_REBOOT_REQUIRED
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log('Note: Uninstaller required a reboot to complete uninstallation');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Optional, don't fail.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc = False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.addLogFile(sLogFile, 'log/uninstaller', "Verbose MSI uninstallation log file");
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync self._waitForTestManagerConnectivity(30);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fRc is False and os.path.isfile(sLogFile):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.addLogFile(sLogFile, 'log/uninstaller');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync # Extension pack.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _getVBoxInstallPath(self, fFailIfNotFound):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Returns the default VBox installation path. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sHost = utils.getHostOs();
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sHost == 'win':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sProgFiles = os.environ.get('ProgramFiles', 'C:\\Program Files');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLocs = [
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync os.path.join(sProgFiles, 'Oracle', 'VirtualBox'),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync os.path.join(sProgFiles, 'OracleVM', 'VirtualBox'),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync os.path.join(sProgFiles, 'Sun', 'VirtualBox'),
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif sHost == 'linux' or sHost == 'solaris':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLocs = [ '/opt/VirtualBox', '/opt/VirtualBox-3.2', '/opt/VirtualBox-3.1', '/opt/VirtualBox-3.0'];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync elif sHost == 'darwin':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLocs = [ '/Applications/VirtualBox.app/Contents/MacOS' ];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLocs = [ '/opt/VirtualBox' ];
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if 'VBOX_INSTALL_PATH' in os.environ:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync asLocs.insert(0, os.environ.get('VBOX_INSTALL_PATH', None));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync for sLoc in asLocs:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if os.path.isdir(sLoc):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return sLoc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if fFailIfNotFound:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.error('Failed to locate VirtualBox installation: %s' % (asLocs,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync reporter.log2('Failed to locate VirtualBox installation: %s' % (asLocs,));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return None;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _installExtPack(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Installs the extension pack. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sVBox = self._getVBoxInstallPath(fFailIfNotFound = True);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sVBox is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtPackDir = os.path.join(sVBox, 'ExtensionPacks');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if self._uninstallAllExtPacks() is not True:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return False;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtPack = self._findFile('Oracle_VM_VirtualBox_Extension_Pack.vbox-extpack');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sExtPack is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtPack = self._findFile('Oracle_VM_VirtualBox_Extension_Pack.*.vbox-extpack');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sExtPack is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
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 '--gzip',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--file', sExtPack,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--directory', sDstDir,
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--file-mode-and-mask', '0644',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--file-mode-or-mask', '0644',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--dir-mode-and-mask', '0755',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--dir-mode-or-mask', '0755',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--owner', '0',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync '--group', '0',
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync ]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync def _uninstallAllExtPacks(self):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync """ Uninstalls all extension packs. """
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sVBox = self._getVBoxInstallPath(fFailIfNotFound = False);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if sVBox is None:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sExtPackDir = os.path.join(sVBox, 'ExtensionPacks');
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if not os.path.exists(sExtPackDir):
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return True;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRc, _ = self._sudoExecuteSync([self.getBinTool('vts_rm'), '-Rfv', '--', sExtPackDir]);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return fRc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncif __name__ == '__main__':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sys.exit(VBoxInstallerTestDriver().main(sys.argv));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync