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.

Files changed (221) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +1 -1
  3. data/Gemfile +4 -4
  4. data/Gemfile.lock +38 -32
  5. data/ext/build_defaults.yaml +1 -0
  6. data/ext/cert_inspector +3 -3
  7. data/ext/puppet-test +2 -2
  8. data/ext/regexp_nodes/regexp_nodes.rb +4 -4
  9. data/ext/windows/service/daemon.rb +38 -8
  10. data/install.rb +6 -6
  11. data/lib/puppet/application.rb +1 -1
  12. data/lib/puppet/application/apply.rb +2 -2
  13. data/lib/puppet/application/describe.rb +3 -9
  14. data/lib/puppet/application/doc.rb +1 -1
  15. data/lib/puppet/application/lookup.rb +1 -1
  16. data/lib/puppet/application/script.rb +2 -2
  17. data/lib/puppet/application/ssl.rb +4 -1
  18. data/lib/puppet/configurer.rb +86 -30
  19. data/lib/puppet/configurer/downloader.rb +2 -6
  20. data/lib/puppet/defaults.rb +32 -6
  21. data/lib/puppet/error.rb +9 -1
  22. data/lib/puppet/face/module/list.rb +5 -5
  23. data/lib/puppet/face/module/search.rb +1 -1
  24. data/lib/puppet/face/module/uninstall.rb +1 -1
  25. data/lib/puppet/face/module/upgrade.rb +1 -1
  26. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  27. data/lib/puppet/file_system.rb +0 -8
  28. data/lib/puppet/file_system/memory_file.rb +1 -1
  29. data/lib/puppet/file_system/posix.rb +3 -2
  30. data/lib/puppet/forge.rb +3 -3
  31. data/lib/puppet/functions.rb +1 -2
  32. data/lib/puppet/functions/camelcase.rb +2 -2
  33. data/lib/puppet/functions/epp.rb +4 -4
  34. data/lib/puppet/functions/find_file.rb +9 -9
  35. data/lib/puppet/functions/inline_epp.rb +5 -5
  36. data/lib/puppet/gettext/module_translations.rb +1 -1
  37. data/lib/puppet/graph/rb_tree_map.rb +2 -2
  38. data/lib/puppet/graph/simple_graph.rb +4 -3
  39. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  40. data/lib/puppet/indirector/hiera.rb +2 -0
  41. data/lib/puppet/indirector/resource/ral.rb +1 -3
  42. data/lib/puppet/indirector/resource/validator.rb +1 -1
  43. data/lib/puppet/interface.rb +2 -1
  44. data/lib/puppet/loaders.rb +0 -1
  45. data/lib/puppet/metatype/manager.rb +1 -1
  46. data/lib/puppet/module.rb +1 -1
  47. data/lib/puppet/module/task.rb +20 -4
  48. data/lib/puppet/module_tool/applications/installer.rb +1 -1
  49. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
  50. data/lib/puppet/module_tool/metadata.rb +1 -1
  51. data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
  52. data/lib/puppet/module_tool/tar/mini.rb +1 -1
  53. data/lib/puppet/network/http/api/indirected_routes.rb +12 -11
  54. data/lib/puppet/network/http/connection.rb +10 -12
  55. data/lib/puppet/network/http/pool.rb +2 -0
  56. data/lib/puppet/network/http/site.rb +1 -1
  57. data/lib/puppet/network/resolver.rb +2 -2
  58. data/lib/puppet/node/environment.rb +4 -2
  59. data/lib/puppet/pal/pal_impl.rb +2 -2
  60. data/lib/puppet/parser/ast.rb +1 -1
  61. data/lib/puppet/parser/ast/resourceparam.rb +1 -1
  62. data/lib/puppet/parser/functions.rb +1 -1
  63. data/lib/puppet/parser/functions/epp.rb +3 -3
  64. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  65. data/lib/puppet/parser/scope.rb +8 -7
  66. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
  67. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
  68. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
  69. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
  70. data/lib/puppet/pops/loader/task_instantiator.rb +4 -0
  71. data/lib/puppet/pops/loaders.rb +1 -1
  72. data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
  73. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  74. data/lib/puppet/pops/merge_strategy.rb +22 -18
  75. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  76. data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
  77. data/lib/puppet/pops/parser/locator.rb +1 -1
  78. data/lib/puppet/pops/parser/pn_parser.rb +17 -16
  79. data/lib/puppet/pops/puppet_stack.rb +51 -49
  80. data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
  81. data/lib/puppet/pops/types/string_converter.rb +10 -10
  82. data/lib/puppet/pops/types/types.rb +3 -3
  83. data/lib/puppet/property.rb +1 -1
  84. data/lib/puppet/property/ensure.rb +1 -1
  85. data/lib/puppet/provider/exec.rb +6 -2
  86. data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
  87. data/lib/puppet/provider/nameservice/pw.rb +2 -2
  88. data/lib/puppet/provider/package/apt.rb +5 -1
  89. data/lib/puppet/provider/package/dnfmodule.rb +87 -0
  90. data/lib/puppet/provider/package/dpkg.rb +34 -18
  91. data/lib/puppet/provider/package/openbsd.rb +1 -1
  92. data/lib/puppet/provider/package/pip.rb +34 -9
  93. data/lib/puppet/provider/package/portage.rb +4 -4
  94. data/lib/puppet/provider/package/rpm.rb +5 -5
  95. data/lib/puppet/provider/package/windows/package.rb +1 -1
  96. data/lib/puppet/provider/package/yum.rb +1 -1
  97. data/lib/puppet/provider/package_targetable.rb +5 -4
  98. data/lib/puppet/provider/parsedfile.rb +1 -1
  99. data/lib/puppet/provider/service/daemontools.rb +9 -9
  100. data/lib/puppet/provider/service/openbsd.rb +1 -1
  101. data/lib/puppet/provider/service/rcng.rb +2 -2
  102. data/lib/puppet/provider/service/runit.rb +2 -8
  103. data/lib/puppet/provider/service/systemd.rb +9 -9
  104. data/lib/puppet/provider/user/directoryservice.rb +1 -1
  105. data/lib/puppet/provider/user/hpux.rb +1 -1
  106. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  107. data/lib/puppet/provider/user/useradd.rb +22 -13
  108. data/lib/puppet/provider/user/windows_adsi.rb +4 -5
  109. data/lib/puppet/reference/indirection.rb +2 -2
  110. data/lib/puppet/reference/metaparameter.rb +1 -3
  111. data/lib/puppet/reference/providers.rb +1 -3
  112. data/lib/puppet/reference/type.rb +3 -9
  113. data/lib/puppet/reports.rb +1 -1
  114. data/lib/puppet/resource.rb +1 -1
  115. data/lib/puppet/resource/catalog.rb +1 -1
  116. data/lib/puppet/settings.rb +3 -3
  117. data/lib/puppet/settings/environment_conf.rb +1 -0
  118. data/lib/puppet/ssl/host.rb +1 -1
  119. data/lib/puppet/ssl/oids.rb +1 -1
  120. data/lib/puppet/transaction.rb +33 -11
  121. data/lib/puppet/transaction/report.rb +1 -1
  122. data/lib/puppet/type.rb +2 -4
  123. data/lib/puppet/type/exec.rb +7 -3
  124. data/lib/puppet/type/file.rb +1 -2
  125. data/lib/puppet/type/file/data_sync.rb +5 -1
  126. data/lib/puppet/type/group.rb +4 -2
  127. data/lib/puppet/type/notify.rb +3 -2
  128. data/lib/puppet/type/package.rb +10 -3
  129. data/lib/puppet/type/schedule.rb +1 -1
  130. data/lib/puppet/type/service.rb +1 -1
  131. data/lib/puppet/type/user.rb +4 -2
  132. data/lib/puppet/util.rb +35 -12
  133. data/lib/puppet/util/command_line/trollop.rb +1 -1
  134. data/lib/puppet/util/http_proxy.rb +8 -14
  135. data/lib/puppet/util/log.rb +2 -2
  136. data/lib/puppet/util/log/destinations.rb +2 -2
  137. data/lib/puppet/util/logging.rb +32 -20
  138. data/lib/puppet/util/metric.rb +2 -2
  139. data/lib/puppet/util/provider_features.rb +2 -4
  140. data/lib/puppet/util/rdoc.rb +1 -1
  141. data/lib/puppet/util/reference.rb +1 -1
  142. data/lib/puppet/util/resource_template.rb +1 -1
  143. data/lib/puppet/util/selinux.rb +3 -1
  144. data/lib/puppet/util/windows/adsi.rb +48 -18
  145. data/lib/puppet/util/windows/registry.rb +7 -5
  146. data/lib/puppet/vendor.rb +1 -1
  147. data/lib/puppet/version.rb +1 -1
  148. data/lib/puppet/x509/cert_provider.rb +13 -6
  149. data/locales/puppet.pot +199 -159
  150. data/man/man5/puppet.conf.5 +35 -5
  151. data/man/man8/puppet-agent.8 +1 -1
  152. data/man/man8/puppet-apply.8 +1 -1
  153. data/man/man8/puppet-catalog.8 +1 -1
  154. data/man/man8/puppet-config.8 +1 -1
  155. data/man/man8/puppet-describe.8 +1 -1
  156. data/man/man8/puppet-device.8 +1 -1
  157. data/man/man8/puppet-doc.8 +1 -1
  158. data/man/man8/puppet-epp.8 +1 -1
  159. data/man/man8/puppet-facts.8 +1 -1
  160. data/man/man8/puppet-filebucket.8 +1 -1
  161. data/man/man8/puppet-generate.8 +1 -1
  162. data/man/man8/puppet-help.8 +1 -1
  163. data/man/man8/puppet-key.8 +1 -1
  164. data/man/man8/puppet-lookup.8 +1 -1
  165. data/man/man8/puppet-man.8 +1 -1
  166. data/man/man8/puppet-module.8 +1 -1
  167. data/man/man8/puppet-node.8 +1 -1
  168. data/man/man8/puppet-parser.8 +1 -1
  169. data/man/man8/puppet-plugin.8 +1 -1
  170. data/man/man8/puppet-report.8 +1 -1
  171. data/man/man8/puppet-resource.8 +1 -1
  172. data/man/man8/puppet-script.8 +1 -1
  173. data/man/man8/puppet-ssl.8 +1 -1
  174. data/man/man8/puppet-status.8 +1 -1
  175. data/man/man8/puppet.8 +2 -2
  176. data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list-installed.txt +11 -0
  177. data/spec/integration/configurer_spec.rb +52 -0
  178. data/spec/integration/type/notify_spec.rb +46 -0
  179. data/spec/lib/puppet/certificate_factory.rb +2 -2
  180. data/spec/spec_helper.rb +28 -0
  181. data/spec/unit/application/ssl_spec.rb +4 -7
  182. data/spec/unit/configurer_spec.rb +394 -398
  183. data/spec/unit/defaults_spec.rb +4 -4
  184. data/spec/unit/forge/forge_spec.rb +1 -3
  185. data/spec/unit/forge/repository_spec.rb +1 -3
  186. data/spec/unit/indirector/resource/ral_spec.rb +4 -4
  187. data/spec/unit/network/http/connection_spec.rb +119 -145
  188. data/spec/unit/parser/scope_spec.rb +10 -0
  189. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  190. data/spec/unit/pops/loaders/module_loaders_spec.rb +37 -0
  191. data/spec/unit/provider/exec_spec.rb +209 -0
  192. data/spec/unit/provider/package/dnfmodule_spec.rb +186 -0
  193. data/spec/unit/provider/package/dpkg_spec.rb +238 -78
  194. data/spec/unit/provider/package/pip_spec.rb +51 -6
  195. data/spec/unit/provider/package/portage_spec.rb +4 -4
  196. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  197. data/spec/unit/provider/service/daemontools_spec.rb +24 -0
  198. data/spec/unit/provider/service/runit_spec.rb +24 -0
  199. data/spec/unit/provider/service/systemd_spec.rb +25 -25
  200. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  201. data/spec/unit/provider/user/useradd_spec.rb +46 -0
  202. data/spec/unit/ssl/host_spec.rb +0 -5
  203. data/spec/unit/ssl/state_machine_spec.rb +0 -6
  204. data/spec/unit/transaction_spec.rb +46 -0
  205. data/spec/unit/type/exec_spec.rb +6 -12
  206. data/spec/unit/type/file/content_spec.rb +9 -3
  207. data/spec/unit/type/file_spec.rb +9 -4
  208. data/spec/unit/type/package_spec.rb +5 -0
  209. data/spec/unit/util/execution_spec.rb +16 -0
  210. data/spec/unit/util/http_proxy_spec.rb +118 -27
  211. data/spec/unit/util/log/destinations_spec.rb +7 -3
  212. data/spec/unit/util/log_spec.rb +0 -138
  213. data/spec/unit/util/logging_spec.rb +200 -0
  214. data/spec/unit/util/windows/adsi_spec.rb +51 -0
  215. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  216. data/tasks/manpages.rake +1 -0
  217. metadata +12 -10
  218. data/lib/puppet/pops/loader/null_loader.rb +0 -60
  219. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +0 -24
  220. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +0 -24
  221. 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[^-]*)$/.match(@resource[:ensure].to_s)
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
- execpipe [command, '--version'] do |process|
43
+ version = nil
44
+ execpipe [quote(command), '--version'] do |process|
44
45
  process.collect do |line|
45
- return line.strip.match(/^pip (\d+\.\d+\.?\d*).*$/)[1]
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].downcase == pkg.name.downcase
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
- # Less resource intensive approach for pip version 1.5.4 and above
129
- execpipe [command, "install", "#{@resource[:name]}==versionplease"] do |process|
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 Django==versionplease (from versions: 1.1.3, 1.8rc1)
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
- execpipe [command, "install", "#{@resource[:name]}", "-d", "#{dir}", "-v"] do |process|
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: 0.10.1, 0.10, 0.9, 0.8.1, 0.8, 0.7.2, 0.7.1, 0.7, 0.6.1, 0.6, 0.5.2, 0.5.1, 0.5, 0.4, 0.3.1, 0.3, 0.2, 0.1)
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].match(/^@/)
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[1..-1] }
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 /^~/.match(str1) && /^~/.match(str2)
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 /^~/.match(str1)
236
+ elsif str1 =~ /^~/
237
237
  return -1
238
- elsif /^~/.match(str2)
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]+/.match(str1)
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.gsub(/\./, '')
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.gsub('/', "\\")
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].match(/^(?:(\d+):)?(\S+)-(\S+)$/)
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[1]::catalog::resources.select{ |p| p.provider.class == self }
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::original_parameters[:command] == command
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: %{command}" % { name: instance.name, cmd: (command || :default)}
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::original_parameters[:command] || self.class.provider_command
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.sort { |a,b| a.to_s <=> b.to_s }.uniq.each do |target|
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
- unless @defpath
50
- ["/var/lib/service", "/etc"].each do |path|
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
- File.join(resource[:path], resource[:name])
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.match(/\(ok\)/)
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.match(/^\s*#{@resource[:name]}=(?:YES|\${#{@resource[:name]}:=YES})/)
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.match(/^\s*#{@resource[:name]}=(NO|\$\{#{@resource[:name]}:NO\})/)
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
- unless @defpath
44
- ["/etc/sv", "/var/lib/service"].each do |path|
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].match(/\.service/)
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).downcase == 'debian')
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', @resource[:name], '--property=NeedDaemonReload']
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.match(/^\d+$/) }
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 << "-F"
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.exists?(@resource.should(:shell))
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 = ['account', 'password', 'uid', 'gid', 'gecos', 'directory', 'shell']
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
- user = line.split(":")
65
- if user[index] == value
66
- f.close
67
- return user
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('uid', @resource.uid)
79
+ finduser(:uid, @resource.uid)
76
80
  end
77
81
 
78
82
  def localuid
79
- user = finduser('account', resource[:name])
80
- return user[2] if 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("shell", value)
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('uid', @resource.should(:uid).to_s)
110
- raise(Puppet::Error, "UID #{@resource.should(:uid).to_s} already exists, use allowdupe to force user creation")
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.exists?(@resource.should(:shell))
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)