Source code for Bcfg2.Server.Plugins.Packages.Pac
""" Pacman backend for :mod:`Bcfg2.Server.Plugins.Packages` """
import tarfile
from Bcfg2.Server.Plugins.Packages.Collection import Collection
from Bcfg2.Server.Plugins.Packages.Source import Source
[docs]class PacCollection(Collection):
""" Handle collections of Pacman sources. This is a no-op object
that simply inherits from
:class:`Bcfg2.Server.Plugins.Packages.Collection.Collection`,
overrides nothing, and defers all operations to :class:`PacSource`
"""
def __init__(self, metadata, sources, cachepath, basepath, fam,
debug=False):
# we define an __init__ that just calls the parent __init__,
# so that we can set the docstring on __init__ to something
# different from the parent __init__ -- namely, the parent
# __init__ docstring, minus everything after ``.. -----``,
# which we use to delineate the actual docs from the
# .. autoattribute hacks we have to do to get private
# attributes included in sphinx 1.0 """
Collection.__init__(self, metadata, sources, cachepath, basepath, fam,
debug=debug)
__init__.__doc__ = Collection.__init__.__doc__.split(".. -----")[0]
[docs]class PacSource(Source):
""" Handle Pacman sources """
#: :ref:`server-plugins-generators-packages-magic-groups` for
#: ``PacSource`` are "arch" and "parabola"
basegroups = ['arch', 'parabola']
#: PacSource sets the ``type`` on Package entries to "pacman"
ptype = 'pacman'
@property
[docs] def urls(self):
""" A list of URLs to the base metadata file for each
repository described by this source. """
if not self.rawurl:
rv = []
for part in self.components:
for arch in self.arches:
rv.append("%s%s/os/%s/%s.db.tar.gz" %
(self.url, part, arch, part))
return rv
else:
raise Exception("PacSource : RAWUrl not supported (yet)")
[docs] def read_files(self):
bdeps = dict()
bprov = dict()
depfnames = ['Depends', 'Pre-Depends']
if self.recommended:
depfnames.append('Recommends')
for fname in self.files:
if not self.rawurl:
barch = [x for x in fname.split('@') if x in self.arches][0]
else:
# RawURL entries assume that they only have one <Arch></Arch>
# element and that it is the architecture of the source.
barch = self.arches[0]
if barch not in bdeps:
bdeps[barch] = dict()
bprov[barch] = dict()
try:
self.debug_log("Packages: try to read %s" % fname)
tar = tarfile.open(fname, "r")
except:
self.logger.error("Packages: Failed to read file %s" % fname)
raise
for tarinfo in tar:
if tarinfo.isdir():
self.pkgnames.add(tarinfo.name.rsplit("-", 2)[0])
self.debug_log("Packages: added %s" %
tarinfo.name.rsplit("-", 2)[0])
tar.close()
self.process_files(bdeps, bprov)
read_files.__doc__ = Source.read_files.__doc__