puppet 6.8.1 → 6.9.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +10 -11
- data/ext/project_data.yaml +1 -0
- data/lib/puppet.rb +9 -1
- data/lib/puppet/application/agent.rb +12 -0
- data/lib/puppet/application_support.rb +1 -1
- data/lib/puppet/context.rb +120 -48
- data/lib/puppet/face/config.rb +10 -48
- data/lib/puppet/face/help.rb +1 -1
- data/lib/puppet/face/plugin.rb +9 -2
- data/lib/puppet/forge/repository.rb +1 -1
- data/lib/puppet/functions/regsubst.rb +58 -37
- data/lib/puppet/indirector/catalog/compiler.rb +10 -6
- data/lib/puppet/module_tool/applications/uninstaller.rb +2 -3
- data/lib/puppet/network/http/connection.rb +1 -1
- data/lib/puppet/network/http/factory.rb +1 -1
- data/lib/puppet/network/http_pool.rb +1 -0
- data/lib/puppet/provider/package/dnf.rb +1 -1
- data/lib/puppet/provider/package/rpm.rb +51 -13
- data/lib/puppet/provider/package/yum.rb +8 -4
- data/lib/puppet/provider/service/systemd.rb +1 -1
- data/lib/puppet/settings.rb +40 -0
- data/lib/puppet/ssl.rb +1 -1
- data/lib/puppet/ssl/base.rb +1 -1
- data/lib/puppet/ssl/openssl_loader.rb +28 -0
- data/lib/puppet/ssl/validator.rb +1 -1
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/ssl/validator/no_validator.rb +1 -1
- data/lib/puppet/thread_local.rb +7 -0
- data/lib/puppet/type/exec.rb +14 -6
- data/lib/puppet/type/group.rb +4 -2
- data/lib/puppet/type/package.rb +10 -0
- data/lib/puppet/type/user.rb +4 -2
- data/lib/puppet/util/checksums.rb +3 -3
- data/lib/puppet/util/http_proxy.rb +8 -6
- data/lib/puppet/util/monkey_patches.rb +53 -47
- data/lib/puppet/util/platform.rb +16 -0
- data/lib/puppet/util/ssl.rb +1 -1
- data/lib/puppet/util/windows/root_certs.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet/x509.rb +1 -1
- data/locales/puppet.pot +119 -119
- data/man/man5/puppet.conf.5 +2 -2
- data/man/man8/puppet-agent.8 +1 -1
- data/man/man8/puppet-apply.8 +1 -1
- data/man/man8/puppet-catalog.8 +1 -1
- data/man/man8/puppet-config.8 +1 -1
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +1 -1
- data/man/man8/puppet-facts.8 +1 -1
- data/man/man8/puppet-filebucket.8 +1 -1
- data/man/man8/puppet-generate.8 +1 -1
- data/man/man8/puppet-help.8 +1 -1
- data/man/man8/puppet-key.8 +1 -1
- data/man/man8/puppet-lookup.8 +1 -1
- data/man/man8/puppet-man.8 +1 -1
- data/man/man8/puppet-module.8 +1 -1
- data/man/man8/puppet-node.8 +1 -1
- data/man/man8/puppet-parser.8 +1 -1
- data/man/man8/puppet-plugin.8 +1 -1
- data/man/man8/puppet-report.8 +1 -1
- data/man/man8/puppet-resource.8 +1 -1
- data/man/man8/puppet-script.8 +1 -1
- data/man/man8/puppet-ssl.8 +1 -1
- data/man/man8/puppet-status.8 +1 -1
- data/man/man8/puppet.8 +3 -3
- data/spec/integration/provider/service/systemd_spec.rb +7 -6
- data/spec/integration/util/execution_spec.rb +1 -1
- data/spec/lib/puppet_spec/matchers.rb +0 -13
- data/spec/spec_helper.rb +1 -3
- data/spec/unit/application/agent_spec.rb +19 -0
- data/spec/unit/context_spec.rb +119 -38
- data/spec/unit/face/help_spec.rb +1 -1
- data/spec/unit/face/plugin_spec.rb +8 -0
- data/spec/unit/forge/forge_spec.rb +1 -3
- data/spec/unit/forge/repository_spec.rb +1 -3
- data/spec/unit/functions/contain_spec.rb +1 -1
- data/spec/unit/indirector/catalog/compiler_spec.rb +62 -5
- data/spec/unit/module_tool/applications/uninstaller_spec.rb +16 -7
- data/spec/unit/node/environment_spec.rb +1 -1
- data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
- data/spec/unit/provider/package/dnf_spec.rb +7 -0
- data/spec/unit/provider/package/pkgin_spec.rb +1 -1
- data/spec/unit/provider/package/rpm_spec.rb +150 -16
- data/spec/unit/provider/package/yum_spec.rb +7 -0
- data/spec/unit/type/exec_spec.rb +9 -0
- data/spec/unit/type/schedule_spec.rb +1 -1
- data/spec/unit/util/http_proxy_spec.rb +50 -0
- data/spec/unit/util/inifile_spec.rb +5 -5
- metadata +18 -2
data/lib/puppet/face/help.rb
CHANGED
@@ -196,7 +196,7 @@ Puppet::Face.define(:help, '0.0.1') do
|
|
196
196
|
#private :horribly_extract_summary_from
|
197
197
|
|
198
198
|
def exclude_from_docs?(appname)
|
199
|
-
%w{face_base indirection_base cert key man
|
199
|
+
%w{face_base indirection_base cert key man report status}.include? appname
|
200
200
|
end
|
201
201
|
# This should absolutely be a private method, but for some reason it appears
|
202
202
|
# that you can't use the 'private' keyword inside of a Face definition.
|
data/lib/puppet/face/plugin.rb
CHANGED
@@ -41,8 +41,15 @@ Puppet::Face.define(:plugin, '0.0.1') do
|
|
41
41
|
when_invoked do |options|
|
42
42
|
remote_environment_for_plugins = Puppet::Node::Environment.remote(Puppet[:environment])
|
43
43
|
|
44
|
-
|
45
|
-
|
44
|
+
pool = Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout])
|
45
|
+
Puppet.override(:http_pool => pool) do
|
46
|
+
begin
|
47
|
+
handler = Puppet::Configurer::PluginHandler.new()
|
48
|
+
handler.download_plugins(remote_environment_for_plugins)
|
49
|
+
ensure
|
50
|
+
pool.close
|
51
|
+
end
|
52
|
+
end
|
46
53
|
end
|
47
54
|
|
48
55
|
when_rendering :console do |value|
|
@@ -1,42 +1,34 @@
|
|
1
1
|
# Performs regexp replacement on a string or array of strings.
|
2
|
-
#
|
3
|
-
# @param target [String, Array[String]]
|
4
|
-
# The string or array of strings to operate on. If an array, the replacement will be
|
5
|
-
# performed on each of the elements in the array, and the return value will be an array.
|
6
|
-
# @param pattern [String, Regexp, Type[Regexp]]
|
7
|
-
# The regular expression matching the target string. If you want it anchored at the start
|
8
|
-
# and or end of the string, you must do that with ^ and $ yourself.
|
9
|
-
# @param replacement [String, Hash[String, String]]
|
10
|
-
# Replacement string. Can contain backreferences to what was matched using \\0 (whole match),
|
11
|
-
# \\1 (first set of parentheses), and so on.
|
12
|
-
# If the second argument is a Hash, and the matched text is one of its keys, the corresponding value is the replacement string.
|
13
|
-
# @param flags [Optional[Pattern[/^[GEIM]*$/]], Pattern[/^G?$/]]
|
14
|
-
# Optional. String of single letter flags for how the regexp is interpreted (E, I, and M cannot be used
|
15
|
-
# if pattern is a precompiled regexp):
|
16
|
-
# - *E* Extended regexps
|
17
|
-
# - *I* Ignore case in regexps
|
18
|
-
# - *M* Multiline regexps
|
19
|
-
# - *G* Global replacement; all occurrences of the regexp in each target string will be replaced. Without this, only the first occurrence will be replaced.
|
20
|
-
# @param encoding [Enum['N','E','S','U']]
|
21
|
-
# Optional. How to handle multibyte characters when compiling the regexp (must not be used when pattern is a
|
22
|
-
# precompiled regexp). A single-character string with the following values:
|
23
|
-
# - *N* None
|
24
|
-
# - *E* EUC
|
25
|
-
# - *S* SJIS
|
26
|
-
# - *U* UTF-8
|
27
|
-
# @return [Array[String], String] The result of the substitution. Result type is the same as for the target parameter.
|
28
|
-
#
|
29
|
-
# @example Get the third octet from the node's IP address:
|
30
|
-
# ```puppet
|
31
|
-
# $i3 = regsubst($ipaddress,'^(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$','\\3')
|
32
|
-
# ```
|
33
|
-
#
|
34
|
-
# @example Put angle brackets around each octet in the node's IP address:
|
35
|
-
# ```puppet
|
36
|
-
# $x = regsubst($ipaddress, /([0-9]+)/, '<\\1>', 'G')
|
37
|
-
# ```
|
38
|
-
#
|
39
2
|
Puppet::Functions.create_function(:regsubst) do
|
3
|
+
# @param target [String]
|
4
|
+
# The string or array of strings to operate on. If an array, the replacement will be
|
5
|
+
# performed on each of the elements in the array, and the return value will be an array.
|
6
|
+
# @param pattern [String, Regexp, Type[Regexp]]
|
7
|
+
# The regular expression matching the target string. If you want it anchored at the start
|
8
|
+
# and or end of the string, you must do that with ^ and $ yourself.
|
9
|
+
# @param replacement [String, Hash[String, String]]
|
10
|
+
# Replacement string. Can contain backreferences to what was matched using \\0 (whole match),
|
11
|
+
# \\1 (first set of parentheses), and so on.
|
12
|
+
# If the second argument is a Hash, and the matched text is one of its keys, the corresponding value is the replacement string.
|
13
|
+
# @param flags [Optional[Pattern[/^[GEIM]*$/]], Pattern[/^G?$/]]
|
14
|
+
# Optional. String of single letter flags for how the regexp is interpreted (E, I, and M cannot be used
|
15
|
+
# if pattern is a precompiled regexp):
|
16
|
+
# - *E* Extended regexps
|
17
|
+
# - *I* Ignore case in regexps
|
18
|
+
# - *M* Multiline regexps
|
19
|
+
# - *G* Global replacement; all occurrences of the regexp in each target string will be replaced. Without this, only the first occurrence will be replaced.
|
20
|
+
# @param encoding [Enum['N','E','S','U']]
|
21
|
+
# Optional. How to handle multibyte characters when compiling the regexp (must not be used when pattern is a
|
22
|
+
# precompiled regexp). A single-character string with the following values:
|
23
|
+
# - *N* None
|
24
|
+
# - *E* EUC
|
25
|
+
# - *S* SJIS
|
26
|
+
# - *U* UTF-8
|
27
|
+
# @return [Array[String], String] The result of the substitution. Result type is the same as for the target parameter.
|
28
|
+
# @example Get the third octet from the node's IP address:
|
29
|
+
# ```puppet
|
30
|
+
# $i3 = regsubst($ipaddress,'^(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)$','\\3')
|
31
|
+
# ```
|
40
32
|
dispatch :regsubst_string do
|
41
33
|
param 'Variant[Array[String],String]', :target
|
42
34
|
param 'String', :pattern
|
@@ -45,6 +37,35 @@ Puppet::Functions.create_function(:regsubst) do
|
|
45
37
|
optional_param "Enum['N','E','S','U']", :encoding
|
46
38
|
end
|
47
39
|
|
40
|
+
# @param target [String, Array[String]]
|
41
|
+
# The string or array of strings to operate on. If an array, the replacement will be
|
42
|
+
# performed on each of the elements in the array, and the return value will be an array.
|
43
|
+
# @param pattern [Regexp, Type[Regexp]]
|
44
|
+
# The regular expression matching the target string. If you want it anchored at the start
|
45
|
+
# and or end of the string, you must do that with ^ and $ yourself.
|
46
|
+
# @param replacement [String, Hash[String, String]]
|
47
|
+
# Replacement string. Can contain backreferences to what was matched using \\0 (whole match),
|
48
|
+
# \\1 (first set of parentheses), and so on.
|
49
|
+
# If the second argument is a Hash, and the matched text is one of its keys, the corresponding value is the replacement string.
|
50
|
+
# @param flags [Optional[Pattern[/^[GEIM]*$/]], Pattern[/^G?$/]]
|
51
|
+
# Optional. String of single letter flags for how the regexp is interpreted (E, I, and M cannot be used
|
52
|
+
# if pattern is a precompiled regexp):
|
53
|
+
# - *E* Extended regexps
|
54
|
+
# - *I* Ignore case in regexps
|
55
|
+
# - *M* Multiline regexps
|
56
|
+
# - *G* Global replacement; all occurrences of the regexp in each target string will be replaced. Without this, only the first occurrence will be replaced.
|
57
|
+
# @param encoding [Enum['N','E','S','U']]
|
58
|
+
# Optional. How to handle multibyte characters when compiling the regexp (must not be used when pattern is a
|
59
|
+
# precompiled regexp). A single-character string with the following values:
|
60
|
+
# - *N* None
|
61
|
+
# - *E* EUC
|
62
|
+
# - *S* SJIS
|
63
|
+
# - *U* UTF-8
|
64
|
+
# @return [Array[String], String] The result of the substitution. Result type is the same as for the target parameter.
|
65
|
+
# @example Put angle brackets around each octet in the node's IP address:
|
66
|
+
# ```puppet
|
67
|
+
# $x = regsubst($ipaddress, /([0-9]+)/, '<\\1>', 'G')
|
68
|
+
# ```
|
48
69
|
dispatch :regsubst_regexp do
|
49
70
|
param 'Variant[Array[String],String]', :target
|
50
71
|
param 'Variant[Regexp,Type[Regexp]]', :pattern
|
@@ -401,24 +401,28 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
|
|
401
401
|
|
402
402
|
# And then add the server name and IP
|
403
403
|
{"servername" => "fqdn",
|
404
|
-
"serverip"
|
404
|
+
"serverip" => "ipaddress",
|
405
|
+
"serverip6" => "ipaddress6"
|
405
406
|
}.each do |var, fact|
|
406
407
|
value = Facter.value(fact)
|
407
|
-
if value
|
408
|
+
if !value.nil?
|
408
409
|
@server_facts[var] = value
|
409
|
-
else
|
410
|
-
Puppet.warning _("Could not retrieve fact %{fact}") % { fact: fact }
|
411
410
|
end
|
412
411
|
end
|
413
412
|
|
414
413
|
if @server_facts["servername"].nil?
|
415
414
|
host = Facter.value(:hostname)
|
416
|
-
|
417
|
-
|
415
|
+
if host.nil?
|
416
|
+
Puppet.warning _("Could not retrieve fact servername")
|
417
|
+
elsif domain = Facter.value(:domain) #rubocop:disable Lint/AssignmentInCondition
|
418
418
|
@server_facts["servername"] = [host, domain].join(".")
|
419
419
|
else
|
420
420
|
@server_facts["servername"] = host
|
421
421
|
end
|
422
422
|
end
|
423
|
+
|
424
|
+
if @server_facts["serverip"].nil? && @server_facts["serverip6"].nil?
|
425
|
+
Puppet.warning _("Could not retrieve either serverip or serverip6 fact")
|
426
|
+
end
|
423
427
|
end
|
424
428
|
end
|
@@ -15,9 +15,6 @@ module Puppet::ModuleTool
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def run
|
18
|
-
# Disallow anything that invokes md5 to avoid un-friendly termination due to FIPS
|
19
|
-
raise _("Module uninstall is prohibited in FIPS mode.") if Facter.value(:fips_enabled)
|
20
|
-
|
21
18
|
results = {
|
22
19
|
:module_name => @name,
|
23
20
|
:requested_version => @version,
|
@@ -92,6 +89,8 @@ module Puppet::ModuleTool
|
|
92
89
|
mod = @installed.first
|
93
90
|
|
94
91
|
unless @ignore_changes
|
92
|
+
raise _("Either the `--ignore_changes` or `--force` argument must be specified to uninstall modules when running in FIPS mode.") if Facter.value(:fips_enabled)
|
93
|
+
|
95
94
|
changes = begin
|
96
95
|
Puppet::ModuleTool::Applications::Checksummer.run(mod.path)
|
97
96
|
rescue ArgumentError
|
@@ -9,7 +9,7 @@ Puppet::Type.type(:package).provide :dnf, :parent => :yum do
|
|
9
9
|
These options should be specified as an array where each element is either
|
10
10
|
a string or a hash."
|
11
11
|
|
12
|
-
has_feature :install_options, :versionable, :virtual_packages
|
12
|
+
has_feature :install_options, :versionable, :virtual_packages, :install_only
|
13
13
|
|
14
14
|
commands :cmd => "dnf", :rpm => "rpm"
|
15
15
|
|
@@ -13,6 +13,7 @@ These options should be specified as an array where each element is either a str
|
|
13
13
|
has_feature :install_options
|
14
14
|
has_feature :uninstall_options
|
15
15
|
has_feature :virtual_packages
|
16
|
+
has_feature :install_only
|
16
17
|
|
17
18
|
# Note: self:: is required here to keep these constants in the context of what will
|
18
19
|
# eventually become this Puppet::Type::Package::ProviderRpm class.
|
@@ -20,6 +21,7 @@ These options should be specified as an array where each element is either a str
|
|
20
21
|
self::NEVRA_FORMAT = %Q{%{NAME} %|EPOCH?{%{EPOCH}}:{0}| %{VERSION} %{RELEASE} %{ARCH}\\n}
|
21
22
|
self::NEVRA_REGEX = %r{^'?(\S+) (\S+) (\S+) (\S+) (\S+)$}
|
22
23
|
self::NEVRA_FIELDS = [:name, :epoch, :version, :release, :arch]
|
24
|
+
self::MULTIVERSION_SEPARATOR = "; "
|
23
25
|
|
24
26
|
ARCH_LIST = [
|
25
27
|
'noarch',
|
@@ -79,12 +81,9 @@ These options should be specified as an array where each element is either a str
|
|
79
81
|
|
80
82
|
# list out all of the packages
|
81
83
|
begin
|
82
|
-
execpipe("#{command(:rpm)} -qa #{nosignature} #{nodigest} --qf '#{self::NEVRA_FORMAT}'") { |process|
|
84
|
+
execpipe("#{command(:rpm)} -qa #{nosignature} #{nodigest} --qf '#{self::NEVRA_FORMAT}' | sort") { |process|
|
83
85
|
# now turn each returned line into a package object
|
84
|
-
process.
|
85
|
-
hash = nevra_to_hash(line)
|
86
|
-
packages << new(hash) unless hash.empty?
|
87
|
-
}
|
86
|
+
nevra_to_multiversion_hash(process).each { |hash| packages << new(hash) }
|
88
87
|
}
|
89
88
|
rescue Puppet::ExecutionFailure
|
90
89
|
raise Puppet::Error, _("Failed to list packages"), $!.backtrace
|
@@ -100,7 +99,7 @@ These options should be specified as an array where each element is either a str
|
|
100
99
|
#NOTE: Prior to a fix for issue 1243, this method potentially returned a cached value
|
101
100
|
#IF YOU CALL THIS METHOD, IT WILL CALL RPM
|
102
101
|
#Use get(:property) to check if cached values are available
|
103
|
-
cmd = ["-q", @resource[:name], "#{self.class.nosignature}", "#{self.class.nodigest}", "--qf", "
|
102
|
+
cmd = ["-q", @resource[:name], "#{self.class.nosignature}", "#{self.class.nodigest}", "--qf", "#{self.class::NEVRA_FORMAT}"]
|
104
103
|
|
105
104
|
begin
|
106
105
|
output = rpm(*cmd)
|
@@ -117,9 +116,7 @@ These options should be specified as an array where each element is either a str
|
|
117
116
|
return nil
|
118
117
|
end
|
119
118
|
end
|
120
|
-
|
121
|
-
# for multilib and this will only return the first such package
|
122
|
-
@property_hash.update(self.class.nevra_to_hash(output))
|
119
|
+
@property_hash.update(self.class.nevra_to_multiversion_hash(output))
|
123
120
|
|
124
121
|
@property_hash.dup
|
125
122
|
end
|
@@ -131,8 +128,8 @@ These options should be specified as an array where each element is either a str
|
|
131
128
|
@resource.fail _("RPMs must specify a package source")
|
132
129
|
end
|
133
130
|
|
134
|
-
cmd = [command(:rpm), "-q", "--qf", "
|
135
|
-
h = self.class.
|
131
|
+
cmd = [command(:rpm), "-q", "--qf", "#{self.class::NEVRA_FORMAT}", "-p", source]
|
132
|
+
h = self.class.nevra_to_multiversion_hash(execute(cmd))
|
136
133
|
h[:ensure]
|
137
134
|
rescue Puppet::ExecutionFailure => e
|
138
135
|
raise Puppet::Error, e.message, e.backtrace
|
@@ -170,7 +167,11 @@ These options should be specified as an array where each element is either a str
|
|
170
167
|
if @resource[:name].start_with? nav
|
171
168
|
identifier = nav
|
172
169
|
else
|
173
|
-
|
170
|
+
if @resource[:install_only]
|
171
|
+
identifier = get(:ensure).split(self.class::MULTIVERSION_SEPARATOR).map { |ver| "#{name}-#{ver}" }
|
172
|
+
else
|
173
|
+
identifier = name
|
174
|
+
end
|
174
175
|
end
|
175
176
|
end
|
176
177
|
# If an arch is specified in the resource, uninstall that arch,
|
@@ -310,8 +311,12 @@ These options should be specified as an array where each element is either a str
|
|
310
311
|
|
311
312
|
def insync?(is)
|
312
313
|
return false if [:purged, :absent].include?(is)
|
314
|
+
return false if is.include?(self.class::MULTIVERSION_SEPARATOR) && !@resource[:install_only]
|
315
|
+
|
313
316
|
should = resource[:ensure]
|
314
|
-
|
317
|
+
is.split(self.class::MULTIVERSION_SEPARATOR).any? do |version|
|
318
|
+
0 == self.rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(version))
|
319
|
+
end
|
315
320
|
end
|
316
321
|
|
317
322
|
# parse a rpm "version" specification
|
@@ -416,4 +421,37 @@ These options should be specified as an array where each element is either a str
|
|
416
421
|
|
417
422
|
return hash
|
418
423
|
end
|
424
|
+
|
425
|
+
# @param line [String] multiple lines of rpm package query information
|
426
|
+
# @return list of [Hash] of NEVRA_FIELDS strings parsed from package info
|
427
|
+
# or an empty list if we failed to parse
|
428
|
+
# @api private
|
429
|
+
def self.nevra_to_multiversion_hash(multiline)
|
430
|
+
list = []
|
431
|
+
multiversion_hash = {}
|
432
|
+
multiline.each_line do |line|
|
433
|
+
hash = self.nevra_to_hash(line)
|
434
|
+
if !hash.empty?
|
435
|
+
if multiversion_hash.empty?
|
436
|
+
multiversion_hash = hash.dup
|
437
|
+
next
|
438
|
+
end
|
439
|
+
|
440
|
+
if multiversion_hash[:name] != hash[:name]
|
441
|
+
list << multiversion_hash
|
442
|
+
multiversion_hash = hash.dup
|
443
|
+
next
|
444
|
+
end
|
445
|
+
|
446
|
+
if !multiversion_hash[:ensure].include?(hash[:ensure])
|
447
|
+
multiversion_hash[:ensure].concat("#{self::MULTIVERSION_SEPARATOR}#{hash[:ensure]}")
|
448
|
+
end
|
449
|
+
end
|
450
|
+
end
|
451
|
+
list << multiversion_hash if multiversion_hash
|
452
|
+
if list.size == 1
|
453
|
+
return list[0]
|
454
|
+
end
|
455
|
+
return list
|
456
|
+
end
|
419
457
|
end
|
@@ -8,7 +8,7 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
|
|
8
8
|
This provider supports the `install_options` attribute, which allows command-line flags to be passed to yum.
|
9
9
|
These options should be specified as an array where each element is either a string or a hash."
|
10
10
|
|
11
|
-
has_feature :install_options, :versionable, :virtual_packages
|
11
|
+
has_feature :install_options, :versionable, :virtual_packages, :install_only
|
12
12
|
|
13
13
|
commands :cmd => "yum", :rpm => "rpm"
|
14
14
|
|
@@ -203,7 +203,10 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
203
203
|
end
|
204
204
|
current_package = self.query
|
205
205
|
if current_package
|
206
|
-
if
|
206
|
+
if @resource[:install_only]
|
207
|
+
self.debug "Updating package #{@resource[:name]} from version #{current_package[:ensure]} to #{should} as install_only packages are never downgraded"
|
208
|
+
operation = update_command
|
209
|
+
elsif rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(current_package[:ensure])) < 0
|
207
210
|
self.debug "Downgrading package #{@resource[:name]} from version #{current_package[:ensure]} to #{should}"
|
208
211
|
operation = :downgrade
|
209
212
|
elsif rpm_compareEVR(rpm_parse_evr(should), rpm_parse_evr(current_package[:ensure])) > 0
|
@@ -228,10 +231,11 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
228
231
|
is = self.query
|
229
232
|
raise Puppet::Error, _("Could not find package %{name}") % { name: self.name } unless is
|
230
233
|
|
234
|
+
version = is[:ensure]
|
231
235
|
# FIXME: Should we raise an exception even if should == :latest
|
232
236
|
# and yum updated us to a version other than @param_hash[:ensure] ?
|
233
|
-
|
234
|
-
|
237
|
+
raise Puppet::Error, _("Failed to update to version %{should}, got version %{version} instead") % { should: should, version: version } unless
|
238
|
+
insync?(version)
|
235
239
|
end
|
236
240
|
end
|
237
241
|
|
@@ -11,7 +11,7 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
11
11
|
|
12
12
|
commands :systemctl => "systemctl"
|
13
13
|
|
14
|
-
confine :true => Puppet::FileSystem.exist?('/proc/1/
|
14
|
+
confine :true => Puppet::FileSystem.exist?('/proc/1/comm') && Puppet::FileSystem.read('/proc/1/comm').include?('systemd')
|
15
15
|
|
16
16
|
defaultfor :osfamily => [:archlinux]
|
17
17
|
defaultfor :osfamily => :redhat, :operatingsystemmajrelease => ["7", "8"]
|
data/lib/puppet/settings.rb
CHANGED
@@ -84,6 +84,46 @@ class Puppet::Settings
|
|
84
84
|
"puppet.conf"
|
85
85
|
end
|
86
86
|
|
87
|
+
def stringify_settings(section, settings = :all)
|
88
|
+
values_from_the_selected_section =
|
89
|
+
values(nil, section.to_sym)
|
90
|
+
|
91
|
+
loader_settings = {
|
92
|
+
:environmentpath => values_from_the_selected_section.interpolate(:environmentpath),
|
93
|
+
:basemodulepath => values_from_the_selected_section.interpolate(:basemodulepath),
|
94
|
+
}
|
95
|
+
|
96
|
+
Puppet.override(Puppet.base_context(loader_settings),
|
97
|
+
_("New environment loaders generated from the requested section.")) do
|
98
|
+
# And now we can lookup values that include those from environments configured from
|
99
|
+
# the requested section
|
100
|
+
values = values(Puppet[:environment].to_sym, section.to_sym)
|
101
|
+
|
102
|
+
to_be_rendered = {}
|
103
|
+
settings = Puppet.settings.to_a.collect(&:first) if settings == :all
|
104
|
+
settings.sort.each do |setting_name|
|
105
|
+
to_be_rendered[setting_name] = values.print(setting_name.to_sym)
|
106
|
+
end
|
107
|
+
|
108
|
+
stringifyhash(to_be_rendered)
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def stringifyhash(hash)
|
113
|
+
newhash = {}
|
114
|
+
hash.each do |key, val|
|
115
|
+
key = key.to_s
|
116
|
+
if val.is_a? Hash
|
117
|
+
newhash[key] = stringifyhash(val)
|
118
|
+
elsif val.is_a? Symbol
|
119
|
+
newhash[key] = val.to_s
|
120
|
+
else
|
121
|
+
newhash[key] = val
|
122
|
+
end
|
123
|
+
end
|
124
|
+
newhash
|
125
|
+
end
|
126
|
+
|
87
127
|
# Create a new collection of config settings.
|
88
128
|
def initialize
|
89
129
|
@config = {}
|