1 import os, glob, re, logging 2 from autotest_lib.client.bin import test, utils, package 3 from autotest_lib.client.bin.test_config import config_loader 4 from autotest_lib.client.common_lib import error 5 6 class lsb_dtk(test.test): 7 """ 8 This autotest module runs the LSB test suite. 9 10 @copyright: IBM 2008 11 @author: Pavan Naregundi (pnaregun (at] in.ibm.com) 12 @author: Lucas Meneghel Rodrigues (lucasmr (at] br.ibm.com) 13 """ 14 version = 1 15 def initialize(self, config): 16 arch = utils.get_current_kernel_arch() 17 if arch in ['i386', 'i486', 'i586', 'i686', 'athlon']: 18 self.arch = 'ia32' 19 elif arch == 'ppc': 20 self.arch = 'ppc32' 21 elif arch in ['s390', 's390x', 'ia64', 'x86_64', 'ppc64']: 22 self.arch = arch 23 else: 24 e_msg = 'Architecture %s not supported by LSB' % arch 25 raise error.TestError(e_msg) 26 27 self.config = config_loader(config, self.tmpdir) 28 self.cachedir = os.path.join(self.bindir, 'cache') 29 if not os.path.isdir(self.cachedir): 30 os.makedirs(self.cachedir) 31 32 self.packages_installed = False 33 self.libraries_linked = False 34 35 36 37 def install_lsb_packages(self): 38 if not self.packages_installed: 39 # First, we download the LSB DTK manager package, worry about 40 # installing it later 41 dtk_manager_arch = self.config.get('dtk-manager', 'arch-%s' % self.arch) 42 dtk_manager_url = self.config.get('dtk-manager', 43 'tarball_url') % dtk_manager_arch 44 if not dtk_manager_url: 45 raise error.TestError('Could not get DTK manager URL from' 46 ' configuration file') 47 48 dtk_md5 = self.config.get('dtk-manager', 'md5-%s' % self.arch) 49 if dtk_md5: 50 logging.info('Caching LSB DTK manager RPM') 51 dtk_manager_pkg = utils.unmap_url_cache(self.cachedir, 52 dtk_manager_url, 53 dtk_md5) 54 else: 55 raise error.TestError('Could not find DTK manager package md5,' 56 ' cannot cache DTK manager tarball') 57 58 # Get LSB tarball, cache it and uncompress under autotest srcdir 59 if self.config.get('lsb', 'override_default_url') == 'no': 60 lsb_url = self.config.get('lsb', 'tarball_url') % self.arch 61 else: 62 lsb_url = self.config.get('lsb', 'tarball_url_alt') % self.arch 63 if not lsb_url: 64 raise error.TestError('Could not get LSB URL from configuration' 65 ' file') 66 md5_key = 'md5-%s' % self.arch 67 lsb_md5 = self.config.get('lsb', md5_key) 68 if lsb_md5: 69 logging.info('Caching LSB tarball') 70 lsb_pkg = utils.unmap_url_cache(self.cachedir, lsb_url, lsb_md5) 71 else: 72 raise error.TestError('Could not find LSB package md5, cannot' 73 ' cache LSB tarball') 74 75 utils.extract_tarball_to_dir(lsb_pkg, self.srcdir) 76 77 # Lets load a file that contains the list of RPMs 78 os.chdir(self.srcdir) 79 if not os.path.isfile('inst-config'): 80 raise IOError('Could not find file with package info,' 81 ' inst-config') 82 rpm_file_list = open('inst-config', 'r') 83 pkg_pattern = re.compile('[A-Za-z0-9_.-]*[.][r][p][m]') 84 lsb_pkg_list = [] 85 for line in rpm_file_list.readlines(): 86 try: 87 # We will install lsb-dtk-manager separately, so we can remove 88 # it from the list of packages 89 if not 'lsb-dtk-manager' in line: 90 line = re.findall(pkg_pattern, line)[0] 91 lsb_pkg_list.append(line) 92 except: 93 # If we don't get a match, no problem 94 pass 95 96 # Lets figure out the host distro 97 distro_pkg_support = package.os_support() 98 if os.path.isfile('/etc/debian_version') and \ 99 distro_pkg_support['dpkg']: 100 logging.debug('Debian based distro detected') 101 if distro_pkg_support['conversion']: 102 logging.debug('Package conversion supported') 103 distro_type = 'debian-based' 104 else: 105 raise EnvironmentError('Package conversion not supported.' 106 'Cannot handle LSB package' 107 ' installation') 108 elif distro_pkg_support['rpm']: 109 logging.debug('Red Hat based distro detected') 110 distro_type = 'redhat-based' 111 else: 112 logging.error('OS does not seem to be red hat or debian based') 113 raise EnvironmentError('Cannot handle LSB package installation') 114 115 # According to the host distro detection, we can install the packages 116 # using the list previously assembled 117 if distro_type == 'redhat-based': 118 logging.info('Installing LSB RPM packages') 119 package.install(dtk_manager_pkg) 120 for lsb_rpm in lsb_pkg_list: 121 package.install(lsb_rpm, nodeps=True) 122 elif distro_type == 'debian-based': 123 logging.info('Remember that you must have the following lsb' 124 ' compliance packages installed:') 125 logging.info('lsb-core lsb-cxx lsb-graphics lsb-desktop lsb-qt4' 126 ' lsb-languages lsb-multimedia lsb-printing') 127 logging.info('Converting and installing LSB packages') 128 dtk_manager_dpkg = package.convert(dtk_manager_pkg, 'dpkg') 129 package.install(dtk_manager_dpkg) 130 for lsb_rpm in lsb_pkg_list: 131 lsb_dpkg = package.convert(lsb_rpm, 'dpkg') 132 package.install(lsb_dpkg, nodeps=True) 133 134 self.packages_installed = True 135 136 137 def link_lsb_libraries(self): 138 if not self.libraries_linked: 139 logging.info('Linking LSB libraries') 140 libdir_key = 'libdir-%s' % self.arch 141 os_libdir = self.config.get('lib', libdir_key) 142 if not os_libdir: 143 raise TypeError('Could not find OS lib dir from conf file') 144 lib_key = 'lib-%s' % self.arch 145 lib_list_raw = self.config.get('lib', lib_key) 146 if not lib_list_raw: 147 raise TypeError('Could not find library list from conf file') 148 lib_list = eval(lib_list_raw) 149 150 # Remove any previous ld-lsb*.so symbolic links 151 lsb_libs = glob.glob('%s/ld-lsb*.so*' % os_libdir) 152 for lib in lsb_libs: 153 os.remove(lib) 154 155 # Get the base library that we'll use to recreate the symbolic links 156 system_lib = glob.glob('%s/ld-2*.so*' % os_libdir)[0] 157 158 # Now just link the system lib that we just found to each one of the 159 # needed LSB libraries that we provided on the conf file 160 for lsb_lib in lib_list: 161 # Get the library absolute path 162 lsb_lib = os.path.join(os_libdir, lsb_lib) 163 # Link the library system_lib -> lsb_lib 164 os.symlink(system_lib, lsb_lib) 165 166 self.libraries_linked = True 167 168 169 def run_once(self, args = 'all'): 170 self.install_lsb_packages() 171 self.link_lsb_libraries() 172 173 main_script_path = self.config.get('lsb', 'main_script_path') 174 175 logfile = os.path.join(self.resultsdir, 'lsb.log') 176 log_arg = '-r %s' % (logfile) 177 args = args + ' ' + log_arg 178 cmd = os.path.join(self.srcdir, main_script_path) + ' ' + args 179 180 logging.info('Executing LSB main test script') 181 utils.system(cmd) 182