diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2014-04-23 01:35:00 +0200 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2014-05-15 16:43:53 +0200 |
commit | 4ce9913ec3c298e77e5c7d385cd60fbda1987977 (patch) | |
tree | 483471f59d9dfe477d9662f8f1fda177c7294e94 | |
parent | 0bf4320f3a8e98b07a664768ba7ea464b9a0aeea (diff) | |
download | bcfg2-4ce9913ec3c298e77e5c7d385cd60fbda1987977.tar.gz bcfg2-4ce9913ec3c298e77e5c7d385cd60fbda1987977.tar.bz2 bcfg2-4ce9913ec3c298e77e5c7d385cd60fbda1987977.zip |
Packages/Pkgng: add new pkgng packages plugin
-rw-r--r-- | schemas/packages.xsd | 1 | ||||
-rw-r--r-- | src/lib/Bcfg2/Server/Plugins/Packages/Pkgng.py | 85 |
2 files changed, 86 insertions, 0 deletions
diff --git a/schemas/packages.xsd b/schemas/packages.xsd index e4724fabe..ed1c973aa 100644 --- a/schemas/packages.xsd +++ b/schemas/packages.xsd @@ -16,6 +16,7 @@ <xsd:enumeration value="pac"/> <xsd:enumeration value="portage"/> <xsd:enumeration value="layman"/> + <xsd:enumeration value="pkgng"/> </xsd:restriction> </xsd:simpleType> diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/Pkgng.py b/src/lib/Bcfg2/Server/Plugins/Packages/Pkgng.py new file mode 100644 index 000000000..4fd83afe7 --- /dev/null +++ b/src/lib/Bcfg2/Server/Plugins/Packages/Pkgng.py @@ -0,0 +1,85 @@ +""" pkgng backend for :mod:`Bcfg2.Server.Plugins.Packages` """ + +import re +import lzma +import tarfile +import json +from Bcfg2.Server.Plugins.Packages.Collection import Collection +from Bcfg2.Server.Plugins.Packages.Source import Source + + +class PkgngCollection(Collection): + """ Handle collections of pkgng 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] + + +class PkgngSource(Source): + """ Handle pkgng sources """ + + #: :ref:`server-plugins-generators-packages-magic-groups` for + #: ``PkgngSource`` are "pkgng", "freebsd" + basegroups = ['pkgng', 'freebsd'] + + #: PkgngSource sets the ``type`` on Package entries to "pkgng" + ptype = 'pkgng' + + @property + 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/freebsd:%s:%s/%s/packagesite.txz" % + (self.url, self.version, arch, part)) + return rv + else: + return ["%s/packagesite.txz" % self.rawurl] + + def read_files(self): + bdeps = dict() + for fname in self.files: + if not self.rawurl: + abi = [x + for x in fname.split('@') + if x.startswith('freebsd:')][0][8:] + barch = ':'.join(abi.split(':')[1:]) + 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() + try: + tar = tarfile.open(fileobj=lzma.LZMAFile(fname)) + reader = tar.extractfile('packagesite.yaml') + except: + self.logger.error("Packages: Failed to read file %s" % fname) + raise + for line in reader.readlines(): + if not isinstance(line, str): + line = line.decode('utf-8') + pkg = json.loads(line) + pkgname = pkg['name'] + self.pkgnames.add(pkgname) + if 'deps' in pkg: + bdeps[barch][pkgname] = pkg['deps'].keys() + self.process_files(bdeps, dict()) + read_files.__doc__ = Source.read_files.__doc__ |