puppet 5.5.17-x86-mingw32 → 5.5.18-x86-mingw32

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 (225) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +1 -1
  3. data/Gemfile +2 -3
  4. data/Gemfile.lock +35 -31
  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 +54 -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/configurer.rb +86 -28
  18. data/lib/puppet/configurer/downloader.rb +2 -6
  19. data/lib/puppet/defaults.rb +17 -4
  20. data/lib/puppet/error.rb +9 -1
  21. data/lib/puppet/external/nagios/base.rb +1 -1
  22. data/lib/puppet/face/ca.rb +1 -1
  23. data/lib/puppet/face/module/list.rb +5 -5
  24. data/lib/puppet/face/module/search.rb +1 -1
  25. data/lib/puppet/face/module/uninstall.rb +1 -1
  26. data/lib/puppet/face/module/upgrade.rb +1 -1
  27. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  28. data/lib/puppet/file_system.rb +0 -8
  29. data/lib/puppet/file_system/memory_file.rb +1 -1
  30. data/lib/puppet/file_system/posix.rb +3 -2
  31. data/lib/puppet/forge.rb +3 -3
  32. data/lib/puppet/functions/epp.rb +4 -4
  33. data/lib/puppet/functions/inline_epp.rb +5 -5
  34. data/lib/puppet/gettext/module_translations.rb +1 -1
  35. data/lib/puppet/graph/rb_tree_map.rb +2 -2
  36. data/lib/puppet/graph/simple_graph.rb +6 -5
  37. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  38. data/lib/puppet/indirector/hiera.rb +2 -0
  39. data/lib/puppet/indirector/resource/ral.rb +1 -3
  40. data/lib/puppet/indirector/resource/validator.rb +1 -1
  41. data/lib/puppet/interface.rb +2 -1
  42. data/lib/puppet/loaders.rb +0 -1
  43. data/lib/puppet/metatype/manager.rb +1 -1
  44. data/lib/puppet/module.rb +1 -1
  45. data/lib/puppet/module_tool/applications/builder.rb +1 -1
  46. data/lib/puppet/module_tool/applications/installer.rb +1 -1
  47. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
  48. data/lib/puppet/module_tool/metadata.rb +1 -1
  49. data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
  50. data/lib/puppet/module_tool/tar/mini.rb +1 -1
  51. data/lib/puppet/network/http/api/indirected_routes.rb +12 -11
  52. data/lib/puppet/network/http/connection.rb +10 -12
  53. data/lib/puppet/network/http/pool.rb +2 -0
  54. data/lib/puppet/network/http/rack/rest.rb +2 -2
  55. data/lib/puppet/network/http/site.rb +1 -1
  56. data/lib/puppet/network/resolver.rb +2 -2
  57. data/lib/puppet/node/environment.rb +4 -2
  58. data/lib/puppet/parser/ast.rb +1 -1
  59. data/lib/puppet/parser/ast/resourceparam.rb +1 -1
  60. data/lib/puppet/parser/functions.rb +1 -1
  61. data/lib/puppet/parser/functions/epp.rb +3 -3
  62. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  63. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
  64. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
  65. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
  66. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
  67. data/lib/puppet/pops/loaders.rb +1 -1
  68. data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
  69. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  70. data/lib/puppet/pops/merge_strategy.rb +22 -18
  71. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  72. data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
  73. data/lib/puppet/pops/parser/locator.rb +1 -1
  74. data/lib/puppet/pops/parser/pn_parser.rb +17 -16
  75. data/lib/puppet/pops/puppet_stack.rb +51 -48
  76. data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
  77. data/lib/puppet/pops/types/string_converter.rb +10 -10
  78. data/lib/puppet/pops/types/types.rb +3 -3
  79. data/lib/puppet/property.rb +1 -1
  80. data/lib/puppet/property/ensure.rb +1 -1
  81. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  82. data/lib/puppet/provider/cron/crontab.rb +1 -1
  83. data/lib/puppet/provider/exec.rb +6 -2
  84. data/lib/puppet/provider/mount.rb +1 -1
  85. data/lib/puppet/provider/mount/parsed.rb +8 -8
  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/dnfmodule.rb +87 -0
  89. data/lib/puppet/provider/package/dpkg.rb +3 -12
  90. data/lib/puppet/provider/package/openbsd.rb +1 -1
  91. data/lib/puppet/provider/package/pip.rb +34 -9
  92. data/lib/puppet/provider/package/portage.rb +4 -4
  93. data/lib/puppet/provider/package/rpm.rb +6 -6
  94. data/lib/puppet/provider/package/windows/package.rb +1 -1
  95. data/lib/puppet/provider/package/yum.rb +1 -1
  96. data/lib/puppet/provider/package_targetable.rb +5 -4
  97. data/lib/puppet/provider/parsedfile.rb +1 -1
  98. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +3 -3
  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 +8 -8
  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/provider/yumrepo/inifile.rb +2 -2
  110. data/lib/puppet/reference/indirection.rb +2 -2
  111. data/lib/puppet/reference/metaparameter.rb +1 -3
  112. data/lib/puppet/reference/providers.rb +1 -1
  113. data/lib/puppet/reference/type.rb +3 -9
  114. data/lib/puppet/reports.rb +1 -1
  115. data/lib/puppet/resource.rb +1 -1
  116. data/lib/puppet/resource/catalog.rb +1 -1
  117. data/lib/puppet/settings.rb +3 -3
  118. data/lib/puppet/settings/environment_conf.rb +1 -0
  119. data/lib/puppet/ssl/certificate_authority/interface.rb +1 -1
  120. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  121. data/lib/puppet/ssl/host.rb +3 -3
  122. data/lib/puppet/ssl/oids.rb +1 -1
  123. data/lib/puppet/transaction/report.rb +1 -1
  124. data/lib/puppet/type.rb +2 -4
  125. data/lib/puppet/type/cron.rb +1 -1
  126. data/lib/puppet/type/exec.rb +7 -3
  127. data/lib/puppet/type/file.rb +1 -2
  128. data/lib/puppet/type/file/data_sync.rb +5 -1
  129. data/lib/puppet/type/group.rb +4 -2
  130. data/lib/puppet/type/interface.rb +1 -1
  131. data/lib/puppet/type/notify.rb +3 -2
  132. data/lib/puppet/type/package.rb +2 -2
  133. data/lib/puppet/type/schedule.rb +1 -1
  134. data/lib/puppet/type/selboolean.rb +17 -3
  135. data/lib/puppet/type/service.rb +1 -1
  136. data/lib/puppet/type/user.rb +4 -2
  137. data/lib/puppet/util.rb +35 -12
  138. data/lib/puppet/util/command_line/trollop.rb +1 -1
  139. data/lib/puppet/util/http_proxy.rb +8 -14
  140. data/lib/puppet/util/instance_loader.rb +1 -1
  141. data/lib/puppet/util/log.rb +1 -1
  142. data/lib/puppet/util/log/destinations.rb +2 -2
  143. data/lib/puppet/util/logging.rb +30 -18
  144. data/lib/puppet/util/metric.rb +2 -2
  145. data/lib/puppet/util/monkey_patches.rb +1 -1
  146. data/lib/puppet/util/nagios_maker.rb +2 -2
  147. data/lib/puppet/util/network_device/cisco/device.rb +1 -1
  148. data/lib/puppet/util/network_device/cisco/interface.rb +2 -2
  149. data/lib/puppet/util/network_device/transport/ssh.rb +1 -1
  150. data/lib/puppet/util/provider_features.rb +2 -4
  151. data/lib/puppet/util/rdoc.rb +1 -1
  152. data/lib/puppet/util/reference.rb +1 -1
  153. data/lib/puppet/util/resource_template.rb +1 -1
  154. data/lib/puppet/util/selinux.rb +3 -1
  155. data/lib/puppet/util/windows/adsi.rb +58 -28
  156. data/lib/puppet/util/windows/registry.rb +7 -5
  157. data/lib/puppet/vendor.rb +1 -1
  158. data/lib/puppet/version.rb +1 -1
  159. data/lib/puppet_pal.rb +2 -2
  160. data/locales/puppet.pot +115 -95
  161. data/man/man5/puppet.conf.5 +21 -5
  162. data/man/man8/puppet-agent.8 +1 -1
  163. data/man/man8/puppet-apply.8 +1 -1
  164. data/man/man8/puppet-ca.8 +1 -1
  165. data/man/man8/puppet-catalog.8 +1 -1
  166. data/man/man8/puppet-cert.8 +1 -1
  167. data/man/man8/puppet-certificate.8 +1 -1
  168. data/man/man8/puppet-certificate_request.8 +1 -1
  169. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  170. data/man/man8/puppet-config.8 +1 -1
  171. data/man/man8/puppet-describe.8 +1 -1
  172. data/man/man8/puppet-device.8 +1 -1
  173. data/man/man8/puppet-doc.8 +1 -1
  174. data/man/man8/puppet-epp.8 +1 -1
  175. data/man/man8/puppet-facts.8 +1 -1
  176. data/man/man8/puppet-filebucket.8 +1 -1
  177. data/man/man8/puppet-generate.8 +1 -1
  178. data/man/man8/puppet-help.8 +1 -1
  179. data/man/man8/puppet-key.8 +1 -1
  180. data/man/man8/puppet-lookup.8 +1 -1
  181. data/man/man8/puppet-man.8 +1 -1
  182. data/man/man8/puppet-master.8 +1 -1
  183. data/man/man8/puppet-module.8 +1 -1
  184. data/man/man8/puppet-node.8 +1 -1
  185. data/man/man8/puppet-parser.8 +1 -1
  186. data/man/man8/puppet-plugin.8 +1 -1
  187. data/man/man8/puppet-report.8 +1 -1
  188. data/man/man8/puppet-resource.8 +1 -1
  189. data/man/man8/puppet-script.8 +1 -1
  190. data/man/man8/puppet-status.8 +1 -1
  191. data/man/man8/puppet.8 +2 -2
  192. data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list-installed.txt +11 -0
  193. data/spec/integration/configurer_spec.rb +52 -0
  194. data/spec/integration/type/notify_spec.rb +46 -0
  195. data/spec/unit/configurer_spec.rb +380 -397
  196. data/spec/unit/forge/forge_spec.rb +1 -3
  197. data/spec/unit/forge/repository_spec.rb +1 -3
  198. data/spec/unit/indirector/resource/ral_spec.rb +4 -4
  199. data/spec/unit/network/http/connection_spec.rb +26 -0
  200. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  201. data/spec/unit/provider/exec_spec.rb +209 -0
  202. data/spec/unit/provider/package/dnfmodule_spec.rb +186 -0
  203. data/spec/unit/provider/package/dpkg_spec.rb +15 -3
  204. data/spec/unit/provider/package/pip_spec.rb +51 -6
  205. data/spec/unit/provider/package/portage_spec.rb +4 -4
  206. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  207. data/spec/unit/provider/service/daemontools_spec.rb +24 -0
  208. data/spec/unit/provider/service/runit_spec.rb +24 -0
  209. data/spec/unit/provider/service/systemd_spec.rb +22 -22
  210. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  211. data/spec/unit/provider/user/useradd_spec.rb +46 -0
  212. data/spec/unit/type/exec_spec.rb +6 -12
  213. data/spec/unit/type/file/content_spec.rb +9 -3
  214. data/spec/unit/type/file_spec.rb +9 -4
  215. data/spec/unit/type/selboolean_spec.rb +4 -6
  216. data/spec/unit/util/execution_spec.rb +16 -0
  217. data/spec/unit/util/http_proxy_spec.rb +97 -0
  218. data/spec/unit/util/log/destinations_spec.rb +7 -3
  219. data/spec/unit/util/log_spec.rb +0 -138
  220. data/spec/unit/util/logging_spec.rb +200 -0
  221. data/spec/unit/util/windows/adsi_spec.rb +51 -0
  222. data/tasks/manpages.rake +1 -0
  223. metadata +12 -5
  224. data/lib/puppet/pops/loader/null_loader.rb +0 -60
  225. data/locales/ja/puppet.po +0 -12114
@@ -340,7 +340,7 @@ class PAnyType < TypedModelObject
340
340
  # @raises ArgumentError
341
341
  #
342
342
  def self.new_function(type)
343
- raise ArgumentError.new("Creation of new instance of type '#{type.to_s}' is not supported")
343
+ raise ArgumentError.new("Creation of new instance of type '#{type}' is not supported")
344
344
  end
345
345
 
346
346
  # Answers the question if instances of this type can represent themselves as a string that
@@ -1268,7 +1268,7 @@ class PFloatType < PNumericType
1268
1268
  else
1269
1269
  begin
1270
1270
  # support a binary as float
1271
- if from[0] == '0' && from[1].downcase == 'b'
1271
+ if from[0] == '0' && from[1].casecmp('b').zero?
1272
1272
  from = Integer(from)
1273
1273
  end
1274
1274
  Float(from)
@@ -1699,7 +1699,7 @@ class PRegexpType < PScalarType
1699
1699
  # @param regexp [Regexp] the regular expression
1700
1700
  # @return [String] the Regexp as a slash delimited string with slashes escaped
1701
1701
  def self.regexp_to_s_with_delimiters(regexp)
1702
- regexp.options == 0 ? regexp.inspect : "/#{regexp.to_s}/"
1702
+ regexp.options == 0 ? regexp.inspect : "/#{regexp}/"
1703
1703
  end
1704
1704
 
1705
1705
  # @param regexp [Regexp] the regular expression
@@ -209,7 +209,7 @@ class Puppet::Property < Puppet::Parameter
209
209
  else
210
210
  return "#{name} changed #{is_to_s(current_value)} to #{should_to_s(newvalue)}"
211
211
  end
212
- rescue Puppet::Error, Puppet::DevError
212
+ rescue Puppet::Error
213
213
  raise
214
214
  rescue => detail
215
215
  message = _("Could not convert change '%{name}' to string: %{detail}") % { name: name, detail: detail }
@@ -56,7 +56,7 @@ class Puppet::Property::Ensure < Puppet::Property
56
56
  else
57
57
  return _('%{name} changed %{is} to %{should}') % { name: name, is: is_to_s(currentvalue), should: should_to_s(newvalue) }
58
58
  end
59
- rescue Puppet::Error, Puppet::DevError
59
+ rescue Puppet::Error
60
60
  raise
61
61
  rescue => detail
62
62
  raise Puppet::DevError, _("Could not convert change %{name} to string: %{detail}") % { name: self.name, detail: detail }, detail.backtrace
@@ -103,7 +103,7 @@ Puppet::Type.type(:augeas).provide(:augeas) do
103
103
  inSingleTick = !inSingleTick if ch == "'"
104
104
  inDoubleTick = !inDoubleTick if ch == "\""
105
105
  fail(_("unmatched [")) if nbracket < 0
106
- end until ((nbracket == 0 && !inSingleTick && !inDoubleTick && (ch =~ /\s/)) || sc.eos?)
106
+ end until ((nbracket == 0 && !inSingleTick && !inDoubleTick && (ch =~ /\s/)) || sc.eos?) # rubocop:disable Lint/Loop
107
107
  len = sc.pos - start
108
108
  len -= 1 unless sc.eos?
109
109
  unless p = sc.string[start, len]
@@ -212,7 +212,7 @@ Puppet::Type.type(:cron).provide(:crontab, :parent => Puppet::Provider::ParsedFi
212
212
  else
213
213
  cmd_string = record[:command].gsub(/\s+/, "_")
214
214
  index = ( @name_index += 1 )
215
- record[:name] = "unmanaged:#{cmd_string}-#{ index.to_s }"
215
+ record[:name] = "unmanaged:#{cmd_string}-#{ index }"
216
216
  record[:unmanaged] = true
217
217
  end
218
218
  if envs.nil? or envs.empty?
@@ -47,7 +47,11 @@ class Puppet::Provider::Exec < Puppet::Provider
47
47
  # This is backwards compatible all the way to Ruby 1.8.7.
48
48
  Timeout::timeout(resource[:timeout], Timeout::Error) do
49
49
  cwd = resource[:cwd]
50
- cwd ||= Dir.pwd
50
+ # It's ok if cwd is nil. In that case Puppet::Util::Execution.execute() simply will not attempt to
51
+ # change the working directory, which is exactly the right behavior when no cwd parameter is
52
+ # expressed on the resource. Moreover, attempting to change to the directory that is already
53
+ # the working directory can fail under some circumstances, so avoiding the directory change attempt
54
+ # is preferable to defaulting cwd to that directory.
51
55
 
52
56
  # note that we are passing "false" for the "override_locale" parameter, which ensures that the user's
53
57
  # default/system locale will be respected. Callers may override this behavior by setting locale-related
@@ -88,6 +92,6 @@ class Puppet::Provider::Exec < Puppet::Provider
88
92
  def validatecmd(command)
89
93
  exe = extractexe(command)
90
94
  # if we're not fully qualified, require a path
91
- self.fail _("'%{command}' is not qualified and no path was specified. Please qualify the command or specify a path.") % { command: command } if !absolute_path?(exe) and resource[:path].nil?
95
+ self.fail _("'%{exe}' is not qualified and no path was specified. Please qualify the command or specify a path.") % { exe: exe } if !absolute_path?(exe) and resource[:path].nil?
92
96
  end
93
97
  end
@@ -30,7 +30,7 @@ module Puppet::Provider::Mount
30
30
  supports_remounts = (resource[:remounts] == :true)
31
31
  if supports_remounts && os == 'AIX'
32
32
  remount_with_option("remount")
33
- elsif os.match(/^(FreeBSD|DragonFly|OpenBSD)$/)
33
+ elsif os =~ /^(FreeBSD|DragonFly|OpenBSD)$/
34
34
  remount_with_option("update")
35
35
  elsif supports_remounts
36
36
  mountcmd "-o", "remount", resource[:name]
@@ -56,15 +56,15 @@ Puppet::Type.type(:mount).provide(
56
56
  filesystem_index = 0
57
57
  ret = Array.new
58
58
  lines.each_with_index do |line,i|
59
- if line.match(%r{^\S+:})
59
+ if line =~ %r{^\S+:}
60
60
  # Begin new filesystem stanza and save the index
61
61
  ret[filesystem_index] = filesystem_stanza.join("\n") if filesystem_stanza
62
62
  filesystem_stanza = Array(line)
63
63
  filesystem_index = i
64
64
  # Eat the preceding blank line
65
- ret[i-1] = nil if i > 0 and ret[i-1] and ret[i-1].match(%r{^\s*$})
65
+ ret[i-1] = nil if i > 0 and ret[i-1] and ret[i-1] =~ %r{^\s*$}
66
66
  nil
67
- elsif line.match(%r{^(\s*\*.*|\s*)$})
67
+ elsif line =~ %r{^(\s*\*.*|\s*)$}
68
68
  # Just a comment or blank line; add in place
69
69
  ret[i] = line
70
70
  else
@@ -75,7 +75,7 @@ Puppet::Type.type(:mount).provide(
75
75
  # Add the final stanza to the return
76
76
  ret[filesystem_index] = filesystem_stanza.join("\n") if filesystem_stanza
77
77
  ret = ret.compact.flatten
78
- ret.reject { |line| line.match(/^\* HEADER/) }
78
+ ret.reject { |line| line =~ /^\* HEADER/ }
79
79
  end
80
80
  def self.header
81
81
  super.gsub(/^#/,'*')
@@ -104,7 +104,7 @@ Puppet::Type.type(:mount).provide(
104
104
  special_options = Array.new
105
105
  result[:name] = memo[:name].sub(%r{:\s*$},'').strip
106
106
  memo.each do |_,k_v|
107
- if k_v and k_v.is_a?(String) and k_v.match("=")
107
+ if k_v and k_v.is_a?(String) and k_v.include?("=")
108
108
  attr_name, attr_value = k_v.split("=",2).map(&:strip)
109
109
  if attr_map_name = property_map[attr_name.to_sym]
110
110
  # These are normal "options" options (see `man filesystems`)
@@ -135,10 +135,10 @@ Puppet::Type.type(:mount).provide(
135
135
  def to_line(result)
136
136
  output = Array.new
137
137
  output << "#{result[:name]}:"
138
- if result[:device] and result[:device].match(%r{^/})
138
+ if result[:device] and result[:device] =~ %r{^/}
139
139
  output << "\tdev\t\t= #{result[:device]}"
140
140
  elsif result[:device] and result[:device] != :absent
141
- if ! result[:device].match(%{^.+:/})
141
+ if ! result[:device] =~ %{^.+:/}
142
142
  # Just skip this entry; it was malformed to begin with
143
143
  Puppet.err _("Mount[%{name}]: Field 'device' must be in the format of <absolute path> or <host>:<absolute path>") % { name: result[:name] }
144
144
  return result[:line]
@@ -161,7 +161,7 @@ Puppet::Type.type(:mount).provide(
161
161
  if result[:options]
162
162
  options = result[:options].split(',')
163
163
  special_options = options.select do |x|
164
- x.match('=') and
164
+ x.include?('=') and
165
165
  ["account", "boot", "check", "free", "mount", "size", "type",
166
166
  "vol", "log", "quota"].include? x.split('=').first
167
167
  end
@@ -289,7 +289,7 @@ class Puppet::Provider::NameService::DirectoryService < Puppet::Provider::NameSe
289
289
  end
290
290
  dscl_out = dscl(dscl_args)
291
291
  # We're ok with throwing away negative uids here.
292
- ids = dscl_out.split.compact.collect { |l| l.to_i if l.match(/^\d+$/) }
292
+ ids = dscl_out.split.compact.collect { |l| l.to_i if l =~ /^\d+$/ }
293
293
  ids.compact!.sort! { |a,b| a.to_f <=> b.to_f }
294
294
  # We're just looking for an unused id in our sorted array.
295
295
  ids.each_index do |i|
@@ -3,13 +3,13 @@ require 'puppet/provider/nameservice/objectadd'
3
3
  class Puppet::Provider::NameService
4
4
  class PW < ObjectAdd
5
5
  def deletecmd
6
- [command(:pw), "#{@resource.class.name.to_s}del", @resource[:name]]
6
+ [command(:pw), "#{@resource.class.name}del", @resource[:name]]
7
7
  end
8
8
 
9
9
  def modifycmd(param, value)
10
10
  cmd = [
11
11
  command(:pw),
12
- "#{@resource.class.name.to_s}mod",
12
+ "#{@resource.class.name}mod",
13
13
  @resource[:name],
14
14
  flag(param),
15
15
  munge(param, value)
@@ -0,0 +1,87 @@
1
+ # dnfmodule - A puppet package provider for DNF modules
2
+ #
3
+ # Installing a module:
4
+ # package { 'postgresql':
5
+ # provider => 'dnfmodule',
6
+ # ensure => '9.6', # install a specific stream
7
+ # flavor => 'client', # install a specific profile
8
+ # }
9
+
10
+
11
+ require 'puppet/provider/package'
12
+
13
+ Puppet::Type.type(:package).provide :dnfmodule, :parent => :dnf do
14
+
15
+ has_feature :installable, :uninstallable, :versionable
16
+ #has_feature :upgradeable
17
+ # it's not (yet) feasible to make this upgradeable since module streams don't
18
+ # always have matching version types (i.e. idm has streams DL1 and client,
19
+ # other modules have semver streams, others have string streams... we cannot
20
+ # programatically determine a latest version for ensure => 'latest'
21
+
22
+ commands :dnf => '/usr/bin/dnf'
23
+
24
+ def self.current_version
25
+ @current_version ||= dnf('--version').split.first
26
+ end
27
+
28
+ def self.prefetch(packages)
29
+ if Puppet::Util::Package.versioncmp(current_version, '3.0.1') < 0
30
+ raise Puppet::Error, _("Modules are not supported on DNF versions lower than 3.0.1")
31
+ end
32
+ super
33
+ end
34
+
35
+ def self.instances
36
+ packages = []
37
+ cmd = "#{command(:dnf)} module list --installed -d 0 -e #{error_level}"
38
+ execute(cmd).each_line do |line|
39
+ next unless line =~ /\[i\][, ]/ # get rid of non-package lines (including last Hint line)
40
+ line.gsub!(/\[[de]\]/, '') # we don't care about default/enabled flags
41
+ packages << new(
42
+ name: line.split[0],
43
+ ensure: line.split[1],
44
+ flavor: line.split('[i]').first.split.last, # this is nasty
45
+ provider: name
46
+ )
47
+ end
48
+ packages
49
+ end
50
+
51
+ def query
52
+ pkg = self.class.instances.find do |package|
53
+ @resource[:name] == package.name
54
+ end
55
+ pkg ? pkg.properties : nil
56
+ end
57
+
58
+ def reset
59
+ execute([command(:dnf), 'module', 'reset', '-d', '0', '-e', self.class.error_level, '-y', @resource[:name]])
60
+ end
61
+
62
+ # to install specific streams and profiles:
63
+ # $ dnf module install module-name:stream/profile
64
+ # $ dnf module install perl:5.24/minimal
65
+ # if unspecified, they will be defaulted (see [d] param in dnf module list output)
66
+ def install
67
+ args = @resource[:name]
68
+ # ensure we start fresh (remove existing stream)
69
+ uninstall unless [:absent, :purged].include?(@property_hash[:ensure])
70
+ case @resource[:ensure]
71
+ when true, false, Symbol
72
+ # pass
73
+ else
74
+ args << ":#{@resource[:ensure]}"
75
+ end
76
+ if @resource[:flavor]
77
+ args << "/#{@resource[:flavor]}"
78
+ end
79
+ execute([command(:dnf), 'module', 'install', '-d', '0', '-e', self.class.error_level, '-y', args])
80
+ end
81
+
82
+ def uninstall
83
+ execute([command(:dnf), 'module', 'remove', '-d', '0', '-e', self.class.error_level, '-y', @resource[:name]])
84
+ reset # reset module to the default stream
85
+ end
86
+ end
87
+
@@ -145,7 +145,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
145
145
  end
146
146
 
147
147
  def hold
148
- if package_not_installed?(@resource[:name])
148
+ if package_not_installed?
149
149
  self.install
150
150
  end
151
151
  Tempfile.open('puppet_dpkg_set_selection') do |tmpfile|
@@ -163,16 +163,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
163
163
  end
164
164
  end
165
165
 
166
- def package_not_installed?(name)
167
- if !name.nil? && !name.empty?
168
- begin
169
- dpkgquery("-W", "--showformat", self.class::DPKG_QUERY_FORMAT_STRING, name)
170
- rescue Puppet::ExecutionFailure
171
- # return true if exception is generated because package is not found
172
- return true
173
- end
174
- return false
175
- end
176
- raise ArgumentError.new("Package name is nil or empty")
166
+ def package_not_installed?
167
+ query[:status] != "installed"
177
168
  end
178
169
  end
@@ -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
@@ -36,16 +36,25 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
36
36
  if Puppet.features.microsoft_windows?
37
37
  ["pip.exe"]
38
38
  else
39
- ["pip", "pip-python"]
39
+ ["pip", "pip-python", "pip2", "pip-2"]
40
40
  end
41
41
  end
42
42
 
43
43
  def self.pip_version(command)
44
- execpipe [command, '--version'] do |process|
44
+ version = nil
45
+ execpipe [quote(command), '--version'] do |process|
45
46
  process.collect do |line|
46
- return line.strip.match(/^pip (\d+\.\d+\.?\d*).*$/)[1]
47
+ md = line.strip.match(/^pip (\d+\.\d+\.?\d*).*$/)
48
+ if md
49
+ version = md[1]
50
+ break
51
+ end
47
52
  end
48
53
  end
54
+
55
+ raise Puppet::Error, _("Cannot resolve pip version") unless version
56
+
57
+ version
49
58
  end
50
59
 
51
60
  # Return an array of structured information about every installed package
@@ -103,7 +112,7 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
103
112
  self.class.validate_command(command)
104
113
 
105
114
  self.class.instances(command).each do |pkg|
106
- return pkg.properties if @resource[:name].downcase == pkg.name.downcase
115
+ return pkg.properties if @resource[:name].casecmp(pkg.name).zero?
107
116
  end
108
117
  return nil
109
118
  end
@@ -123,14 +132,17 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
123
132
  end
124
133
  end
125
134
 
135
+ # Less resource-intensive approach for pip version 1.5.4 and newer.
136
+
126
137
  def latest_with_new_pip
127
138
  command = resource_or_provider_command
128
139
  self.class.validate_command(command)
129
140
 
130
- # Less resource intensive approach for pip version 1.5.4 and above
131
- execpipe [command, "install", "#{@resource[:name]}==versionplease"] do |process|
141
+ command_and_options = [command, 'install', "#{@resource[:name]}==versionplease"]
142
+ command_and_options << install_options if @resource[:install_options]
143
+ execpipe command_and_options do |process|
132
144
  process.collect do |line|
133
- # PIP OUTPUT: Could not find a version that satisfies the requirement Django==versionplease (from versions: 1.1.3, 1.8rc1)
145
+ # PIP OUTPUT: Could not find a version that satisfies the requirement example==versionplease (from versions: 1.2.3, 4.5.6)
134
146
  if line =~ /from versions: /
135
147
  textAfterLastMatch = $'.chomp(")\n")
136
148
  versionList = textAfterLastMatch.split(', ').sort do |x,y|
@@ -143,14 +155,18 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
143
155
  end
144
156
  end
145
157
 
158
+ # More resource-intensive approach for pip version 1.5.3 and older.
159
+
146
160
  def latest_with_old_pip
147
161
  command = resource_or_provider_command
148
162
  self.class.validate_command(command)
149
163
 
150
164
  Dir.mktmpdir("puppet_pip") do |dir|
151
- execpipe [command, "install", "#{@resource[:name]}", "-d", "#{dir}", "-v"] do |process|
165
+ command_and_options = [command, 'install', "#{@resource[:name]}", '-d', "#{dir}", '-v']
166
+ command_and_options << install_options if @resource[:install_options]
167
+ execpipe command_and_options do |process|
152
168
  process.collect do |line|
153
- # 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)
169
+ # PIP OUTPUT: Using version 0.10.1 (newest of versions: 1.2.3, 4.5.6)
154
170
  if line =~ /Using version (.+?) \(newest of versions/
155
171
  return $1
156
172
  end
@@ -210,4 +226,13 @@ Puppet::Type.type(:package).provide :pip, :parent => ::Puppet::Provider::Package
210
226
  def install_options
211
227
  join_options(@resource[:install_options])
212
228
  end
229
+
230
+ def self.quote(path)
231
+ if path.include?(" ")
232
+ "\"#{path}\""
233
+ else
234
+ path
235
+ end
236
+ end
237
+ private_class_method :quote
213
238
  end
@@ -70,7 +70,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
70
70
  name = qatom[:pfx] + name if qatom[:pfx]
71
71
  name = name + '-' + qatom[:pv] if qatom[:pv]
72
72
  name = name + '-' + qatom[:pr] if qatom[:pr]
73
- name = name + qatom[:slot] if qatom[:slot]
73
+ name = name + ':' + qatom[:slot] if qatom[:slot]
74
74
  cmd << '--update' if [:latest].include?(should)
75
75
  cmd += install_options if @resource[:install_options]
76
76
  cmd << name
@@ -84,7 +84,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
84
84
  name = qatom[:pfx] + name if qatom[:pfx]
85
85
  name = name + '-' + qatom[:pv] if qatom[:pv]
86
86
  name = name + '-' + qatom[:pr] if qatom[:pr]
87
- name = name + qatom[:slot] if qatom[:slot]
87
+ name = name + ':' + qatom[:slot] if qatom[:slot]
88
88
  cmd += uninstall_options if @resource[:uninstall_options]
89
89
  cmd << name
90
90
  if [:purged].include?(should)
@@ -169,7 +169,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
169
169
  package_sets << package_set.to_s.strip
170
170
  end
171
171
 
172
- if @resource[:name].match(/^@/)
172
+ if @resource[:name] =~ /^@/
173
173
  if package_sets.include?(@resource[:name][1..-1].to_s)
174
174
  return({:name => "#{@resource[:name]}", :ensure => '9999', :version_available => nil, :installed_versions => nil, :installable_versions => "9999,"})
175
175
  end
@@ -247,7 +247,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
247
247
  # [2.7.12: 2.7
248
248
  # 3.4.5: 3.4
249
249
  # 3.5.2: 3.5]
250
- version_for_slot = versions_and_slots.find { |version_and_slot| version_and_slot.last == slot[1..-1] }
250
+ version_for_slot = versions_and_slots.find { |version_and_slot| version_and_slot.last == slot }
251
251
  # [3.5.2: 3.5]
252
252
  version_for_slot.first if version_for_slot
253
253
  # 3.5.2
@@ -229,14 +229,14 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
229
229
  str2 = str2.gsub(front_strip_re, '')
230
230
 
231
231
  # "handle the tilde separator, it sorts before everything else"
232
- if /^~/.match(str1) && /^~/.match(str2)
232
+ if str1 =~ /^~/ && str2 =~ /^~/
233
233
  # if they both have ~, strip it
234
234
  str1 = str1[1..-1]
235
235
  str2 = str2[1..-1]
236
236
  next
237
- elsif /^~/.match(str1)
237
+ elsif str1 =~ /^~/
238
238
  return -1
239
- elsif /^~/.match(str2)
239
+ elsif str2 =~ /^~/
240
240
  return 1
241
241
  end
242
242
 
@@ -245,7 +245,7 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
245
245
  # "grab first completely alpha or completely numeric segment"
246
246
  isnum = false
247
247
  # if the first char of str1 is a digit, grab the chunk of continuous digits from each string
248
- if /^[0-9]+/.match(str1)
248
+ if str1 =~ /^[0-9]+/
249
249
  if str1 =~ /^[0-9]+/
250
250
  segment1 = $~.to_s
251
251
  str1 = $~.post_match
@@ -340,8 +340,8 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
340
340
  v = s[0,ri]
341
341
  r = s[ri+1,s.length]
342
342
  if arch = r.scan(ARCH_REGEX)[0]
343
- a = arch.gsub(/\./, '')
344
- r.gsub!(ARCH_REGEX, '')
343
+ a = arch.delete('.')
344
+ r.gsub!(ARCH_REGEX, '')
345
345
  end
346
346
  else
347
347
  v = s