Signed-off-by: Oliver Hookins <[EMAIL PROTECTED]>
---
 lib/puppet/provider/package/rpm.rb       |    9 +++-
 lib/puppet/provider/package/yumhelper.py |  102 ++++++++++++++++++++++++++---
 2 files changed, 99 insertions(+), 12 deletions(-)

diff --git a/lib/puppet/provider/package/rpm.rb 
b/lib/puppet/provider/package/rpm.rb
index a303da4..b5a5c5d 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 962b96c..d014e1e 100644
--- a/lib/puppet/provider/package/yumhelper.py
+++ b/lib/puppet/provider/package/yumhelper.py
@@ -4,8 +4,21 @@
 # (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
+
+# 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)
+try:
+    import yum
+except ImportError:
+    useyumlib = 0
+else:
+    useyumlib = 1
 
 OVERRIDE_OPTS = {
     'debuglevel': 0,
@@ -26,14 +39,81 @@ 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(). The high 8-bits are what we want.
+            # Exit code of 100 from yum represents updates available.
+            rc = rc >> 8
+            if rc != 100:
+                return 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("^( )?$").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)
-- 
1.5.4.3


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to