Skip to content

Commit 8c6625f

Browse files
author
Ciprian Badescu
committed
(maint) Merge 5.5.x to 6.4.x
* commit '4df9d37cbee71999e27f743a93bffcc39378a5e2': (packaging) Updating the puppet.pot file (maint) document the 'other' set_server_facts (PUP-1537) add mark property for package
2 parents 9e1892e + 4df9d37 commit 8c6625f

File tree

12 files changed

+231
-31
lines changed

12 files changed

+231
-31
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
test_name "dpkg ensure held package is latest installed" do
2+
confine :to, :platform => /debian-8-amd64/
3+
tag 'audit:low'
4+
5+
require 'puppet/acceptance/common_utils'
6+
extend Puppet::Acceptance::PackageUtils
7+
extend Puppet::Acceptance::ManifestUtils
8+
9+
10+
package = "nginx"
11+
12+
agents.each do |agent|
13+
teardown do
14+
package_absent(agent, package, '--force-yes')
15+
end
16+
end
17+
18+
step"Ensure that package is installed first if not present" do
19+
expected_package_version = on(agent.name, "apt-cache policy #{package} | sed -n -e 's/Candidate: //p'").stdout
20+
package_manifest = resource_manifest('package', package, mark: "hold")
21+
22+
apply_manifest_on(agent, package_manifest) do |result|
23+
installed_package_version = on(agent.name, "apt-cache policy #{package} | sed -n -e 's/Installed: //p'").stdout
24+
assert_match(expected_package_version, installed_package_version)
25+
end
26+
end
27+
end
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
test_name "dpkg ensure held package should preserve version if package is allready installed" do
2+
confine :to, :platform => /debian-8-amd64/
3+
tag 'audit:low'
4+
5+
require 'puppet/acceptance/common_utils'
6+
extend Puppet::Acceptance::PackageUtils
7+
extend Puppet::Acceptance::ManifestUtils
8+
9+
package = "openssl"
10+
11+
step "Ensure held should lock to specific installed version" do
12+
existing_installed_version = on(agent.name, "dpkg -s #{package} | sed -n -e 's/Version: //p'").stdout
13+
existing_installed_version.delete!(' ')
14+
15+
package_manifest_held = resource_manifest('package', package, mark: "hold")
16+
apply_manifest_on(agent, package_manifest_held) do
17+
installed_version = on(agent.name, "apt-cache policy #{package} | sed -n -e 's/Installed: //p'").stdout
18+
installed_version.delete!(' ')
19+
assert_match(existing_installed_version, installed_version)
20+
end
21+
end
22+
end

lib/puppet/indirector/catalog/compiler.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,8 @@ def node_from_request(facts, request)
387387

388388
# Initialize our server fact hash; we add these to each client, and they
389389
# won't change while we're running, so it's safe to cache the values.
390+
#
391+
# See also set_server_facts in Puppet::Server::Compiler in puppetserver.
390392
def set_server_facts
391393
@server_facts = {}
392394

lib/puppet/provider/package/apt.rb

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,12 @@ def install
7474
cmd += install_options if @resource[:install_options]
7575
cmd << :install << str
7676

77-
aptget(*cmd)
77+
self.unhold if self.properties[:mark] == :hold
78+
begin
79+
aptget(*cmd)
80+
ensure
81+
self.hold if @resource[:mark] == :hold
82+
end
7883
end
7984

8085
# What's the latest package version available?
@@ -104,12 +109,18 @@ def run_preseed
104109

105110
def uninstall
106111
self.run_preseed if @resource[:responsefile]
107-
aptget "-y", "-q", :remove, @resource[:name]
112+
args = ['-y', '-q']
113+
args << '--allow-change-held-packages' if self.properties[:mark] == :hold
114+
args << :remove << @resource[:name]
115+
aptget(*args)
108116
end
109117

110118
def purge
111119
self.run_preseed if @resource[:responsefile]
112-
aptget '-y', '-q', :remove, '--purge', @resource[:name]
120+
args = ['-y', '-q']
121+
args << '--allow-change-held-packages' if self.properties[:mark] == :hold
122+
args << :remove << '--purge' << @resource[:name]
123+
aptget(*args)
113124
# workaround a "bug" in apt, that already removed packages are not purged
114125
super
115126
end

lib/puppet/provider/package/dpkg.rb

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ def self.instances
4444
# eventually become this Puppet::Type::Package::ProviderDpkg class.
4545
self::DPKG_QUERY_FORMAT_STRING = %Q{'${Status} ${Package} ${Version}\\n'}
4646
self::DPKG_QUERY_PROVIDES_FORMAT_STRING = %Q{'${Status} ${Package} ${Version} [${Provides}]\\n'}
47-
self::FIELDS_REGEX = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*)$}
48-
self::FIELDS_REGEX_WITH_PROVIDES = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*) \[.*\]$}
47+
self::FIELDS_REGEX = %r{^'?(\S+) +(\S+) +(\S+) (\S+) (\S*)$}
48+
self::FIELDS_REGEX_WITH_PROVIDES = %r{^'?(\S+) +(\S+) +(\S+) (\S+) (\S*) \[.*\]$}
4949
self::FIELDS= [:desired, :error, :status, :name, :ensure]
5050

5151
def self.defaultto_allow_virtual
@@ -73,7 +73,7 @@ def self.parse_line(line, regex=self::FIELDS_REGEX)
7373
elsif ['config-files', 'half-installed', 'unpacked', 'half-configured'].include?(hash[:status])
7474
hash[:ensure] = :absent
7575
end
76-
hash[:ensure] = :held if hash[:desired] == 'hold'
76+
hash[:mark] = :hold if hash[:desired] == 'hold'
7777
else
7878
Puppet.debug("Failed to match dpkg-query line #{line.inspect}")
7979
end
@@ -90,8 +90,6 @@ def install
9090
end
9191
args = []
9292

93-
# We always unhold when installing to remove any prior hold.
94-
self.unhold
9593

9694
if @resource[:configfiles] == :keep
9795
args << '--force-confold'
@@ -100,7 +98,12 @@ def install
10098
end
10199
args << '-i' << file
102100

103-
dpkg(*args)
101+
self.unhold if self.properties[:mark] == :hold
102+
begin
103+
dpkg(*args)
104+
ensure
105+
self.hold if @resource[:mark] == :hold
106+
end
104107
end
105108

106109
def update
@@ -169,10 +172,14 @@ def purge
169172
dpkg "--purge", @resource[:name]
170173
end
171174

172-
def hold
175+
def deprecated_hold
173176
if package_not_installed?
174177
self.install
175178
end
179+
hold
180+
end
181+
182+
def hold
176183
Tempfile.open('puppet_dpkg_set_selection') do |tmpfile|
177184
tmpfile.write("#{@resource[:name]} hold\n")
178185
tmpfile.flush

lib/puppet/provider/package/fink.rb

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ def install
3737

3838
cmd << :install << str
3939

40-
finkcmd(cmd)
40+
self.unhold if self.properties[:mark] == :hold
41+
begin
42+
finkcmd(cmd)
43+
ensure
44+
self.hold if @resource[:mark] == :hold
45+
end
4146
end
4247

4348
# What's the latest package version available?
@@ -70,10 +75,22 @@ def update
7075
end
7176

7277
def uninstall
73-
finkcmd "-y", "-q", :remove, @model[:name]
78+
self.unhold if self.properties[:mark] == :hold
79+
begin
80+
finkcmd "-y", "-q", :remove, @model[:name]
81+
rescue StandardError, LoadError => e
82+
self.hold if self.properties[:mark] == :hold
83+
raise e
84+
end
7485
end
7586

7687
def purge
77-
aptget '-y', '-q', 'remove', '--purge', @resource[:name]
88+
self.unhold if self.properties[:mark] == :hold
89+
begin
90+
aptget '-y', '-q', 'remove', '--purge', @resource[:name]
91+
rescue StandardError, LoadError => e
92+
self.hold if self.properties[:mark] == :hold
93+
raise e
94+
end
7895
end
7996
end

lib/puppet/provider/package/pkg.rb

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def self.ifo_flag(flags)
5656
).merge(
5757
case flags[1..1]
5858
when 'f'
59-
{:ensure => 'held'}
59+
{:mark => :hold}
6060
when '-'
6161
{}
6262
else
@@ -114,6 +114,10 @@ def self.parse_line(line)
114114
end).merge({:provider => self.name})
115115
end
116116

117+
def deprecated_hold
118+
hold
119+
end
120+
117121
def hold
118122
pkg(:freeze, @resource[:name])
119123
end
@@ -214,8 +218,6 @@ def latest
214218
def install(nofail = false)
215219
name = @resource[:name]
216220
should = @resource[:ensure]
217-
# always unhold if explicitly told to install/update
218-
self.unhold
219221
is = self.query
220222
if is[:ensure].to_sym == :absent
221223
command = 'install'
@@ -230,7 +232,12 @@ def install(nofail = false)
230232
unless should.is_a? Symbol
231233
name += "@#{should}"
232234
end
233-
r = exec_cmd(command(:pkg), command, *args, name)
235+
self.unhold if self.properties[:mark] == :hold
236+
begin
237+
r = exec_cmd(command(:pkg), command, *args, name)
238+
ensure
239+
self.hold if @resource[:mark] == :hold
240+
end
234241
return r if nofail
235242
raise Puppet::Error, _("Unable to update %{package}") % { package: r[:out] } if r[:exit] != 0
236243
end
@@ -244,7 +251,13 @@ def uninstall
244251
cmd << '-r'
245252
end
246253
cmd << @resource[:name]
247-
pkg cmd
254+
self.unhold if self.properties[:mark] == :hold
255+
begin
256+
pkg cmd
257+
rescue StandardError, LoadError => e
258+
self.hold if self.properties[:mark] == :hold
259+
raise e
260+
end
248261
end
249262

250263
# update the package to the latest version available

lib/puppet/type/package.rb

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,8 @@ module Puppet
5454
feature :holdable, "The provider is capable of placing packages on hold
5555
such that they are not automatically upgraded as a result of
5656
other package dependencies unless explicit action is taken by
57-
a user or another package. Held is considered a superset of
58-
installed.",
59-
:methods => [:hold]
57+
a user or another package.",
58+
:methods => [:hold, :unhold]
6059
feature :install_only, "The provider accepts options to only install packages never update (kernels, etc.)"
6160
feature :install_options, "The provider accepts options to be
6261
passed to the installer command."
@@ -102,7 +101,7 @@ module Puppet
102101
end
103102

104103
newvalue(:held, :event => :package_held, :required_features => :holdable) do
105-
provider.hold
104+
provider.deprecated_hold
106105
end
107106

108107
# Alias the 'present' value.
@@ -623,5 +622,59 @@ def refresh
623622
provider.reinstall
624623
end
625624
end
625+
626+
newproperty(:mark, :required_features => :holdable) do
627+
mark_doc='Valid values are: hold/none'
628+
desc <<-EOT
629+
Set to hold to tell Debian apt/Solaris pkg to hold the package version
630+
631+
#{mark_doc}
632+
Default is "none". Mark can be specified with or without `ensure`,
633+
if `ensure` is missing will default to "present".
634+
635+
Mark cannot be specified together with "purged", "absent" or "held"
636+
values for `ensure`.
637+
EOT
638+
newvalues(:hold, :none)
639+
munge do |value|
640+
case value
641+
when "hold", :hold
642+
:hold
643+
when "none", :none
644+
:none
645+
else
646+
raise ArgumentError, _('Invalid hold value %{value}. %{doc}') % { value: value.inspect, doc: mark_doc}
647+
end
648+
end
649+
650+
def insync?(is)
651+
@should[0] == is
652+
end
653+
654+
def should
655+
@should[0] if @should && @should.is_a?(Array) && @should.size == 1
656+
end
657+
658+
def retrieve
659+
provider.properties[:mark]
660+
end
661+
662+
def sync
663+
if @should[0] == :hold
664+
provider.hold
665+
else
666+
provider.unhold
667+
end
668+
end
669+
end
670+
671+
validate do
672+
if :held == @parameters[:ensure].should
673+
warning '"ensure=>held" has been deprecated and will be removed in a future version, use "mark=hold" instead'
674+
end
675+
if @parameters[:mark] && [:absent, :purged, :held].include?(@parameters[:ensure].should)
676+
raise ArgumentError, _('You cannot use "mark" property while "ensure" is one of ["absent", "purged", "held"]')
677+
end
678+
end
626679
end
627680
end

0 commit comments

Comments
 (0)