Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Unified Diff: client/common_lib/software_manager.py

Issue 6124004: Revert "Merge remote branch 'cros/upstream' into autotest-rebase" (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/autotest.git@master
Patch Set: Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « client/common_lib/magic.py ('k') | client/common_lib/utils.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: client/common_lib/software_manager.py
diff --git a/client/common_lib/software_manager.py b/client/common_lib/software_manager.py
deleted file mode 100755
index f67f66741ac527737b4b4ff5dbd6203a0b4da04c..0000000000000000000000000000000000000000
--- a/client/common_lib/software_manager.py
+++ /dev/null
@@ -1,788 +0,0 @@
-#!/usr/bin/python
-"""
-Software package management library.
-
-This is an abstraction layer on top of the existing distributions high level
-package managers. It supports package operations useful for testing purposes,
-and multiple high level package managers (here called backends). If you want
-to make this lib to support your particular package manager/distro, please
-implement the given backend class.
-
-@author: Higor Vieira Alves (halves@br.ibm.com)
-@author: Lucas Meneghel Rodrigues (lmr@redhat.com)
-@author: Ramon de Carvalho Valle (rcvalle@br.ibm.com)
-
-@copyright: IBM 2008-2009
-@copyright: Red Hat 2009-2010
-"""
-import os, re, logging, ConfigParser, optparse, random, string
-try:
- import yum
-except:
- pass
-import common
-from autotest_lib.client.bin import os_dep, utils
-from autotest_lib.client.common_lib import error
-from autotest_lib.client.common_lib import logging_config, logging_manager
-
-
-def generate_random_string(length):
- """
- Return a random string using alphanumeric characters.
-
- @length: Length of the string that will be generated.
- """
- r = random.SystemRandom()
- str = ""
- chars = string.letters + string.digits
- while length > 0:
- str += r.choice(chars)
- length -= 1
- return str
-
-
-class SoftwareManagerLoggingConfig(logging_config.LoggingConfig):
- """
- Used with the sole purpose of providing convenient logging setup
- for the KVM test auxiliary programs.
- """
- def configure_logging(self, results_dir=None, verbose=False):
- super(SoftwareManagerLoggingConfig, self).configure_logging(
- use_console=True,
- verbose=verbose)
-
-
-class SystemInspector(object):
- """
- System inspector class.
-
- This may grow up to include more complete reports of operating system and
- machine properties.
- """
- def __init__(self):
- """
- Probe system, and save information for future reference.
- """
- self.distro = utils.get_os_vendor()
- self.high_level_pms = ['apt-get', 'yum', 'zypper']
-
-
- def get_package_management(self):
- """
- Determine the supported package management systems present on the
- system. If more than one package management system installed, try
- to find the best supported system.
- """
- list_supported = []
- for high_level_pm in self.high_level_pms:
- try:
- os_dep.command(high_level_pm)
- list_supported.append(high_level_pm)
- except:
- pass
-
- pm_supported = None
- if len(list_supported) == 0:
- pm_supported = None
- if len(list_supported) == 1:
- pm_supported = list_supported[0]
- elif len(list_supported) > 1:
- if 'apt-get' in list_supported and self.distro in ['Debian', 'Ubuntu']:
- pm_supported = 'apt-get'
- elif 'yum' in list_supported and self.distro == 'Fedora':
- pm_supported = 'yum'
- else:
- pm_supported = list_supported[0]
-
- logging.debug('Package Manager backend: %s' % pm_supported)
- return pm_supported
-
-
-class SoftwareManager(object):
- """
- Package management abstraction layer.
-
- It supports a set of common package operations for testing purposes, and it
- uses the concept of a backend, a helper class that implements the set of
- operations of a given package management tool.
- """
- def __init__(self):
- """
- Class constructor.
-
- Determines the best supported package management system for the given
- operating system running and initializes the appropriate backend.
- """
- inspector = SystemInspector()
- backend_type = inspector.get_package_management()
- if backend_type == 'yum':
- self.backend = YumBackend()
- elif backend_type == 'zypper':
- self.backend = ZypperBackend()
- elif backend_type == 'apt-get':
- self.backend = AptBackend()
- else:
- raise NotImplementedError('Unimplemented package management '
- 'system: %s.' % backend_type)
-
-
- def check_installed(self, name, version=None, arch=None):
- """
- Check whether a package is installed on this system.
-
- @param name: Package name.
- @param version: Package version.
- @param arch: Package architecture.
- """
- return self.backend.check_installed(name, version, arch)
-
-
- def list_all(self):
- """
- List all installed packages.
- """
- return self.backend.list_all()
-
-
- def list_files(self, name):
- """
- Get a list of all files installed by package [name].
-
- @param name: Package name.
- """
- return self.backend.list_files(name)
-
-
- def install(self, name):
- """
- Install package [name].
-
- @param name: Package name.
- """
- return self.backend.install(name)
-
-
- def remove(self, name):
- """
- Remove package [name].
-
- @param name: Package name.
- """
- return self.backend.remove(name)
-
-
- def add_repo(self, url):
- """
- Add package repo described by [url].
-
- @param name: URL of the package repo.
- """
- return self.backend.add_repo(url)
-
-
- def remove_repo(self, url):
- """
- Remove package repo described by [url].
-
- @param url: URL of the package repo.
- """
- return self.backend.remove_repo(url)
-
-
- def upgrade(self):
- """
- Upgrade all packages available.
- """
- return self.backend.upgrade()
-
-
- def provides(self, file):
- """
- Returns a list of packages that provides a given capability to the
- system (be it a binary, a library).
-
- @param file: Path to the file.
- """
- return self.backend.provides(file)
-
-
- def install_what_provides(self, file):
- """
- Installs package that provides [file].
-
- @param file: Path to file.
- """
- provides = self.provides(file)
- if provides is not None:
- self.install(provides)
- else:
- logging.warning('No package seems to provide %s', file)
-
-
-class RpmBackend(object):
- """
- This class implements operations executed with the rpm package manager.
-
- rpm is a lower level package manager, used by higher level managers such
- as yum and zypper.
- """
- def __init__(self):
- self.lowlevel_base_cmd = os_dep.command('rpm')
-
-
- def _check_installed_version(self, name, version):
- """
- Helper for the check_installed public method.
-
- @param name: Package name.
- @param version: Package version.
- """
- cmd = (self.lowlevel_base_cmd + ' -q --qf %{VERSION} ' + name +
- ' 2> /dev/null')
- inst_version = utils.system_output(cmd)
-
- if inst_version >= version:
- return True
- else:
- return False
-
-
- def check_installed(self, name, version=None, arch=None):
- """
- Check if package [name] is installed.
-
- @param name: Package name.
- @param version: Package version.
- @param arch: Package architecture.
- """
- if arch:
- cmd = (self.lowlevel_base_cmd + ' -q --qf %{ARCH} ' + name +
- ' 2> /dev/null')
- inst_archs = utils.system_output(cmd)
- inst_archs = inst_archs.split('\n')
-
- for inst_arch in inst_archs:
- if inst_arch == arch:
- return self._check_installed_version(name, version)
- return False
-
- elif version:
- return self._check_installed_version(name, version)
- else:
- cmd = 'rpm -q ' + name + ' 2> /dev/null'
- return (os.system(cmd) == 0)
-
-
- def list_all(self):
- """
- List all installed packages.
- """
- installed_packages = utils.system_output('rpm -qa').splitlines()
- return installed_packages
-
-
- def list_files(self, name):
- """
- List files installed on the system by package [name].
-
- @param name: Package name.
- """
- path = os.path.abspath(name)
- if os.path.isfile(path):
- option = '-qlp'
- name = path
- else:
- option = '-ql'
-
- l_cmd = 'rpm' + ' ' + option + ' ' + name + ' 2> /dev/null'
-
- try:
- result = utils.system_output(l_cmd)
- list_files = result.split('\n')
- return list_files
- except error.CmdError:
- return []
-
-
-class DpkgBackend(object):
- """
- This class implements operations executed with the dpkg package manager.
-
- dpkg is a lower level package manager, used by higher level managers such
- as apt and aptitude.
- """
- def __init__(self):
- self.lowlevel_base_cmd = os_dep.command('dpkg')
-
-
- def check_installed(self, name):
- if os.path.isfile(name):
- n_cmd = (self.lowlevel_base_cmd + ' -f ' + name +
- ' Package 2>/dev/null')
- name = utils.system_output(n_cmd)
- i_cmd = self.lowlevel_base_cmd + ' -s ' + name + ' 2>/dev/null'
- # Checking if package is installed
- package_status = utils.system_output(i_cmd, ignore_status=True)
- not_inst_pattern = re.compile('not-installed', re.IGNORECASE)
- dpkg_not_installed = re.search(not_inst_pattern, package_status)
- if dpkg_not_installed:
- return False
- return True
-
-
- def list_all(self):
- """
- List all packages available in the system.
- """
- installed_packages = []
- raw_list = utils.system_output('dpkg -l').splitlines()[5:]
- for line in raw_list:
- parts = line.split()
- if parts[0] == "ii": # only grab "installed" packages
- installed_packages.append("%s-%s" % (parts[1], parts[2]))
-
-
- def list_files(self, package):
- """
- List files installed by package [package].
-
- @param package: Package name.
- @return: List of paths installed by package.
- """
- if os.path.isfile(package):
- l_cmd = self.lowlevel_base_cmd + ' -c ' + package
- else:
- l_cmd = self.lowlevel_base_cmd + ' -l ' + package
- return utils.system_output(l_cmd).split('\n')
-
-
-class YumBackend(RpmBackend):
- """
- Implements the yum backend for software manager.
-
- Set of operations for the yum package manager, commonly found on Yellow Dog
- Linux and Red Hat based distributions, such as Fedora and Red Hat
- Enterprise Linux.
- """
- def __init__(self):
- """
- Initializes the base command and the yum package repository.
- """
- super(YumBackend, self).__init__()
- executable = os_dep.command('yum')
- base_arguments = '-y'
- self.base_command = executable + ' ' + base_arguments
- self.repo_file_path = '/etc/yum.repos.d/autotest.repo'
- self.cfgparser = ConfigParser.ConfigParser()
- self.cfgparser.read(self.repo_file_path)
- y_cmd = executable + ' --version | head -1'
- self.yum_version = utils.system_output(y_cmd, ignore_status=True)
- logging.debug('Yum backend initialized')
- logging.debug('Yum version: %s' % self.yum_version)
- self.yum_base = yum.YumBase()
-
-
- def _cleanup(self):
- """
- Clean up the yum cache so new package information can be downloaded.
- """
- utils.system("yum clean all")
-
-
- def install(self, name):
- """
- Installs package [name]. Handles local installs.
- """
- if os.path.isfile(name):
- name = os.path.abspath(name)
- command = 'localinstall'
- else:
- command = 'install'
-
- i_cmd = self.base_command + ' ' + command + ' ' + name
-
- try:
- utils.system(i_cmd)
- return True
- except:
- return False
-
-
- def remove(self, name):
- """
- Removes package [name].
-
- @param name: Package name (eg. 'ipython').
- """
- r_cmd = self.base_command + ' ' + 'erase' + ' ' + name
- try:
- utils.system(r_cmd)
- return True
- except:
- return False
-
-
- def add_repo(self, url):
- """
- Adds package repository located on [url].
-
- @param url: Universal Resource Locator of the repository.
- """
- # Check if we URL is already set
- for section in self.cfgparser.sections():
- for option, value in self.cfgparser.items(section):
- if option == 'url' and value == url:
- return True
-
- # Didn't find it, let's set it up
- while True:
- section_name = 'software_manager' + '_' + generate_random_string(4)
- if not self.cfgparser.has_section(section_name):
- break
- self.cfgparser.add_section(section_name)
- self.cfgparser.set(section_name, 'name',
- 'Repository added by the autotest software manager.')
- self.cfgparser.set(section_name, 'url', url)
- self.cfgparser.set(section_name, 'enabled', 1)
- self.cfgparser.set(section_name, 'gpgcheck', 0)
- self.cfgparser.write(self.repo_file_path)
-
-
- def remove_repo(self, url):
- """
- Removes package repository located on [url].
-
- @param url: Universal Resource Locator of the repository.
- """
- for section in self.cfgparser.sections():
- for option, value in self.cfgparser.items(section):
- if option == 'url' and value == url:
- self.cfgparser.remove_section(section)
- self.cfgparser.write(self.repo_file_path)
-
-
- def upgrade(self):
- """
- Upgrade all available packages.
- """
- r_cmd = self.base_command + ' ' + 'update'
- try:
- utils.system(r_cmd)
- return True
- except:
- return False
-
-
- def provides(self, name):
- """
- Returns a list of packages that provides a given capability.
-
- @param name: Capability name (eg, 'foo').
- """
- d_provides = self.yum_base.searchPackageProvides(args=[name])
- provides_list = [key for key in d_provides]
- if provides_list:
- logging.info("Package %s provides %s", provides_list[0], name)
- return str(provides_list[0])
- else:
- return None
-
-
-class ZypperBackend(RpmBackend):
- """
- Implements the zypper backend for software manager.
-
- Set of operations for the zypper package manager, found on SUSE Linux.
- """
- def __init__(self):
- """
- Initializes the base command and the yum package repository.
- """
- super(ZypperBackend, self).__init__()
- self.base_command = os_dep.command('zypper') + ' -n'
- z_cmd = self.base_command + ' --version'
- self.zypper_version = utils.system_output(z_cmd, ignore_status=True)
- logging.debug('Zypper backend initialized')
- logging.debug('Zypper version: %s' % self.zypper_version)
-
-
- def install(self, name):
- """
- Installs package [name]. Handles local installs.
-
- @param name: Package Name.
- """
- path = os.path.abspath(name)
- i_cmd = self.base_command + ' install -l ' + name
- try:
- utils.system(i_cmd)
- return True
- except:
- return False
-
-
- def add_repo(self, url):
- """
- Adds repository [url].
-
- @param url: URL for the package repository.
- """
- ar_cmd = self.base_command + ' addrepo ' + url
- try:
- utils.system(ar_cmd)
- return True
- except:
- return False
-
-
- def remove_repo(self, url):
- """
- Removes repository [url].
-
- @param url: URL for the package repository.
- """
- rr_cmd = self.base_command + ' removerepo ' + url
- try:
- utils.system(rr_cmd)
- return True
- except:
- return False
-
-
- def remove(self, name):
- """
- Removes package [name].
- """
- r_cmd = self.base_command + ' ' + 'erase' + ' ' + name
-
- try:
- utils.system(r_cmd)
- return True
- except:
- return False
-
-
- def upgrade(self):
- """
- Upgrades all packages of the system.
- """
- u_cmd = self.base_command + ' update -l'
-
- try:
- utils.system(u_cmd)
- return True
- except:
- return False
-
-
- def provides(self, name):
- """
- Searches for what provides a given file.
-
- @param name: File path.
- """
- p_cmd = self.base_command + ' what-provides ' + name
- list_provides = []
- try:
- p_output = utils.system_output(p_cmd).split('\n')[4:]
- for line in p_output:
- line = [a.strip() for a in line.split('|')]
- try:
- state, pname, type, version, arch, repository = line
- if pname not in list_provides:
- list_provides.append(pname)
- except IndexError:
- pass
- if len(list_provides) > 1:
- logging.warning('More than one package found, '
- 'opting by the first queue result')
- if list_provides:
- logging.info("Package %s provides %s", list_provides[0], name)
- return list_provides[0]
- return None
- except:
- return None
-
-
-class AptBackend(DpkgBackend):
- """
- Implements the apt backend for software manager.
-
- Set of operations for the apt package manager, commonly found on Debian and
- Debian based distributions, such as Ubuntu Linux.
- """
- def __init__(self):
- """
- Initializes the base command and the debian package repository.
- """
- super(AptBackend, self).__init__()
- executable = os_dep.command('apt-get')
- self.base_command = executable + ' -y'
- self.repo_file_path = '/etc/apt/sources.list.d/autotest'
- self.apt_version = utils.system_output('apt-get -v | head -1',
- ignore_status=True)
- logging.debug('Apt backend initialized')
- logging.debug('apt version: %s' % self.apt_version)
-
-
- def install(self, name):
- """
- Installs package [name].
-
- @param name: Package name.
- """
- command = 'install'
- i_cmd = self.base_command + ' ' + command + ' ' + name
-
- try:
- utils.system(i_cmd)
- return True
- except:
- return False
-
-
- def remove(self, name):
- """
- Remove package [name].
-
- @param name: Package name.
- """
- command = 'remove'
- flag = '--purge'
- r_cmd = self.base_command + ' ' + command + ' ' + flag + ' ' + name
-
- try:
- utils.system(r_cmd)
- return True
- except:
- return False
-
-
- def add_repo(self, repo):
- """
- Add an apt repository.
-
- @param repo: Repository string. Example:
- 'deb http://archive.ubuntu.com/ubuntu/ maverick universe'
- """
- repo_file = open(self.repo_file_path, 'a')
- repo_file_contents = repo_file.read()
- if repo not in repo_file_contents:
- repo_file.write(repo)
-
-
- def remove_repo(self, repo):
- """
- Remove an apt repository.
-
- @param repo: Repository string. Example:
- 'deb http://archive.ubuntu.com/ubuntu/ maverick universe'
- """
- repo_file = open(self.repo_file_path, 'r')
- new_file_contents = []
- for line in repo_file.readlines:
- if not line == repo:
- new_file_contents.append(line)
- repo_file.close()
- new_file_contents = "\n".join(new_file_contents)
- repo_file.open(self.repo_file_path, 'w')
- repo_file.write(new_file_contents)
- repo_file.close()
-
-
- def upgrade(self):
- """
- Upgrade all packages of the system with eventual new versions.
- """
- ud_command = 'update'
- ud_cmd = self.base_command + ' ' + ud_command
- try:
- utils.system(ud_cmd)
- except:
- logging.error("Apt package update failed")
- up_command = 'upgrade'
- up_cmd = self.base_command + ' ' + up_command
- try:
- utils.system(up_cmd)
- return True
- except:
- return False
-
-
- def provides(self, file):
- """
- Return a list of packages that provide [file].
-
- @param file: File path.
- """
- if not self.check_installed('apt-file'):
- self.install('apt-file')
- command = os_dep.command('apt-file')
- cache_update_cmd = command + ' update'
- try:
- utils.system(cache_update_cmd, ignore_status=True)
- except:
- logging.error("Apt file cache update failed")
- fu_cmd = command + ' search ' + file
- try:
- provides = utils.system_output(fu_cmd).split('\n')
- list_provides = []
- for line in provides:
- if line:
- try:
- line = line.split(':')
- package = line[0].strip()
- path = line[1].strip()
- if path == file and package not in list_provides:
- list_provides.append(package)
- except IndexError:
- pass
- if len(list_provides) > 1:
- logging.warning('More than one package found, '
- 'opting by the first queue result')
- if list_provides:
- logging.info("Package %s provides %s", list_provides[0], file)
- return list_provides[0]
- return None
- except:
- return None
-
-
-if __name__ == '__main__':
- parser = optparse.OptionParser(
- "usage: %prog [install|remove|list-all|list-files|add-repo|remove-repo|"
- "upgrade|what-provides|install-what-provides] arguments")
- parser.add_option('--verbose', dest="debug", action='store_true',
- help='include debug messages in console output')
-
- options, args = parser.parse_args()
- debug = options.debug
- logging_manager.configure_logging(SoftwareManagerLoggingConfig(),
- verbose=debug)
- software_manager = SoftwareManager()
- if args:
- action = args[0]
- args = " ".join(args[1:])
- else:
- action = 'show-help'
-
- if action == 'install':
- software_manager.install(args)
- elif action == 'remove':
- software_manager.remove(args)
- if action == 'list-all':
- software_manager.list_all()
- elif action == 'list-files':
- software_manager.list_files(args)
- elif action == 'add-repo':
- software_manager.add_repo(args)
- elif action == 'remove-repo':
- software_manager.remove_repo(args)
- elif action == 'upgrade':
- software_manager.upgrade()
- elif action == 'what-provides':
- software_manager.provides(args)
- elif action == 'install-what-provides':
- software_manager.install_what_provides(args)
- elif action == 'show-help':
- parser.print_help()
« no previous file with comments | « client/common_lib/magic.py ('k') | client/common_lib/utils.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698