diff options
Diffstat (limited to 'lib/puppet/provider/package')
| -rwxr-xr-x | lib/puppet/provider/package/apt.rb | 35 | ||||
| -rwxr-xr-x | lib/puppet/provider/package/blastwave.rb | 2 | ||||
| -rwxr-xr-x | lib/puppet/provider/package/dpkg.rb | 82 | ||||
| -rwxr-xr-x | lib/puppet/provider/package/fink.rb | 2 | ||||
| -rw-r--r-- | lib/puppet/provider/package/hpux.rb | 7 | ||||
| -rw-r--r-- | lib/puppet/provider/package/portage.rb | 4 | ||||
| -rwxr-xr-x | lib/puppet/provider/package/rpm.rb | 9 | ||||
| -rw-r--r-- | lib/puppet/provider/package/rug.rb | 4 | ||||
| -rwxr-xr-x | lib/puppet/provider/package/sun.rb | 2 | ||||
| -rwxr-xr-x | lib/puppet/provider/package/sunfreeware.rb | 3 | ||||
| -rw-r--r-- | lib/puppet/provider/package/yumhelper.py | 103 |
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) |
