import os, glob, re, logging from autotest_lib.client.bin import test, utils, package from autotest_lib.client.bin.test_config import config_loader from autotest_lib.client.common_lib import error class lsb_dtk(test.test): """ This autotest module runs the LSB test suite. @copyright: IBM 2008 @author: Pavan Naregundi (pnaregun@in.ibm.com) @author: Lucas Meneghel Rodrigues (lucasmr@br.ibm.com) """ version = 1 def initialize(self, config): arch = utils.get_current_kernel_arch() if arch in ['i386', 'i486', 'i586', 'i686', 'athlon']: self.arch = 'ia32' elif arch == 'ppc': self.arch = 'ppc32' elif arch in ['s390', 's390x', 'ia64', 'x86_64', 'ppc64']: self.arch = arch else: e_msg = 'Architecture %s not supported by LSB' % arch raise error.TestError(e_msg) self.config = config_loader(config, self.tmpdir) self.cachedir = os.path.join(self.bindir, 'cache') if not os.path.isdir(self.cachedir): os.makedirs(self.cachedir) self.packages_installed = False self.libraries_linked = False def install_lsb_packages(self): if not self.packages_installed: # First, we download the LSB DTK manager package, worry about # installing it later dtk_manager_arch = self.config.get('dtk-manager', 'arch-%s' % self.arch) dtk_manager_url = self.config.get('dtk-manager', 'tarball_url') % dtk_manager_arch if not dtk_manager_url: raise error.TestError('Could not get DTK manager URL from' ' configuration file') dtk_md5 = self.config.get('dtk-manager', 'md5-%s' % self.arch) if dtk_md5: logging.info('Caching LSB DTK manager RPM') dtk_manager_pkg = utils.unmap_url_cache(self.cachedir, dtk_manager_url, dtk_md5) else: raise error.TestError('Could not find DTK manager package md5,' ' cannot cache DTK manager tarball') # Get LSB tarball, cache it and uncompress under autotest srcdir if self.config.get('lsb', 'override_default_url') == 'no': lsb_url = self.config.get('lsb', 'tarball_url') % self.arch else: lsb_url = self.config.get('lsb', 'tarball_url_alt') % self.arch if not lsb_url: raise error.TestError('Could not get LSB URL from configuration' ' file') md5_key = 'md5-%s' % self.arch lsb_md5 = self.config.get('lsb', md5_key) if lsb_md5: logging.info('Caching LSB tarball') lsb_pkg = utils.unmap_url_cache(self.cachedir, lsb_url, lsb_md5) else: raise error.TestError('Could not find LSB package md5, cannot' ' cache LSB tarball') utils.extract_tarball_to_dir(lsb_pkg, self.srcdir) # Lets load a file that contains the list of RPMs os.chdir(self.srcdir) if not os.path.isfile('inst-config'): raise IOError('Could not find file with package info,' ' inst-config') rpm_file_list = open('inst-config', 'r') pkg_pattern = re.compile('[A-Za-z0-9_.-]*[.][r][p][m]') lsb_pkg_list = [] for line in rpm_file_list.readlines(): try: # We will install lsb-dtk-manager separately, so we can remove # it from the list of packages if not 'lsb-dtk-manager' in line: line = re.findall(pkg_pattern, line)[0] lsb_pkg_list.append(line) except: # If we don't get a match, no problem pass # Lets figure out the host distro distro_pkg_support = package.os_support() if os.path.isfile('/etc/debian_version') and \ distro_pkg_support['dpkg']: logging.debug('Debian based distro detected') if distro_pkg_support['conversion']: logging.debug('Package conversion supported') distro_type = 'debian-based' else: raise EnvironmentError('Package conversion not supported.' 'Cannot handle LSB package' ' installation') elif distro_pkg_support['rpm']: logging.debug('Red Hat based distro detected') distro_type = 'redhat-based' else: logging.error('OS does not seem to be red hat or debian based') raise EnvironmentError('Cannot handle LSB package installation') # According to the host distro detection, we can install the packages # using the list previously assembled if distro_type == 'redhat-based': logging.info('Installing LSB RPM packages') package.install(dtk_manager_pkg) for lsb_rpm in lsb_pkg_list: package.install(lsb_rpm, nodeps=True) elif distro_type == 'debian-based': logging.info('Remember that you must have the following lsb' ' compliance packages installed:') logging.info('lsb-core lsb-cxx lsb-graphics lsb-desktop lsb-qt4' ' lsb-languages lsb-multimedia lsb-printing') logging.info('Converting and installing LSB packages') dtk_manager_dpkg = package.convert(dtk_manager_pkg, 'dpkg') package.install(dtk_manager_dpkg) for lsb_rpm in lsb_pkg_list: lsb_dpkg = package.convert(lsb_rpm, 'dpkg') package.install(lsb_dpkg, nodeps=True) self.packages_installed = True def link_lsb_libraries(self): if not self.libraries_linked: logging.info('Linking LSB libraries') libdir_key = 'libdir-%s' % self.arch os_libdir = self.config.get('lib', libdir_key) if not os_libdir: raise TypeError('Could not find OS lib dir from conf file') lib_key = 'lib-%s' % self.arch lib_list_raw = self.config.get('lib', lib_key) if not lib_list_raw: raise TypeError('Could not find library list from conf file') lib_list = eval(lib_list_raw) # Remove any previous ld-lsb*.so symbolic links lsb_libs = glob.glob('%s/ld-lsb*.so*' % os_libdir) for lib in lsb_libs: os.remove(lib) # Get the base library that we'll use to recreate the symbolic links system_lib = glob.glob('%s/ld-2*.so*' % os_libdir)[0] # Now just link the system lib that we just found to each one of the # needed LSB libraries that we provided on the conf file for lsb_lib in lib_list: # Get the library absolute path lsb_lib = os.path.join(os_libdir, lsb_lib) # Link the library system_lib -> lsb_lib os.symlink(system_lib, lsb_lib) self.libraries_linked = True def run_once(self, args = 'all'): self.install_lsb_packages() self.link_lsb_libraries() main_script_path = self.config.get('lsb', 'main_script_path') logfile = os.path.join(self.resultsdir, 'lsb.log') log_arg = '-r %s' % (logfile) args = args + ' ' + log_arg cmd = os.path.join(self.srcdir, main_script_path) + ' ' + args logging.info('Executing LSB main test script') utils.system(cmd)