| 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()
|
|
|