diff options
author | James Turnbull <james@lovedthanlost.net> | 2008-10-07 13:51:59 +1100 |
---|---|---|
committer | James Turnbull <james@lovedthanlost.net> | 2008-10-07 13:51:59 +1100 |
commit | 7275d7cb9083b4183f394a5d6798e1675def6d28 (patch) | |
tree | a92bd14cbd1233c9e9b2cc97150462b76a420dbb | |
parent | 0c297be5dad784e305ef194cee29b11a92d31b6b (diff) | |
download | puppet-7275d7cb9083b4183f394a5d6798e1675def6d28.tar.gz puppet-7275d7cb9083b4183f394a5d6798e1675def6d28.tar.xz puppet-7275d7cb9083b4183f394a5d6798e1675def6d28.zip |
Fxied #1354 - yum provider problems with RHEL 3
-rw-r--r-- | CHANGELOG | 8 | ||||
-rwxr-xr-x | lib/puppet/provider/package/rpm.rb | 9 | ||||
-rw-r--r-- | lib/puppet/provider/package/yumhelper.py | 103 |
3 files changed, 106 insertions, 14 deletions
@@ -1,4 +1,6 @@ 0.24.x + Fixed #1354 - yum provider problems with RHEL 3 + Fixed #381 - Allow Allow multiple overrides in one statement Fixing #947 - pluginsync no longer fails poorly when no plugins exist @@ -12,9 +14,11 @@ Fixing #1614 - Environments no longer have to be listed out - Fixed #1628 - Changed node search to use certname rather than Facter hostname + Fixed #1628 - Changed node search to use certname rather than Facter + hostname - Fixed #1613 - The client environment will be substituted when looking up settings. + Fixed #1613 - The client environment will be substituted when looking + up settings. Updated puppet binary documentation diff --git a/lib/puppet/provider/package/rpm.rb b/lib/puppet/provider/package/rpm.rb index a303da4e2..b5a5c5dbc 100755 --- a/lib/puppet/provider/package/rpm.rb +++ b/lib/puppet/provider/package/rpm.rb @@ -23,9 +23,16 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr def self.instances packages = [] + # rpm < 4.1 don't support --nosignature + output = rpm "--version" + sig = "--nosignature" + if output =~ /RPM version (([123].*)|(4\.0.*))/ + sig = "" + end + # list out all of the packages begin - execpipe("#{command(:rpm)} -qa --nosignature --nodigest --qf '#{NEVRAFORMAT}\n'") { |process| + execpipe("#{command(:rpm)} -qa #{sig} --nodigest --qf '#{NEVRAFORMAT}\n'") { |process| # now turn each returned line into a package object process.each { |line| hash = nevra_to_hash(line) diff --git a/lib/puppet/provider/package/yumhelper.py b/lib/puppet/provider/package/yumhelper.py index 962b96ce4..8eab0d081 100644 --- a/lib/puppet/provider/package/yumhelper.py +++ b/lib/puppet/provider/package/yumhelper.py @@ -4,8 +4,23 @@ # (C) 2007 Red Hat Inc. # David Lutterkort <dlutter @redhat.com> -import yum import sys +import string +import re + +# this maintains compatibility with really old platforms with python 1.x +from os import popen, WEXITSTATUS + +# Try to use the yum libraries by default, but shell out to the yum executable +# if they are not present (i.e. yum <= 2.0). This is only required for RHEL3 +# and earlier that do not support later versions of Yum. Once RHEL3 is EOL, +# shell_out() and related code can be removed. +try: + import yum +except ImportError: + useyumlib = 0 +else: + useyumlib = 1 OVERRIDE_OPTS = { 'debuglevel': 0, @@ -26,14 +41,80 @@ def pkg_lists(my): my.doRpmDBSetup() return my.doPackageLists('updates') -try: +def shell_out(): + try: + p = popen("/usr/bin/env yum check-update 2>&1") + output = p.readlines() + rc = p.close() + + if rc is not None: + # None represents exit code of 0, otherwise the exit code is in the + # format returned by wait(). Exit code of 100 from yum represents + # updates available. + if WEXITSTATUS(rc) != 100: + return WEXITSTATUS(rc) + else: + # Exit code is None (0), no updates waiting so don't both parsing output + return 0 + + # Yum prints a line of hyphens (old versions) or a blank line between + # headers and package data, so skip everything before them + skipheaders = 0 + for line in output: + if not skipheaders: + if re.compile("^((-){80}|)$").search(line): + skipheaders = 1 + continue + + # Skip any blank lines + if re.compile("^[ \t]*$").search(line): + continue + + # Format is: + # Yum 1.x: name arch (epoch:)?version + # Yum 2.0: name arch (epoch:)?version repo + # epoch is optional if 0 + + p = string.split(line) + pname = p[0] + parch = p[1] + pevr = p[2] + + # Separate out epoch:version-release + evr_re = re.compile("^(\d:)?(\S+)-(\S+)$") + evr = evr_re.match(pevr) + + pepoch = "" + if evr.group(1) is None: + pepoch = "0" + else: + pepoch = evr.group(1).replace(":", "") + pversion = evr.group(2) + prelease = evr.group(3) + + print "_pkg", pname, pepoch, pversion, prelease, parch + + return 0 + except: + print sys.exc_info()[0] + return 1 + +if useyumlib: try: - my = yum.YumBase() - ypl = pkg_lists(my) - for pkg in ypl.updates: - print "_pkg %s %s %s %s %s" % (pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch) - finally: - my.closeRpmDB() -except IOError, e: - print "_err IOError %d %s" % (e.errno, e) - sys.exit(1) + try: + my = yum.YumBase() + ypl = pkg_lists(my) + for pkg in ypl.updates: + print "_pkg %s %s %s %s %s" % (pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch) + finally: + my.closeRpmDB() + except IOError, e: + print "_err IOError %d %s" % (e.errno, e) + sys.exit(1) + except AttributeError, e: + # catch yumlib errors in buggy 2.x versions of yum + print "_err AttributeError %s" % e + sys.exit(1) +else: + rc = shell_out() + sys.exit(rc) |