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
-~----------~----~----~----~------~----~------~--~---