puppet 6.4.4 → 6.4.5
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/CODEOWNERS +1 -1
- data/Gemfile +4 -4
- data/Gemfile.lock +38 -32
- data/ext/build_defaults.yaml +1 -0
- data/ext/cert_inspector +3 -3
- data/ext/puppet-test +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +4 -4
- data/ext/windows/service/daemon.rb +38 -8
- data/install.rb +6 -6
- data/lib/puppet/application.rb +1 -1
- data/lib/puppet/application/apply.rb +2 -2
- data/lib/puppet/application/describe.rb +3 -9
- data/lib/puppet/application/doc.rb +1 -1
- data/lib/puppet/application/lookup.rb +1 -1
- data/lib/puppet/application/script.rb +2 -2
- data/lib/puppet/application/ssl.rb +4 -1
- data/lib/puppet/configurer.rb +86 -30
- data/lib/puppet/configurer/downloader.rb +2 -6
- data/lib/puppet/defaults.rb +32 -6
- data/lib/puppet/error.rb +9 -1
- data/lib/puppet/face/module/list.rb +5 -5
- data/lib/puppet/face/module/search.rb +1 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/module/upgrade.rb +1 -1
- data/lib/puppet/file_serving/http_metadata.rb +1 -1
- data/lib/puppet/file_system.rb +0 -8
- data/lib/puppet/file_system/memory_file.rb +1 -1
- data/lib/puppet/file_system/posix.rb +3 -2
- data/lib/puppet/forge.rb +3 -3
- data/lib/puppet/functions.rb +1 -2
- data/lib/puppet/functions/camelcase.rb +2 -2
- data/lib/puppet/functions/epp.rb +4 -4
- data/lib/puppet/functions/find_file.rb +9 -9
- data/lib/puppet/functions/inline_epp.rb +5 -5
- data/lib/puppet/gettext/module_translations.rb +1 -1
- data/lib/puppet/graph/rb_tree_map.rb +2 -2
- data/lib/puppet/graph/simple_graph.rb +4 -3
- data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
- data/lib/puppet/indirector/hiera.rb +2 -0
- data/lib/puppet/indirector/resource/ral.rb +1 -3
- data/lib/puppet/indirector/resource/validator.rb +1 -1
- data/lib/puppet/interface.rb +2 -1
- data/lib/puppet/loaders.rb +0 -1
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module.rb +1 -1
- data/lib/puppet/module/task.rb +20 -4
- data/lib/puppet/module_tool/applications/installer.rb +1 -1
- data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
- data/lib/puppet/module_tool/tar/mini.rb +1 -1
- data/lib/puppet/network/http/api/indirected_routes.rb +12 -11
- data/lib/puppet/network/http/connection.rb +10 -12
- data/lib/puppet/network/http/pool.rb +2 -0
- data/lib/puppet/network/http/site.rb +1 -1
- data/lib/puppet/network/resolver.rb +2 -2
- data/lib/puppet/node/environment.rb +4 -2
- data/lib/puppet/pal/pal_impl.rb +2 -2
- data/lib/puppet/parser/ast.rb +1 -1
- data/lib/puppet/parser/ast/resourceparam.rb +1 -1
- data/lib/puppet/parser/functions.rb +1 -1
- data/lib/puppet/parser/functions/epp.rb +3 -3
- data/lib/puppet/parser/functions/inline_epp.rb +5 -5
- data/lib/puppet/parser/scope.rb +8 -7
- data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
- data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
- data/lib/puppet/pops/loader/task_instantiator.rb +4 -0
- data/lib/puppet/pops/loaders.rb +1 -1
- data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
- data/lib/puppet/pops/merge_strategy.rb +22 -18
- data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
- data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/pn_parser.rb +17 -16
- data/lib/puppet/pops/puppet_stack.rb +51 -49
- data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
- data/lib/puppet/pops/types/string_converter.rb +10 -10
- data/lib/puppet/pops/types/types.rb +3 -3
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/property/ensure.rb +1 -1
- data/lib/puppet/provider/exec.rb +6 -2
- data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
- data/lib/puppet/provider/nameservice/pw.rb +2 -2
- data/lib/puppet/provider/package/apt.rb +5 -1
- data/lib/puppet/provider/package/dnfmodule.rb +87 -0
- data/lib/puppet/provider/package/dpkg.rb +34 -18
- data/lib/puppet/provider/package/openbsd.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +34 -9
- data/lib/puppet/provider/package/portage.rb +4 -4
- data/lib/puppet/provider/package/rpm.rb +5 -5
- data/lib/puppet/provider/package/windows/package.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/package_targetable.rb +5 -4
- data/lib/puppet/provider/parsedfile.rb +1 -1
- data/lib/puppet/provider/service/daemontools.rb +9 -9
- data/lib/puppet/provider/service/openbsd.rb +1 -1
- data/lib/puppet/provider/service/rcng.rb +2 -2
- data/lib/puppet/provider/service/runit.rb +2 -8
- data/lib/puppet/provider/service/systemd.rb +9 -9
- data/lib/puppet/provider/user/directoryservice.rb +1 -1
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/useradd.rb +22 -13
- data/lib/puppet/provider/user/windows_adsi.rb +4 -5
- data/lib/puppet/reference/indirection.rb +2 -2
- data/lib/puppet/reference/metaparameter.rb +1 -3
- data/lib/puppet/reference/providers.rb +1 -3
- data/lib/puppet/reference/type.rb +3 -9
- data/lib/puppet/reports.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/catalog.rb +1 -1
- data/lib/puppet/settings.rb +3 -3
- data/lib/puppet/settings/environment_conf.rb +1 -0
- data/lib/puppet/ssl/host.rb +1 -1
- data/lib/puppet/ssl/oids.rb +1 -1
- data/lib/puppet/transaction.rb +33 -11
- data/lib/puppet/transaction/report.rb +1 -1
- data/lib/puppet/type.rb +2 -4
- data/lib/puppet/type/exec.rb +7 -3
- data/lib/puppet/type/file.rb +1 -2
- data/lib/puppet/type/file/data_sync.rb +5 -1
- data/lib/puppet/type/group.rb +4 -2
- data/lib/puppet/type/notify.rb +3 -2
- data/lib/puppet/type/package.rb +10 -3
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/service.rb +1 -1
- data/lib/puppet/type/user.rb +4 -2
- data/lib/puppet/util.rb +35 -12
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +8 -14
- data/lib/puppet/util/log.rb +2 -2
- data/lib/puppet/util/log/destinations.rb +2 -2
- data/lib/puppet/util/logging.rb +32 -20
- data/lib/puppet/util/metric.rb +2 -2
- data/lib/puppet/util/provider_features.rb +2 -4
- data/lib/puppet/util/rdoc.rb +1 -1
- data/lib/puppet/util/reference.rb +1 -1
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/selinux.rb +3 -1
- data/lib/puppet/util/windows/adsi.rb +48 -18
- data/lib/puppet/util/windows/registry.rb +7 -5
- data/lib/puppet/vendor.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet/x509/cert_provider.rb +13 -6
- data/locales/puppet.pot +199 -159
- data/man/man5/puppet.conf.5 +35 -5
- 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 +2 -2
- data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list-installed.txt +11 -0
- data/spec/integration/configurer_spec.rb +52 -0
- data/spec/integration/type/notify_spec.rb +46 -0
- data/spec/lib/puppet/certificate_factory.rb +2 -2
- data/spec/spec_helper.rb +28 -0
- data/spec/unit/application/ssl_spec.rb +4 -7
- data/spec/unit/configurer_spec.rb +394 -398
- data/spec/unit/defaults_spec.rb +4 -4
- data/spec/unit/forge/forge_spec.rb +1 -3
- data/spec/unit/forge/repository_spec.rb +1 -3
- data/spec/unit/indirector/resource/ral_spec.rb +4 -4
- data/spec/unit/network/http/connection_spec.rb +119 -145
- data/spec/unit/parser/scope_spec.rb +10 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
- data/spec/unit/pops/loaders/module_loaders_spec.rb +37 -0
- data/spec/unit/provider/exec_spec.rb +209 -0
- data/spec/unit/provider/package/dnfmodule_spec.rb +186 -0
- data/spec/unit/provider/package/dpkg_spec.rb +238 -78
- data/spec/unit/provider/package/pip_spec.rb +51 -6
- data/spec/unit/provider/package/portage_spec.rb +4 -4
- data/spec/unit/provider/package_targetable_spec.rb +60 -0
- data/spec/unit/provider/service/daemontools_spec.rb +24 -0
- data/spec/unit/provider/service/runit_spec.rb +24 -0
- data/spec/unit/provider/service/systemd_spec.rb +25 -25
- data/spec/unit/provider/user/hpux_spec.rb +2 -2
- data/spec/unit/provider/user/useradd_spec.rb +46 -0
- data/spec/unit/ssl/host_spec.rb +0 -5
- data/spec/unit/ssl/state_machine_spec.rb +0 -6
- data/spec/unit/transaction_spec.rb +46 -0
- data/spec/unit/type/exec_spec.rb +6 -12
- data/spec/unit/type/file/content_spec.rb +9 -3
- data/spec/unit/type/file_spec.rb +9 -4
- data/spec/unit/type/package_spec.rb +5 -0
- data/spec/unit/util/execution_spec.rb +16 -0
- data/spec/unit/util/http_proxy_spec.rb +118 -27
- data/spec/unit/util/log/destinations_spec.rb +7 -3
- data/spec/unit/util/log_spec.rb +0 -138
- data/spec/unit/util/logging_spec.rb +200 -0
- data/spec/unit/util/windows/adsi_spec.rb +51 -0
- data/spec/unit/x509/cert_provider_spec.rb +24 -4
- data/tasks/manpages.rake +1 -0
- metadata +12 -10
- data/lib/puppet/pops/loader/null_loader.rb +0 -60
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +0 -24
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +0 -24
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +0 -24
@@ -180,7 +180,7 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
|
|
180
180
|
# If :ensure contains a version, use that instead of looking it up.
|
181
181
|
# This allows for installing packages with the same stem, but multiple
|
182
182
|
# version such as openldap-server.
|
183
|
-
if /(\d[^-]*)
|
183
|
+
if @resource[:ensure].to_s =~ /(\d[^-]*)$/
|
184
184
|
use_version = @resource[:ensure]
|
185
185
|
else
|
186
186
|
use_version = get_version
|
@@ -35,16 +35,25 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
35
35
|
if Puppet::Util::Platform.windows?
|
36
36
|
["pip.exe"]
|
37
37
|
else
|
38
|
-
["pip", "pip-python"]
|
38
|
+
["pip", "pip-python", "pip2", "pip-2"]
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
def self.pip_version(command)
|
43
|
-
|
43
|
+
version = nil
|
44
|
+
execpipe [quote(command), '--version'] do |process|
|
44
45
|
process.collect do |line|
|
45
|
-
|
46
|
+
md = line.strip.match(/^pip (\d+\.\d+\.?\d*).*$/)
|
47
|
+
if md
|
48
|
+
version = md[1]
|
49
|
+
break
|
50
|
+
end
|
46
51
|
end
|
47
52
|
end
|
53
|
+
|
54
|
+
raise Puppet::Error, _("Cannot resolve pip version") unless version
|
55
|
+
|
56
|
+
version
|
48
57
|
end
|
49
58
|
|
50
59
|
# Return an array of structured information about every installed package
|
@@ -101,7 +110,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
101
110
|
self.class.validate_command(command)
|
102
111
|
|
103
112
|
self.class.instances(command).each do |pkg|
|
104
|
-
return pkg.properties if @resource[:name].
|
113
|
+
return pkg.properties if @resource[:name].casecmp(pkg.name).zero?
|
105
114
|
end
|
106
115
|
return nil
|
107
116
|
end
|
@@ -121,14 +130,17 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
121
130
|
end
|
122
131
|
end
|
123
132
|
|
133
|
+
# Less resource-intensive approach for pip version 1.5.4 and newer.
|
134
|
+
|
124
135
|
def latest_with_new_pip
|
125
136
|
command = resource_or_provider_command
|
126
137
|
self.class.validate_command(command)
|
127
138
|
|
128
|
-
|
129
|
-
|
139
|
+
command_and_options = [command, 'install', "#{@resource[:name]}==versionplease"]
|
140
|
+
command_and_options << install_options if @resource[:install_options]
|
141
|
+
execpipe command_and_options do |process|
|
130
142
|
process.collect do |line|
|
131
|
-
# PIP OUTPUT: Could not find a version that satisfies the requirement
|
143
|
+
# PIP OUTPUT: Could not find a version that satisfies the requirement example==versionplease (from versions: 1.2.3, 4.5.6)
|
132
144
|
if line =~ /from versions: /
|
133
145
|
textAfterLastMatch = $'.chomp(")\n")
|
134
146
|
versionList = textAfterLastMatch.split(', ').sort do |x,y|
|
@@ -141,14 +153,18 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
141
153
|
end
|
142
154
|
end
|
143
155
|
|
156
|
+
# More resource-intensive approach for pip version 1.5.3 and older.
|
157
|
+
|
144
158
|
def latest_with_old_pip
|
145
159
|
command = resource_or_provider_command
|
146
160
|
self.class.validate_command(command)
|
147
161
|
|
148
162
|
Dir.mktmpdir("puppet_pip") do |dir|
|
149
|
-
|
163
|
+
command_and_options = [command, 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
|
164
|
+
command_and_options << install_options if @resource[:install_options]
|
165
|
+
execpipe command_and_options do |process|
|
150
166
|
process.collect do |line|
|
151
|
-
# PIP OUTPUT: Using version 0.10.1 (newest of versions:
|
167
|
+
# PIP OUTPUT: Using version 0.10.1 (newest of versions: 1.2.3, 4.5.6)
|
152
168
|
if line =~ /Using version (.+?) \(newest of versions/
|
153
169
|
return $1
|
154
170
|
end
|
@@ -208,4 +224,13 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
|
|
208
224
|
def install_options
|
209
225
|
join_options(@resource[:install_options])
|
210
226
|
end
|
227
|
+
|
228
|
+
def self.quote(path)
|
229
|
+
if path.include?(" ")
|
230
|
+
"\"#{path}\""
|
231
|
+
else
|
232
|
+
path
|
233
|
+
end
|
234
|
+
end
|
235
|
+
private_class_method :quote
|
211
236
|
end
|
@@ -69,7 +69,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
|
|
69
69
|
name = qatom[:pfx] + name if qatom[:pfx]
|
70
70
|
name = name + '-' + qatom[:pv] if qatom[:pv]
|
71
71
|
name = name + '-' + qatom[:pr] if qatom[:pr]
|
72
|
-
name = name + qatom[:slot] if qatom[:slot]
|
72
|
+
name = name + ':' + qatom[:slot] if qatom[:slot]
|
73
73
|
cmd << '--update' if [:latest].include?(should)
|
74
74
|
cmd += install_options if @resource[:install_options]
|
75
75
|
cmd << name
|
@@ -83,7 +83,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
|
|
83
83
|
name = qatom[:pfx] + name if qatom[:pfx]
|
84
84
|
name = name + '-' + qatom[:pv] if qatom[:pv]
|
85
85
|
name = name + '-' + qatom[:pr] if qatom[:pr]
|
86
|
-
name = name + qatom[:slot] if qatom[:slot]
|
86
|
+
name = name + ':' + qatom[:slot] if qatom[:slot]
|
87
87
|
cmd += uninstall_options if @resource[:uninstall_options]
|
88
88
|
cmd << name
|
89
89
|
if [:purged].include?(should)
|
@@ -177,7 +177,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
|
|
177
177
|
package_sets << package_set.to_s.strip
|
178
178
|
end
|
179
179
|
|
180
|
-
if @resource[:name]
|
180
|
+
if @resource[:name] =~ /^@/
|
181
181
|
if package_sets.include?(@resource[:name][1..-1].to_s)
|
182
182
|
return({:name => "#{@resource[:name]}", :ensure => '9999', :version_available => nil, :installed_versions => nil, :installable_versions => "9999,"})
|
183
183
|
end
|
@@ -257,7 +257,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
|
|
257
257
|
# [2.7.12: 2.7
|
258
258
|
# 3.4.5: 3.4
|
259
259
|
# 3.5.2: 3.5]
|
260
|
-
version_for_slot = versions_and_slots.find { |version_and_slot| version_and_slot.last == slot
|
260
|
+
version_for_slot = versions_and_slots.find { |version_and_slot| version_and_slot.last == slot }
|
261
261
|
# [3.5.2: 3.5]
|
262
262
|
version_for_slot.first if version_for_slot
|
263
263
|
# 3.5.2
|
@@ -228,14 +228,14 @@ These options should be specified as an array where each element is either a str
|
|
228
228
|
str2 = str2.gsub(front_strip_re, '')
|
229
229
|
|
230
230
|
# "handle the tilde separator, it sorts before everything else"
|
231
|
-
if
|
231
|
+
if str1 =~ /^~/ && str2 =~ /^~/
|
232
232
|
# if they both have ~, strip it
|
233
233
|
str1 = str1[1..-1]
|
234
234
|
str2 = str2[1..-1]
|
235
235
|
next
|
236
|
-
elsif
|
236
|
+
elsif str1 =~ /^~/
|
237
237
|
return -1
|
238
|
-
elsif
|
238
|
+
elsif str2 =~ /^~/
|
239
239
|
return 1
|
240
240
|
end
|
241
241
|
|
@@ -244,7 +244,7 @@ These options should be specified as an array where each element is either a str
|
|
244
244
|
# "grab first completely alpha or completely numeric segment"
|
245
245
|
isnum = false
|
246
246
|
# if the first char of str1 is a digit, grab the chunk of continuous digits from each string
|
247
|
-
if /^[0-9]
|
247
|
+
if str1 =~ /^[0-9]+/
|
248
248
|
if str1 =~ /^[0-9]+/
|
249
249
|
segment1 = $~.to_s
|
250
250
|
str1 = $~.post_match
|
@@ -339,7 +339,7 @@ These options should be specified as an array where each element is either a str
|
|
339
339
|
v = s[0,ri]
|
340
340
|
r = s[ri+1,s.length]
|
341
341
|
if arch = r.scan(ARCH_REGEX)[0]
|
342
|
-
a = arch.
|
342
|
+
a = arch.delete('.')
|
343
343
|
r.gsub!(ARCH_REGEX, '')
|
344
344
|
end
|
345
345
|
else
|
@@ -79,7 +79,7 @@ class Puppet::Provider::Package::Windows
|
|
79
79
|
|
80
80
|
def self.replace_forward_slashes(value)
|
81
81
|
if value.include?('/')
|
82
|
-
value = value.
|
82
|
+
value = value.tr('/', "\\")
|
83
83
|
Puppet.debug('Package source parameter contained /s - replaced with \\s')
|
84
84
|
end
|
85
85
|
value
|
@@ -92,7 +92,7 @@ defaultfor :osfamily => :redhat, :operatingsystemmajrelease => (4..7).to_a
|
|
92
92
|
updates = Hash.new { |h, k| h[k] = [] }
|
93
93
|
body.split.each_slice(3) do |tuple|
|
94
94
|
break if tuple[0] =~ /^(Obsoleting|Security:|Update)/
|
95
|
-
break unless tuple[1]
|
95
|
+
break unless tuple[1] =~ /^(?:(\d+):)?(\S+)-(\S+)$/
|
96
96
|
hash = update_to_hash(*tuple[0..1])
|
97
97
|
# Create entries for both the package name without a version and a
|
98
98
|
# version since yum considers those as mostly interchangeable.
|
@@ -25,24 +25,25 @@ require 'puppet/provider/package'
|
|
25
25
|
class Puppet::Provider::Package::Targetable < Puppet::Provider::Package
|
26
26
|
# Prefetch our package list, yo.
|
27
27
|
def self.prefetch(packages)
|
28
|
-
catalog_packages = packages.first
|
28
|
+
catalog_packages = packages.values.first.catalog.resources.select{ |p| p.provider.class == self }
|
29
29
|
package_commands = catalog_packages.map { |catalog_package| catalog_package::original_parameters[:command] }.uniq
|
30
30
|
package_commands.each do |command|
|
31
31
|
instances(command).each do |instance|
|
32
32
|
catalog_packages.each do |catalog_package|
|
33
|
-
if catalog_package[:name] == instance.name && catalog_package
|
33
|
+
if catalog_package[:name] == instance.name && catalog_package.original_parameters[:command] == command
|
34
34
|
catalog_package.provider = instance
|
35
|
-
self.debug "Prefetched instance: %{name} via command: %{
|
35
|
+
self.debug "Prefetched instance: %{name} via command: %{cmd}" % { name: instance.name, cmd: (command || :default) }
|
36
36
|
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
|
+
package_commands
|
40
41
|
end
|
41
42
|
|
42
43
|
# Returns the resource command or provider command.
|
43
44
|
|
44
45
|
def resource_or_provider_command
|
45
|
-
resource
|
46
|
+
resource.original_parameters[:command] || self.class.provider_command
|
46
47
|
end
|
47
48
|
|
48
49
|
# Targetable providers use has_command/is_optional to defer validation of provider suitability.
|
@@ -71,7 +71,7 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
|
|
71
71
|
|
72
72
|
flushed = []
|
73
73
|
begin
|
74
|
-
@modified.
|
74
|
+
@modified.sort_by(&:to_s).uniq.each do |target|
|
75
75
|
Puppet.debug "Flushing #{@resource_type.name} provider target #{target}"
|
76
76
|
flushed << target
|
77
77
|
flush_target(target)
|
@@ -46,14 +46,8 @@ Puppet::Type.type(:service).provide :daemontools, :parent => :base do
|
|
46
46
|
|
47
47
|
# Determine the daemon path.
|
48
48
|
def defpath
|
49
|
-
|
50
|
-
|
51
|
-
if Puppet::FileSystem.exist?(path)
|
52
|
-
@defpath = path
|
53
|
-
break
|
54
|
-
end
|
55
|
-
end
|
56
|
-
raise "Could not find the daemon directory (tested [/var/lib/service,/etc])" unless @defpath
|
49
|
+
@defpath ||= ["/var/lib/service", "/etc"].find do |path|
|
50
|
+
Puppet::FileSystem.exist?(path) && FileTest.directory?(path)
|
57
51
|
end
|
58
52
|
@defpath
|
59
53
|
end
|
@@ -65,6 +59,10 @@ Puppet::Type.type(:service).provide :daemontools, :parent => :base do
|
|
65
59
|
# ie enabled or not
|
66
60
|
def self.instances
|
67
61
|
path = self.defpath
|
62
|
+
unless path
|
63
|
+
Puppet.info("#{self.name} is unsuitable because service directory is nil")
|
64
|
+
return
|
65
|
+
end
|
68
66
|
unless FileTest.directory?(path)
|
69
67
|
Puppet.notice "Service path #{path} does not exist"
|
70
68
|
return
|
@@ -109,7 +107,9 @@ Puppet::Type.type(:service).provide :daemontools, :parent => :base do
|
|
109
107
|
# note that this path can be overridden in the resource
|
110
108
|
# definition
|
111
109
|
def daemon
|
112
|
-
|
110
|
+
path = resource[:path]
|
111
|
+
raise Puppet::Error.new("#{self.class.name} must specify a path for daemon directory") unless path
|
112
|
+
File.join(path, resource[:name])
|
113
113
|
end
|
114
114
|
|
115
115
|
def status
|
@@ -79,7 +79,7 @@ Puppet::Type.type(:service).provide :openbsd, :parent => :init do
|
|
79
79
|
def running?
|
80
80
|
output = execute([command(:rcctl), "check", @resource[:name]],
|
81
81
|
:failonfail => false, :combine => false, :squelch => false).chomp
|
82
|
-
return true if output
|
82
|
+
return true if output =~ /\(ok\)/
|
83
83
|
end
|
84
84
|
|
85
85
|
# Uses the wrapper to prevent failure when the service is not running;
|
@@ -17,7 +17,7 @@ Puppet::Type.type(:service).provide :rcng, :parent => :bsd do
|
|
17
17
|
if Puppet::FileSystem.exist?(rcfile)
|
18
18
|
File.open(rcfile).readlines.each do |line|
|
19
19
|
# Now look for something that looks like "service=${service:=YES}" or "service=YES"
|
20
|
-
if line
|
20
|
+
if line =~ /^\s*#{@resource[:name]}=(?:YES|\${#{@resource[:name]}:=YES})/
|
21
21
|
return :true
|
22
22
|
end
|
23
23
|
end
|
@@ -34,7 +34,7 @@ Puppet::Type.type(:service).provide :rcng, :parent => :bsd do
|
|
34
34
|
if Puppet::FileSystem.exist?(rcfile)
|
35
35
|
newcontents = []
|
36
36
|
File.open(rcfile).readlines.each do |line|
|
37
|
-
if line
|
37
|
+
if line =~ /^\s*#{@resource[:name]}=(NO|\$\{#{@resource[:name]}:NO\})/
|
38
38
|
line = "#{@resource[:name]}=${#{@resource[:name]}:=YES}"
|
39
39
|
end
|
40
40
|
newcontents.push(line)
|
@@ -40,14 +40,8 @@ Puppet::Type.type(:service).provide :runit, :parent => :daemontools do
|
|
40
40
|
# this is necessary to autodetect a valid resource
|
41
41
|
# default path, since there is no standard for such directory.
|
42
42
|
def defpath
|
43
|
-
|
44
|
-
|
45
|
-
if Puppet::FileSystem.exist?(path)
|
46
|
-
@defpath = path
|
47
|
-
break
|
48
|
-
end
|
49
|
-
end
|
50
|
-
raise "Could not find the daemon directory (tested [/etc/sv,/var/lib/service])" unless @defpath
|
43
|
+
@defpath ||= ["/var/lib/service", "/etc/sv"].find do |path|
|
44
|
+
Puppet::FileSystem.exist?(path) && FileTest.directory?(path)
|
51
45
|
end
|
52
46
|
@defpath
|
53
47
|
end
|
@@ -44,7 +44,7 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
44
44
|
# in the provider's believed state of the service and the actual state.
|
45
45
|
# @param action [String,Symbol] One of 'enable', 'disable', 'mask' or 'unmask'
|
46
46
|
def systemctl_change_enable(action)
|
47
|
-
output = systemctl(action, @resource[:name])
|
47
|
+
output = systemctl(action, '--', @resource[:name])
|
48
48
|
rescue
|
49
49
|
raise Puppet::Error, "Could not #{action} #{self.name}: #{output}", $!.backtrace
|
50
50
|
ensure
|
@@ -57,7 +57,7 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
57
57
|
|
58
58
|
def get_start_link_count
|
59
59
|
# Start links don't include '.service'. Just search for the service name.
|
60
|
-
if @resource[:name]
|
60
|
+
if @resource[:name] =~ /\.service/
|
61
61
|
link_name = @resource[:name].split('.')[0]
|
62
62
|
else
|
63
63
|
link_name = @resource[:name]
|
@@ -68,7 +68,7 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
68
68
|
|
69
69
|
def cached_enabled?
|
70
70
|
return @cached_enabled if @cached_enabled
|
71
|
-
cmd = [command(:systemctl), 'is-enabled', @resource[:name]]
|
71
|
+
cmd = [command(:systemctl), 'is-enabled', '--', @resource[:name]]
|
72
72
|
@cached_enabled = execute(cmd, :failonfail => false).strip
|
73
73
|
end
|
74
74
|
|
@@ -87,7 +87,7 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
87
87
|
# The indirect state indicates that the unit is not enabled.
|
88
88
|
return :false if output == 'indirect'
|
89
89
|
return :true if (code == 0)
|
90
|
-
if (output.empty?) && (code > 0) && (Facter.value(:osfamily).
|
90
|
+
if (output.empty?) && (code > 0) && (Facter.value(:osfamily).casecmp('debian').zero?)
|
91
91
|
ret = debian_enabled?
|
92
92
|
return ret if ret
|
93
93
|
end
|
@@ -127,7 +127,7 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
127
127
|
# This function is called only on start & restart unit options.
|
128
128
|
# Reference: (PUP-3483) Systemd provider doesn't scan for changed units
|
129
129
|
def daemon_reload?
|
130
|
-
cmd = [command(:systemctl), 'show',
|
130
|
+
cmd = [command(:systemctl), 'show', '--property=NeedDaemonReload', '--', @resource[:name]]
|
131
131
|
daemon_reload = execute(cmd, :failonfail => false).strip.split('=').last
|
132
132
|
if daemon_reload == 'yes'
|
133
133
|
daemon_reload_cmd = [command(:systemctl), 'daemon-reload']
|
@@ -150,20 +150,20 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
|
|
150
150
|
end
|
151
151
|
|
152
152
|
def restartcmd
|
153
|
-
[command(:systemctl), "restart", @resource[:name]]
|
153
|
+
[command(:systemctl), "restart", '--', @resource[:name]]
|
154
154
|
end
|
155
155
|
|
156
156
|
def startcmd
|
157
157
|
self.unmask
|
158
|
-
[command(:systemctl), "start", @resource[:name]]
|
158
|
+
[command(:systemctl), "start", '--', @resource[:name]]
|
159
159
|
end
|
160
160
|
|
161
161
|
def stopcmd
|
162
|
-
[command(:systemctl), "stop", @resource[:name]]
|
162
|
+
[command(:systemctl), "stop", '--', @resource[:name]]
|
163
163
|
end
|
164
164
|
|
165
165
|
def statuscmd
|
166
|
-
[command(:systemctl), "is-active", @resource[:name]]
|
166
|
+
[command(:systemctl), "is-active", '--', @resource[:name]]
|
167
167
|
end
|
168
168
|
|
169
169
|
def restart
|
@@ -503,7 +503,7 @@ Puppet::Type.type(:user).provide :directoryservice do
|
|
503
503
|
def next_system_id(min_id=20)
|
504
504
|
dscl_output = dscl '.', '-list', '/Users', 'uid'
|
505
505
|
# We're ok with throwing away negative uids here. Also, remove nil values.
|
506
|
-
user_ids = dscl_output.split.compact.collect { |l| l.to_i if l
|
506
|
+
user_ids = dscl_output.split.compact.collect { |l| l.to_i if l =~ /^\d+$/ }
|
507
507
|
ids = user_ids.compact!.sort! { |a,b| a.to_f <=> b.to_f }
|
508
508
|
# We're just looking for an unused id in our sorted array.
|
509
509
|
ids.each_index do |i|
|
@@ -29,7 +29,7 @@ Puppet::Type.type(:user).provide :hpuxuseradd, :parent => :useradd do
|
|
29
29
|
|
30
30
|
def modifycmd(param,value)
|
31
31
|
cmd = super(param, value)
|
32
|
-
cmd
|
32
|
+
cmd.insert(1,"-F")
|
33
33
|
if trusted then
|
34
34
|
# Append an additional command to reset the password age to 0
|
35
35
|
# until a workaround with expiry module can be found for trusted
|
@@ -36,7 +36,7 @@ Puppet::Type.type(:user).provide :user_role_add, :parent => :useradd, :source =>
|
|
36
36
|
has_features :manages_homedir, :allows_duplicates, :manages_solaris_rbac, :manages_passwords, :manages_password_age, :manages_shell
|
37
37
|
|
38
38
|
def check_valid_shell
|
39
|
-
unless File.
|
39
|
+
unless File.exist?(@resource.should(:shell))
|
40
40
|
raise(Puppet::Error, "Shell #{@resource.should(:shell)} must exist")
|
41
41
|
end
|
42
42
|
unless File.executable?(@resource.should(:shell).to_s)
|
@@ -55,35 +55,44 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
|
|
55
55
|
get(:uid)
|
56
56
|
end
|
57
57
|
|
58
|
+
def comment
|
59
|
+
return localcomment if @resource.forcelocal?
|
60
|
+
get(:comment)
|
61
|
+
end
|
62
|
+
|
58
63
|
def finduser(key, value)
|
59
64
|
passwd_file = "/etc/passwd"
|
60
|
-
passwd_keys = [
|
65
|
+
passwd_keys = [:account, :password, :uid, :gid, :gecos, :directory, :shell]
|
61
66
|
index = passwd_keys.index(key)
|
62
67
|
File.open(passwd_file) do |f|
|
63
68
|
f.each_line do |line|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
end
|
69
|
+
user = line.split(":")
|
70
|
+
if user[index] == value
|
71
|
+
return Hash[passwd_keys.zip(user)]
|
72
|
+
end
|
69
73
|
end
|
70
74
|
end
|
71
75
|
false
|
72
76
|
end
|
73
77
|
|
74
78
|
def local_username
|
75
|
-
finduser(
|
79
|
+
finduser(:uid, @resource.uid)
|
76
80
|
end
|
77
81
|
|
78
82
|
def localuid
|
79
|
-
user = finduser(
|
80
|
-
return user[
|
83
|
+
user = finduser(:account, resource[:name])
|
84
|
+
return user[:uid] if user
|
81
85
|
false
|
82
86
|
end
|
83
87
|
|
88
|
+
def localcomment
|
89
|
+
user = finduser(:account, resource[:name])
|
90
|
+
user[:gecos]
|
91
|
+
end
|
92
|
+
|
84
93
|
def shell=(value)
|
85
94
|
check_valid_shell
|
86
|
-
set(
|
95
|
+
set(:shell, value)
|
87
96
|
end
|
88
97
|
|
89
98
|
verify :gid, "GID must be an integer" do |value|
|
@@ -106,8 +115,8 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
|
|
106
115
|
# to ensure consistent behaviour of the useradd provider when
|
107
116
|
# using both useradd and luseradd
|
108
117
|
if (!@resource.allowdupe?) && @resource.forcelocal?
|
109
|
-
if @resource.should(:uid) && finduser(
|
110
|
-
raise(Puppet::Error, "UID #{@resource.should(:uid)
|
118
|
+
if @resource.should(:uid) && finduser(:uid, @resource.should(:uid).to_s)
|
119
|
+
raise(Puppet::Error, "UID #{@resource.should(:uid)} already exists, use allowdupe to force user creation")
|
111
120
|
end
|
112
121
|
elsif @resource.allowdupe? && (!@resource.forcelocal?)
|
113
122
|
return ["-o"]
|
@@ -116,7 +125,7 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
|
|
116
125
|
end
|
117
126
|
|
118
127
|
def check_valid_shell
|
119
|
-
unless File.
|
128
|
+
unless File.exist?(@resource.should(:shell))
|
120
129
|
raise(Puppet::Error, "Shell #{@resource.should(:shell)} must exist")
|
121
130
|
end
|
122
131
|
unless File.executable?(@resource.should(:shell).to_s)
|