diff options
author | Narayan Desai <desai@mcs.anl.gov> | 2006-10-06 21:06:16 +0000 |
---|---|---|
committer | Narayan Desai <desai@mcs.anl.gov> | 2006-10-06 21:06:16 +0000 |
commit | 7beb2f08d8dab26d9fe34235c91c1b2a7a2794bd (patch) | |
tree | 92510fa0a9bb4de4c589b8a2f406aa097e0ab3d2 /src/lib/Client/Tools/RPM.py | |
parent | 53a983ba616d1c2292e1f4117084f85a1db9454f (diff) | |
download | bcfg2-7beb2f08d8dab26d9fe34235c91c1b2a7a2794bd.tar.gz bcfg2-7beb2f08d8dab26d9fe34235c91c1b2a7a2794bd.tar.bz2 bcfg2-7beb2f08d8dab26d9fe34235c91c1b2a7a2794bd.zip |
Merge of the client/refactor branch (revisions r2218-r2400)
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@2401 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/Client/Tools/RPM.py')
-rw-r--r-- | src/lib/Client/Tools/RPM.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/lib/Client/Tools/RPM.py b/src/lib/Client/Tools/RPM.py new file mode 100644 index 000000000..661c0a167 --- /dev/null +++ b/src/lib/Client/Tools/RPM.py @@ -0,0 +1,82 @@ +'''Bcfg2 Support for RPMS''' + +__revision__ = '$Revision$' + +import Bcfg2.Client.Tools, time + +class RPM(Bcfg2.Client.Tools.PkgTool): + '''Support for RPM packages''' + __name__ = 'RPM' + __execs__ = ['/bin/rpm'] + __handles__ = [('Package', 'rpm')] + __req__ = {'Package': ['name', 'version', 'url']} + pkgtype = 'rpm' + pkgtool = ("rpm --oldpackage --replacepkgs --quiet -U %s", ("%s", ["url"])) + + def RefreshPackages(self, level=0): + '''Cache package states''' + self.installed = {} + if level > 5: + return + for line in self.cmd.run("rpm -qa --qf '%{NAME} %{VERSION}-%{RELEASE}\n'")[1]: + try: + (name, version) = line.split() + self.installed[name] = version + except ValueError: + self.logger.error("Failed to access RPM db; retrying after 30s") + time.sleep(30) + return self.RefreshPackages(level + 1) + + def VerifyPackage(self, entry, modlist): + '''Verify Package status for entry''' + if not entry.get('version'): + self.logger.error("Can't install package %s, not enough data." % (entry.get('name'))) + return False + rpm_options = [] + if entry.get('verify', 'false') == 'nomtime': + self.logger.debug("Skipping mtime verification for package %s" % (entry.get('name'))) + rpm_options.append("--nomtime") + if self.installed.has_key(entry.get('name')): + if entry.get('version') == self.installed[entry.get('name')]: + if entry.get('multiarch'): + archs = entry.get('multiarch').split() + info = self.cmd.run('rpm -q %s --qf "%%{NAME} %%{VERSION}-%%{RELEASE} %%{ARCH}\n"' % (entry.get('name')))[1] + while info: + arch = info.pop().split()[2] + if arch in archs: + archs.remove(arch) + else: + self.logger.error("Got pkg install for Package %s: arch %s" % (entry.get('name'), arch)) + return False + if archs: + self.logger.error("Package %s not installed for arch: %s" % (entry.get('name'), archs)) + return False + if (self.setup['quick'] or (entry.get('verify', 'true') == 'false')) or entry.get('multiarch'): + if entry.get('verify', 'true') == 'false': + self.logger.debug("Skipping checksum verification for package %s" % (entry.get('name'))) + return True + else: + self.logger.debug("Package %s: wrong version installed. want %s have %s" % + (entry.get('name'), entry.get('version'), self.installed[entry.get('name')])) + entry.set('current_version', self.installed[entry.get('name')]) + return False + else: + self.logger.debug("Package %s: not installed" % (entry.get('name'))) + entry.set('current_exists', 'false') + return False + + (vstat, output) = self.cmd.run("rpm --verify -q %s %s-%s" % (" ".join(rpm_options), entry.get('name'), entry.get('version'))) + if vstat != 0: + if [name for name in output if name.split()[-1] not in modlist]: + self.logger.debug("Package %s content verification failed" % entry.get('name')) + return False + return True + + def RemovePackages(self, entries): + '''Remove specified entries''' + pkgnames = " ".join([entry[2] for entry in entries]) + if len(pkgnames) > 0: + self.logger.info("Removing packages: %s" % pkgnames) + self.cmd.run("rpm --quiet -e --allmatches %s" % " ".join(pkgnames)) + self.RefreshPackages() + self.extra = self.FindExtraPackages() |