Source code for fabtools.rpm
"""
RPM packages
============
This module provides tools to manage CentOS/RHEL/SL/Fedora packages
and repositories.
"""
from __future__ import with_statement
from fabric.api import hide, run, settings
from fabtools.utils import run_as_root
MANAGER = 'yum -y --color=never'
[docs]def update(kernel=False):
"""
Upgrade all packages, skip obsoletes if ``obsoletes=0`` in ``yum.conf``.
Exclude *kernel* upgrades by default.
"""
manager = MANAGER
cmds = {'yum -y --color=never': {False: '--exclude=kernel* update', True: 'update'}}
cmd = cmds[manager][kernel]
run_as_root("%(manager)s %(cmd)s" % locals())
[docs]def upgrade(kernel=False):
"""
Upgrade all packages, including obsoletes.
Exclude *kernel* upgrades by default.
"""
manager = MANAGER
cmds = {'yum -y --color=never': {False: '--exclude=kernel* upgrade', True: 'upgrade'}}
cmd = cmds[manager][kernel]
run_as_root("%(manager)s %(cmd)s" % locals())
[docs]def groupupdate(group, options=None):
"""
Update an existing software group, skip obsoletes if ``obsoletes=1`` in ``yum.conf``.
Extra *options* may be passed to ``yum`` if necessary.
"""
manager = MANAGER
if options is None:
options = []
elif isinstance(options, str):
options = [options]
options = " ".join(options)
run_as_root('%(manager)s %(options)s groupupdate "%(group)s"' % locals())
[docs]def is_installed(pkg_name):
"""
Check if a *package* is installed.
"""
manager = MANAGER
with settings(hide('running', 'stdout', 'stderr', 'warnings'), warn_only=True):
res = run("%(manager)s list installed %(pkg_name)s" % locals())
if res.succeeded:
return True
return False
[docs]def install(packages, repos=None, yes=None, options=None):
"""
Install one or more *packages*.
Extra *repos* may be passed to ``yum`` to enable extra repositories at install time.
Extra *yes* may be passed to ``yum`` to validate license if necessary.
Extra *options* may be passed to ``yum`` if necessary like:
['--nogpgcheck', '--exclude=package']
Example::
import fabtools
# Install a single package, in an alternative install root
fabtools.rpm.install('emacs', options='--installroot=/my/new/location')
# Install multiple packages silently
fabtools.rpm.install([
'unzip',
'nano'
], '--quiet')
"""
manager = MANAGER
if options is None:
options = []
elif isinstance(options, str):
options = [options]
if not isinstance(packages, basestring):
packages = " ".join(packages)
if repos:
for repo in repos:
options.append('--enablerepo=%(repo)s' % locals())
options = " ".join(options)
if isinstance(yes, str):
run_as_root('yes %(yes)s | %(manager)s %(options)s install %(packages)s' % locals())
else:
run_as_root('%(manager)s %(options)s install %(packages)s' % locals())
[docs]def groupinstall(group, options=None):
"""
Install a *group* of packages. Use ``yum grouplist`` to get the list of groups.
Extra *options* may be passed to ``yum`` if necessary like:
['--nogpgcheck', '--exclude=package']
Example::
import fabtools
# Install development packages
fabtools.rpm.groupinstall('Development tools')
"""
manager = MANAGER
if options is None:
options = []
elif isinstance(options, str):
options = [options]
options = " ".join(options)
run_as_root('%(manager)s %(options)s groupinstall "%(group)s"' % locals(), pty=False)
[docs]def uninstall(packages, options=None):
"""
Remove one or more *packages*.
Extra *options* may be passed to ``yum`` if necessary.
"""
manager = MANAGER
if options is None:
options = []
elif isinstance(options, str):
options = [options]
if not isinstance(packages, basestring):
packages = " ".join(packages)
options = " ".join(options)
run_as_root('%(manager)s %(options)s remove %(packages)s' % locals())
[docs]def groupuninstall(group, options=None):
"""
Remove an existing software group.
Extra *options* may be passed to ``yum`` if necessary.
"""
manager = MANAGER
if options is None:
options = []
elif isinstance(options, str):
options = [options]
options = " ".join(options)
run_as_root('%(manager)s %(options)s groupremove "%(group)s"' % locals())
[docs]def repolist(status='', media=None):
"""
Get the list of ``yum`` repositories. Returns enabled repositories by default.
Extra *status* may be passed to list disabled repositories if necessary.
Media and debug repositories are kept disabled, except if you pass *media*.
Example::
import fabtools
# Install a package that may be included in disabled repositories
fabtools.rpm.install('vim', fabtools.rpm.repolist('disabled'))
"""
manager = MANAGER
with settings(hide('running', 'stdout')):
if media:
repos = run_as_root("%(manager)s repolist %(status)s | sed '$d' | sed -n '/repo id/,$p'" % locals())
else:
repos = run_as_root("%(manager)s repolist %(status)s | sed '/Media\\|Debug/d' | sed '$d' | sed -n '/repo id/,$p'" % locals())
return map(lambda line: line.split(' ')[0], repos.splitlines()[1:])