[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, master, updated. debian/0.24.6-1-356-g5718585

James Turnbull james at lovedthanlost.net
Fri Jan 23 14:21:17 UTC 2009


The following commit has been merged in the master branch:
commit 7275d7cb9083b4183f394a5d6798e1675def6d28
Author: James Turnbull <james at lovedthanlost.net>
Date:   Tue Oct 7 13:51:59 2008 +1100

    Fxied #1354 - yum provider problems with RHEL 3

diff --git a/CHANGELOG b/CHANGELOG
index 66f40f6..be8e854 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 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..8eab0d0 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)

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list