summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorNigel Kersten <nigelk@google.com>2010-03-26 14:58:02 -0700
committertest branch <puppet-dev@googlegroups.com>2010-02-17 06:50:53 -0800
commit02ed8db54372c8b824a10f6fb1df9773f0eb93d5 (patch)
tree3fb184d164637f22fb82de0d281baeea3a6afccc /lib
parent0f2d3ce686f7e706537e03ebb2166478fa55f649 (diff)
downloadpuppet-02ed8db54372c8b824a10f6fb1df9773f0eb93d5.tar.gz
puppet-02ed8db54372c8b824a10f6fb1df9773f0eb93d5.tar.xz
puppet-02ed8db54372c8b824a10f6fb1df9773f0eb93d5.zip
Fixes #2836. Add hold support to dpkg provider
Diffstat (limited to 'lib')
-rwxr-xr-xlib/puppet/provider/package/dpkg.rb31
-rw-r--r--lib/puppet/type/package.rb12
2 files changed, 41 insertions, 2 deletions
diff --git a/lib/puppet/provider/package/dpkg.rb b/lib/puppet/provider/package/dpkg.rb
index 06050cefd..fda9e02fb 100755
--- a/lib/puppet/provider/package/dpkg.rb
+++ b/lib/puppet/provider/package/dpkg.rb
@@ -5,6 +5,8 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
and not ``apt``, you must specify the source of any packages you want
to manage."
+ has_feature :holdable
+
commands :dpkg => "/usr/bin/dpkg"
commands :dpkg_deb => "/usr/bin/dpkg-deb"
commands :dpkgquery => "/usr/bin/dpkg-query"
@@ -47,9 +49,12 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
if hash[:status] == 'not-installed'
hash[:ensure] = :purged
- elsif hash[:status] != "installed"
+ elsif ['config-files', 'half-installed', 'unpacked', 'half-configured'].include?(hash[:status])
hash[:ensure] = :absent
end
+ if hash[:desired] == 'hold'
+ hash[:ensure] = :held
+ end
else
Puppet.warning "Failed to match dpkg-query line %s" % line.inspect
return nil
@@ -65,6 +70,9 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
args = []
+ # We always unhold when installing to remove any prior hold.
+ self.unhold
+
if @resource[:configfiles] == :keep
args << '--force-confold'
else
@@ -127,4 +135,25 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
def purge
dpkg "--purge", @resource[:name]
end
+
+ def hold
+ self.install
+ begin
+ Tempfile.open('puppet_dpkg_set_selection') { |tmpfile|
+ tmpfile.write("#{@resource[:name]} hold\n")
+ tmpfile.flush
+ execute([:dpkg, "--set-selections"], :stdinfile => tmpfile.path.to_s)
+ }
+ end
+ end
+
+ def unhold
+ begin
+ Tempfile.open('puppet_dpkg_set_selection') { |tmpfile|
+ tmpfile.write("#{@resource[:name]} install\n")
+ tmpfile.flush
+ execute([:dpkg, "--set-selections"], :stdinfile => tmpfile.path.to_s)
+ }
+ end
+ end
end
diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb
index 5c2ffa6a8..827fee12b 100644
--- a/lib/puppet/type/package.rb
+++ b/lib/puppet/type/package.rb
@@ -35,6 +35,12 @@ module Puppet
package database for installed version(s), and can select
which out of a set of available versions of a package to
install if asked."
+ feature :holdable, "The provider is capable of placing packages on hold
+ such that they are not automatically upgraded as a result of
+ other package dependencies unless explicit action is taken by
+ a user or another package. Held is considered a superset of
+ installed.",
+ :methods => [:hold]
ensurable do
desc "What state the package should be in.
@@ -60,6 +66,10 @@ module Puppet
provider.purge
end
+ newvalue(:held, :event => :package_held, :required_features => :holdable) do
+ provider.hold
+ end
+
# Alias the 'present' value.
aliasvalue(:installed, :present)
@@ -111,7 +121,7 @@ module Puppet
@should.each { |should|
case should
when :present
- return true unless [:absent, :purged].include?(is)
+ return true unless [:absent, :purged, :held].include?(is)
when :latest
# Short-circuit packages that are not present
return false if is == :absent or is == :purged