summaryrefslogtreecommitdiffstats
path: root/lib/puppet/provider/package
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/provider/package')
-rwxr-xr-xlib/puppet/provider/package/apt.rb35
-rwxr-xr-xlib/puppet/provider/package/blastwave.rb2
-rwxr-xr-xlib/puppet/provider/package/dpkg.rb82
-rwxr-xr-xlib/puppet/provider/package/fink.rb2
-rw-r--r--lib/puppet/provider/package/hpux.rb7
-rw-r--r--lib/puppet/provider/package/portage.rb4
-rwxr-xr-xlib/puppet/provider/package/rpm.rb9
-rw-r--r--lib/puppet/provider/package/rug.rb4
-rwxr-xr-xlib/puppet/provider/package/sun.rb2
-rwxr-xr-xlib/puppet/provider/package/sunfreeware.rb3
-rw-r--r--lib/puppet/provider/package/yumhelper.py103
11 files changed, 165 insertions, 88 deletions
diff --git a/lib/puppet/provider/package/apt.rb b/lib/puppet/provider/package/apt.rb
index 016623d71..80465129d 100755
--- a/lib/puppet/provider/package/apt.rb
+++ b/lib/puppet/provider/package/apt.rb
@@ -10,7 +10,7 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
commands :aptcache => "/usr/bin/apt-cache"
commands :preseed => "/usr/bin/debconf-set-selections"
- defaultfor :operatingsystem => :debian
+ defaultfor :operatingsystem => [:debian, :ubuntu]
ENV['DEBIAN_FRONTEND'] = "noninteractive"
@@ -45,9 +45,19 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
if @resource[:responsefile]
self.run_preseed
end
- should = @resource.should(:ensure)
+ should = @resource[:ensure]
checkforcdrom()
+ cmd = %w{-q -y}
+
+ keep = ""
+ if config = @resource[:configfiles]
+ if config == :keep
+ cmd << "-o" << 'DPkg::Options::=--force-confold'
+ else
+ cmd << "-o" << 'DPkg::Options::=--force-confnew'
+ end
+ end
str = @resource[:name]
case should
@@ -57,19 +67,6 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
# Add the package version
str += "=%s" % should
end
- cmd = %w{-q -y}
-
- keep = ""
- if config = @resource[:configfiles]
- case config
- when :keep
- cmd << "-o" << 'DPkg::Options::=--force-confold'
- when :replace
- cmd << "-o" << 'DPkg::Options::=--force-confnew'
- else
- raise Puppet::Error, "Invalid 'configfiles' value %s" % config
- end
- end
cmd << :install << str
@@ -92,7 +89,7 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
# preseeds answers to dpkg-set-selection from the "responsefile"
#
def run_preseed
- if response = @resource[:responsefile] and FileTest.exists?(response)
+ if response = @resource[:responsefile] and FileTest.exist?(response)
self.info("Preseeding %s to debconf-set-selections" % response)
preseed response
@@ -101,16 +98,12 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
end
end
- def update
- self.install
- end
-
def uninstall
aptget "-y", "-q", :remove, @resource[:name]
end
def purge
- aptget '-y', '-q', 'remove', '--purge', @resource[:name]
+ aptget '-y', '-q', :remove, '--purge', @resource[:name]
# workaround a "bug" in apt, that already removed packages are not purged
super
end
diff --git a/lib/puppet/provider/package/blastwave.rb b/lib/puppet/provider/package/blastwave.rb
index 402e8a1de..a2f86aa5a 100755
--- a/lib/puppet/provider/package/blastwave.rb
+++ b/lib/puppet/provider/package/blastwave.rb
@@ -6,6 +6,8 @@ Puppet::Type.type(:package).provide :blastwave, :parent => :sun, :source => :sun
pkgget = "/opt/csw/bin/pkg-get"
end
+ confine :operatingsystem => :solaris
+
commands :pkgget => pkgget
# This is so stupid, but then, so is blastwave.
diff --git a/lib/puppet/provider/package/dpkg.rb b/lib/puppet/provider/package/dpkg.rb
index ae79f714c..67d31a592 100755
--- a/lib/puppet/provider/package/dpkg.rb
+++ b/lib/puppet/provider/package/dpkg.rb
@@ -23,30 +23,39 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
# now turn each returned line into a package object
process.each { |line|
- if match = regex.match(line)
- hash = {}
+ if hash = parse_line(line)
+ packages << new(hash)
+ end
+ }
+ end
- fields.zip(match.captures) { |field,value|
- hash[field] = value
- }
+ return packages
+ end
- hash[:provider] = self.name
+ REGEX = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*)$}
+ FIELDS = [:desired, :error, :status, :name, :ensure]
- if hash[:status] == 'not-installed'
- hash[:ensure] = :purged
- elsif hash[:status] != "installed"
- hash[:ensure] = :absent
- end
+ def self.parse_line(line)
+ if match = REGEX.match(line)
+ hash = {}
- packages << new(hash)
- else
- Puppet.warning "Failed to match dpkg-query line %s" %
- line.inspect
- end
+ FIELDS.zip(match.captures) { |field,value|
+ hash[field] = value
}
+
+ hash[:provider] = self.name
+
+ if hash[:status] == 'not-installed'
+ hash[:ensure] = :purged
+ elsif hash[:status] != "installed"
+ hash[:ensure] = :absent
+ end
+ else
+ Puppet.warning "Failed to match dpkg-query line %s" % line.inspect
+ return nil
end
- return packages
+ return hash
end
def install
@@ -56,15 +65,10 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
args = []
- if config = @resource[:configfiles]
- case config
- when :keep
- args << '--force-confold'
- when :replace
- args << '--force-confnew'
- else
- raise Puppet::Error, "Invalid 'configfiles' value %s" % config
- end
+ if @resource[:configfiles] == :keep
+ args << '--force-confold'
+ else
+ args << '--force-confnew'
end
args << '-i' << file
@@ -80,7 +84,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
output = dpkg_deb "--show", @resource[:source]
matches = /^(\S+)\t(\S+)$/.match(output).captures
unless matches[0].match(@resource[:name])
- Puppet.warning "source doesn't contain named package, but %s" % matches[0]
+ warning "source doesn't contain named package, but %s" % matches[0]
end
matches[1]
end
@@ -103,22 +107,8 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
:name => @resource[:name], :error => 'ok'}
end
- # Our regex for matching dpkg-query output. We could probably just
- # use split here, but I'm not positive that dpkg-query will never
- # return whitespace.
- regex = %r{^(\S+) (\S+) (\S+) (\S+) (\S*)$}
- line = output.split("\n").shift.chomp
-
- if match = regex.match(line)
- fields.zip(match.captures) { |field,value|
- hash[field] = value
- }
- else
- notice "Failed to handle dpkg-query line %s" % line.inspect
- return {:ensure => :absent, :status => 'missing',
- :name => @resource[:name], :error => 'ok'}
- end
+ hash = self.class.parse_line(output) || {:ensure => :absent, :status => 'missing', :name => @resource[:name], :error => 'ok'}
if hash[:error] != "ok"
raise Puppet::Error.new(
@@ -127,13 +117,6 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
)
end
- # DPKG can discuss packages that are no longer installed, so allow that.
- if hash[:status] == "not-installed"
- hash[:ensure] = :purged
- elsif hash[:status] != "installed"
- hash[:ensure] = :absent
- end
-
return hash
end
@@ -145,4 +128,3 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
dpkg "--purge", @resource[:name]
end
end
-
diff --git a/lib/puppet/provider/package/fink.rb b/lib/puppet/provider/package/fink.rb
index 030e1a347..4d560666b 100755
--- a/lib/puppet/provider/package/fink.rb
+++ b/lib/puppet/provider/package/fink.rb
@@ -4,7 +4,7 @@ Puppet::Type.type(:package).provide :fink, :parent => :dpkg, :source => :dpkg do
desc "Package management via ``fink``."
- commands :fink => "/sw/bin/fink"
+ commands :fink => "/sw/bin/fink"
commands :aptget => "/sw/bin/apt-get"
commands :aptcache => "/sw/bin/apt-cache"
commands :dpkgquery => "/sw/bin/dpkg-query"
diff --git a/lib/puppet/provider/package/hpux.rb b/lib/puppet/provider/package/hpux.rb
index aa756ead0..202fa24c9 100644
--- a/lib/puppet/provider/package/hpux.rb
+++ b/lib/puppet/provider/package/hpux.rb
@@ -3,11 +3,16 @@
require 'puppet/provider/package'
Puppet::Type.type(:package).provide :hpux, :parent => Puppet::Provider::Package do
+
desc "HP-UX's packaging system."
+
commands :swinstall => "/usr/sbin/swinstall",
:swlist => "/usr/sbin/swlist",
:swremove => "/usr/sbin/swremove"
- defaultfor :operatingsystem => 'hp-ux'
+
+ confine :operatingsystem => "hp-ux"
+
+ defaultfor :operatingsystem => "hp-ux"
def self.instances
# TODO: This is very hard on HP-UX!
diff --git a/lib/puppet/provider/package/portage.rb b/lib/puppet/provider/package/portage.rb
index f795d0302..ae7194f89 100644
--- a/lib/puppet/provider/package/portage.rb
+++ b/lib/puppet/provider/package/portage.rb
@@ -7,6 +7,8 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
commands :emerge => "/usr/bin/emerge", :eix => "/usr/bin/eix", :update_eix => "/usr/bin/update-eix"
+ confine :operatingsystem => :gentoo
+
defaultfor :operatingsystem => :gentoo
def self.instances
@@ -70,7 +72,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
result_format = /(\S+) (\S+) \[(?:([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\([^\)]+\))?(?:\[([^\]]+)\])?[ ]*)*\] \[(?:(?:\{M\})?(?:\([~*]+\))?([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\(([^\)]+)\))?(?:![mf])*(?:\[([^\]]+)\])?)?\] ([\S]*) (.*)/
result_fields = [:category, :name, :ensure, :ensure_overlay, :version_available, :slot, :overlay, :vendor, :description]
- search_field = @resource[:category] ? "--category-name" : "--name"
+ search_field = package_name.count('/') > 0 ? "--category-name" : "--name"
search_value = package_name
search_format = "<category> <name> [<installedversionsshort>] [<best>] <homepage> <description>"
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/rug.rb b/lib/puppet/provider/package/rug.rb
index c5451ad71..1e1d6763f 100644
--- a/lib/puppet/provider/package/rug.rb
+++ b/lib/puppet/provider/package/rug.rb
@@ -5,8 +5,8 @@ Puppet.type(:package).provide :rug, :parent => :rpm do
commands :rug => "/usr/bin/rug"
commands :rpm => "rpm"
- defaultfor :operatingsystem => :suse
- confine :operatingsystem => :suse
+ defaultfor :operatingsystem => [:suse, :sles]
+ confine :operatingsystem => [:suse, :sles]
# Install a package using 'rug'.
def install
diff --git a/lib/puppet/provider/package/sun.rb b/lib/puppet/provider/package/sun.rb
index 927596df2..0d366388a 100755
--- a/lib/puppet/provider/package/sun.rb
+++ b/lib/puppet/provider/package/sun.rb
@@ -9,6 +9,8 @@ Puppet::Type.type(:package).provide :sun, :parent => Puppet::Provider::Package d
:pkgadd => "/usr/sbin/pkgadd",
:pkgrm => "/usr/sbin/pkgrm"
+ confine :operatingsystem => :solaris
+
defaultfor :operatingsystem => :solaris
def self.instances
diff --git a/lib/puppet/provider/package/sunfreeware.rb b/lib/puppet/provider/package/sunfreeware.rb
index 8b573fe2b..d7bcd0982 100755
--- a/lib/puppet/provider/package/sunfreeware.rb
+++ b/lib/puppet/provider/package/sunfreeware.rb
@@ -4,5 +4,8 @@ Puppet::Type.type(:package).provide :sunfreeware, :parent => :blastwave, :source
At this point, support is exactly the same as ``blastwave`` support and
has not actually been tested."
commands :pkgget => "pkg-get"
+
+ confine :operatingsystem => :solaris
+
end
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)