summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2004-10-30 15:07:47 +0000
committerNarayan Desai <desai@mcs.anl.gov>2004-10-30 15:07:47 +0000
commit80c7e4d568ceefa6abb1d646e0ec84e8d67cbabf (patch)
treed6a1fc559432e6f296a2aea13e9055ac4a86f1e8
parent0d20cbba52aaa71510fb5724863f9ea778e0f96d (diff)
downloadbcfg2-80c7e4d568ceefa6abb1d646e0ec84e8d67cbabf.tar.gz
bcfg2-80c7e4d568ceefa6abb1d646e0ec84e8d67cbabf.tar.bz2
bcfg2-80c7e4d568ceefa6abb1d646e0ec84e8d67cbabf.zip
update internal name
2004/10/30 10:04:04-05:00 anl.gov!desai Change mode to -rw-r--r-- 2004/10/30 10:02:53-05:00 anl.gov!desai switch to constructure 2004/10/30 10:02:18-05:00 anl.gov!desai rename 2004/10/30 10:01:50-05:00 anl.gov!desai Rename: src/lib/Server/Generators/Pkgmgr -> src/lib/Server/Generators/Pkgmgr.py (Logical change 1.136) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@611 ce84e21b-d406-0410-9b95-82705330c041
-rw-r--r--src/lib/Server/Generators/Pkgmgr.py59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/lib/Server/Generators/Pkgmgr.py b/src/lib/Server/Generators/Pkgmgr.py
index e69de29bb..d8165bcea 100644
--- a/src/lib/Server/Generators/Pkgmgr.py
+++ b/src/lib/Server/Generators/Pkgmgr.py
@@ -0,0 +1,59 @@
+'''This module implements a package management scheme for all images'''
+__revision__ = '$Revision$'
+
+from re import compile as regcompile
+
+from Bcfg2.Server.Generator import Generator, DirectoryBacked, XMLFileBacked
+
+class PackageEntry(XMLFileBacked):
+ '''PackageEntry is a set of packages and locations for a single image'''
+ __identifier__ = 'image'
+ rpm = regcompile('^(?P<name>[\w\+\d\.]+(-[\w\+\d\.]+)*)-(?P<version>[\w\d\.]+-([\w\d\.]+))\.(?P<arch>\w+)\.rpm$')
+
+ def Index(self):
+ XMLFileBacked.Index(self)
+ self.packages = {}
+ for location in self.entries:
+ for pkg in location.getchildren():
+ if pkg.attrib.has_key("file"):
+ m = self.rpm.match(pkg.get('file'))
+ if not m:
+ print "failed to rpm match %s" % (pkg.get('file'))
+ continue
+ self.packages[m.group('name')] = m.groupdict()
+ self.packages[m.group('name')]['file'] = pkg.attrib['file']
+ self.packages[m.group('name')]['uri'] = location.attrib['uri']
+ self.packages[m.group('name')]['type'] = 'rpm'
+ else:
+ self.packages[pkg.get('name')] = pkg.attrib
+
+class PackageDir(DirectoryBacked):
+ __child__ = PackageEntry
+
+class Pkgmgr(Generator):
+ '''This is a generator that handles package assignments'''
+ __name__ = 'Pkgmgr'
+ __version__ = '$Id$'
+ __author__ = 'bcfg-dev@mcs.anl.gov'
+
+ def __init__(self, core, datastore):
+ Generator.__init__(self, core, datastore)
+ self.pkgdir = PackageDir(self.data, self.core.fam)
+
+ def FindHandler(self, entry):
+ if entry.tag != 'Package':
+ raise KeyError, (entry.tag, entry.get('name'))
+ return self.LocatePackage
+
+ def LocatePackage(self, entry, metadata):
+ '''Locates a package entry for particular metadata'''
+ pkgname = entry.get('name')
+ pl = self.pkgdir["%s.xml" % (metadata.image)]
+ if pl.packages.has_key(pkgname):
+ p = pl.packages[pkgname]
+ if p.get('type', None) == 'rpm':
+ entry.attrib.update({'url':"%s/%s" % (p['uri'], p['file']), 'version':p['version']})
+ else:
+ entry.attrib.update(p)
+ else:
+ raise KeyError, ("Package", pkgname)