summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Turnbull <james@lovedthanlost.net>2008-10-07 13:51:59 +1100
committerJames Turnbull <james@lovedthanlost.net>2008-10-07 13:51:59 +1100
commit7275d7cb9083b4183f394a5d6798e1675def6d28 (patch)
treea92bd14cbd1233c9e9b2cc97150462b76a420dbb
parent0c297be5dad784e305ef194cee29b11a92d31b6b (diff)
downloadpuppet-7275d7cb9083b4183f394a5d6798e1675def6d28.tar.gz
puppet-7275d7cb9083b4183f394a5d6798e1675def6d28.tar.xz
puppet-7275d7cb9083b4183f394a5d6798e1675def6d28.zip
Fxied #1354 - yum provider problems with RHEL 3
-rw-r--r--CHANGELOG8
-rwxr-xr-xlib/puppet/provider/package/rpm.rb9
-rw-r--r--lib/puppet/provider/package/yumhelper.py103
3 files changed, 106 insertions, 14 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 66f40f60e..be8e854eb 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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)