puppet 6.4.4-x86-mingw32 → 6.4.5-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 (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
@@ -1,57 +1,59 @@
1
- module Puppet::Pops
2
- # Module for making a call such that there is an identifiable entry on
3
- # the ruby call stack enabling getting a puppet call stack
4
- # To use this make a call with:
5
- # ```
6
- # Puppet::Pops::PuppetStack.stack(file, line, receiver, message, args)
7
- # ```
8
- # To get the stack call:
9
- # ```
10
- # Puppet::Pops::PuppetStack.stacktrace
11
- #
12
- # When getting a backtrace in Ruby, the puppet stack frames are
13
- # identified as coming from "in 'stack'" and having a ".pp" file
14
- # name.
15
- # To support testing, a given file that is an empty string, or nil
16
- # as well as a nil line number are supported. Such stack frames
17
- # will be represented with the text `unknown` and `0´ respectively.
18
- #
19
- module PuppetStack
20
- # Pattern matching an entry in the ruby stack that is a puppet entry
21
- PP_ENTRY_PATTERN = /^(.*\.pp)?:([0-9]+):in (`stack'|`block in call_function'|`<eval>')/
1
+ module Puppet
2
+ module Pops
3
+ # Utility class for keeping track of the "Puppet stack", ie the file
4
+ # and line numbers of Puppet Code that created the current context.
5
+ #
6
+ # To use this make a call with:
7
+ #
8
+ # ```rb
9
+ # Puppet::Pops::PuppetStack.stack(file, line, receiver, message, args)
10
+ # ```
11
+ #
12
+ # To get the stack call:
13
+ #
14
+ # ```rb
15
+ # Puppet::Pops::PuppetStack.stacktrace
16
+ # ```
17
+ #
18
+ # or
19
+ #
20
+ # ```rb
21
+ # Puppet::Pops::PuppetStack.top_of_stack
22
+ # ```
23
+ #
24
+ # To support testing, a given file that is an empty string, or nil
25
+ # as well as a nil line number are supported. Such stack frames
26
+ # will be represented with the text `unknown` and `0´ respectively.
27
+ module PuppetStack
28
+ @stack = Array.new
22
29
 
23
- # Sends a message to an obj such that it appears to come from
24
- # file, line when calling stacktrace.
25
- #
26
- def self.stack(file, line, obj, message, args, &block)
27
- file = '' if file.nil?
28
- line = 0 if line.nil?
30
+ def self.stack(file, line, obj, message, args, &block)
31
+ file = 'unknown' if (file.nil? || file == '')
32
+ line = 0 if line.nil?
29
33
 
30
- if block_given?
31
- Kernel.eval("obj.send(message, *args, &block)", Kernel.binding(), file, line)
32
- else
33
- Kernel.eval("obj.send(message, *args)", Kernel.binding(), file, line)
34
- end
35
- end
34
+ result = nil
35
+ @stack.unshift([file, line])
36
+ begin
37
+ if block_given?
38
+ result = obj.send(message, *args, &block)
39
+ else
40
+ result = obj.send(message, *args)
41
+ end
42
+ ensure
43
+ @stack.shift()
44
+ end
45
+ result
46
+ end
36
47
 
37
- def self.stacktrace
38
- caller().reduce([]) do |memo, loc|
39
- if loc =~ PP_ENTRY_PATTERN
40
- memo << [$1.nil? ? 'unknown' : $1, $2.to_i]
48
+ def self.stacktrace
49
+ @stack.dup
41
50
  end
42
- memo
43
- end
44
- end
45
51
 
46
- # Returns an Array with the top of the puppet stack, or an empty Array if there was no such entry.
47
- #
48
- def self.top_of_stack
49
- caller.each do |loc|
50
- if loc =~ PP_ENTRY_PATTERN
51
- return [$1.nil? ? 'unknown' : $1, $2.to_i]
52
+ # Returns an Array with the top of the puppet stack, or an empty
53
+ # Array if there was no such entry.
54
+ def self.top_of_stack
55
+ @stack.first || []
52
56
  end
53
57
  end
54
- []
55
58
  end
56
- end
57
- end
59
+ end
@@ -22,7 +22,7 @@ class PSensitiveType < PTypeWithContainedType
22
22
  end
23
23
 
24
24
  def inspect
25
- "#<#{to_s}>"
25
+ "#<#{self}>"
26
26
  end
27
27
  end
28
28
 
@@ -728,7 +728,7 @@ class StringConverter
728
728
  when :c
729
729
  char = [val].pack("U")
730
730
  char = f.alt? ? "\"#{char}\"" : char
731
- Kernel.format(f.orig_fmt.gsub('c','s'), char)
731
+ Kernel.format(f.orig_fmt.tr('c','s'), char)
732
732
 
733
733
  when :s
734
734
  fmt = f.alt? ? 'p' : 's'
@@ -781,7 +781,7 @@ class StringConverter
781
781
 
782
782
  when :p
783
783
  # width & precision applied to string, not the the name of the type
784
- "Binary(\"#{Kernel.format(f.orig_fmt.gsub('p', 's'), val.to_s)}\")"
784
+ "Binary(\"#{Kernel.format(f.orig_fmt.tr('p', 's'), val.to_s)}\")"
785
785
 
786
786
  when :b
787
787
  Kernel.format(f.orig_fmt.gsub('b', substitute), val.relaxed_to_s)
@@ -817,23 +817,23 @@ class StringConverter
817
817
 
818
818
  when :c
819
819
  c_val = val.capitalize
820
- f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.gsub('c', 's'), c_val)
820
+ f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('c', 's'), c_val)
821
821
 
822
822
  when :C
823
823
  c_val = val.split('::').map {|s| s.capitalize }.join('::')
824
- f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.gsub('C', 's'), c_val)
824
+ f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('C', 's'), c_val)
825
825
 
826
826
  when :u
827
827
  c_val = val.upcase
828
- f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.gsub('u', 's'), c_val)
828
+ f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('u', 's'), c_val)
829
829
 
830
830
  when :d
831
831
  c_val = val.downcase
832
- f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.gsub('d', 's'), c_val)
832
+ f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('d', 's'), c_val)
833
833
 
834
834
  when :t # trim
835
835
  c_val = val.strip
836
- f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.gsub('t', 's'), c_val)
836
+ f.alt? ? apply_string_flags(f, puppet_quote(c_val)) : Kernel.format(f.orig_fmt.tr('t', 's'), c_val)
837
837
 
838
838
  else
839
839
  raise FormatError.new('String', f.format, 'cCudspt')
@@ -921,7 +921,7 @@ class StringConverter
921
921
  case f.format
922
922
  when :p
923
923
  str_regexp = PRegexpType.regexp_to_s_with_delimiters(val)
924
- f.orig_fmt == '%p' ? str_regexp : Kernel.format(f.orig_fmt.gsub('p', 's'), str_regexp)
924
+ f.orig_fmt == '%p' ? str_regexp : Kernel.format(f.orig_fmt.tr('p', 's'), str_regexp)
925
925
  when :s
926
926
  str_regexp = PRegexpType.regexp_to_s(val)
927
927
  str_regexp = puppet_quote(str_regexp) if f.alt?
@@ -1098,10 +1098,10 @@ class StringConverter
1098
1098
  f = get_format(val_type, format_map)
1099
1099
  case f.format
1100
1100
  when :s
1101
- str_val = f.alt? ? "\"#{val.to_s}\"" : val.to_s
1101
+ str_val = f.alt? ? "\"#{val}\"" : val.to_s
1102
1102
  Kernel.format(f.orig_fmt, str_val)
1103
1103
  when :p
1104
- Kernel.format(f.orig_fmt.gsub('p', 's'), val.to_s)
1104
+ Kernel.format(f.orig_fmt.tr('p', 's'), val.to_s)
1105
1105
  else
1106
1106
  raise FormatError.new('Type', f.format, 'sp')
1107
1107
  end
@@ -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
@@ -52,7 +52,11 @@ class Puppet::Provider::Exec < Puppet::Provider
52
52
  # This is backwards compatible all the way to Ruby 1.8.7.
53
53
  Timeout::timeout(resource[:timeout], Timeout::Error) do
54
54
  cwd = resource[:cwd]
55
- cwd ||= Dir.pwd
55
+ # It's ok if cwd is nil. In that case Puppet::Util::Execution.execute() simply will not attempt to
56
+ # change the working directory, which is exactly the right behavior when no cwd parameter is
57
+ # expressed on the resource. Moreover, attempting to change to the directory that is already
58
+ # the working directory can fail under some circumstances, so avoiding the directory change attempt
59
+ # is preferable to defaulting cwd to that directory.
56
60
 
57
61
  # note that we are passing "false" for the "override_locale" parameter, which ensures that the user's
58
62
  # default/system locale will be respected. Callers may override this behavior by setting locale-related
@@ -93,6 +97,6 @@ class Puppet::Provider::Exec < Puppet::Provider
93
97
  def validatecmd(command)
94
98
  exe = extractexe(command)
95
99
  # if we're not fully qualified, require a path
96
- 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?
100
+ 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?
97
101
  end
98
102
  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)
@@ -8,7 +8,7 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
8
8
  These options should be specified as an array where each element is either a
9
9
  string or a hash."
10
10
 
11
- has_feature :versionable, :install_options
11
+ has_feature :versionable, :install_options, :virtual_packages
12
12
 
13
13
  commands :aptget => "/usr/bin/apt-get"
14
14
  commands :aptcache => "/usr/bin/apt-cache"
@@ -22,6 +22,10 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
22
22
  ENV['APT_LISTBUGS_FRONTEND'] = "none"
23
23
  ENV['APT_LISTCHANGES_FRONTEND'] = "none"
24
24
 
25
+ def self.defaultto_allow_virtual
26
+ false
27
+ end
28
+
25
29
  # A derivative of DPKG; this is how most people actually manage
26
30
  # Debian boxes, and the only thing that differs is that it can
27
31
  # install packages from remote sites.
@@ -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
+
@@ -5,8 +5,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
5
5
  and not `apt`, you must specify the source of any packages you want
6
6
  to manage."
7
7
 
8
- has_feature :holdable
9
-
8
+ has_feature :holdable, :virtual_packages
10
9
  commands :dpkg => "/usr/bin/dpkg"
11
10
  commands :dpkg_deb => "/usr/bin/dpkg-deb"
12
11
  commands :dpkgquery => "/usr/bin/dpkg-query"
@@ -44,16 +43,23 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
44
43
  # Note: self:: is required here to keep these constants in the context of what will
45
44
  # eventually become this Puppet::Type::Package::ProviderDpkg class.
46
45
  self::DPKG_QUERY_FORMAT_STRING = %Q{'${Status} ${Package} ${Version}\\n'}
46
+ self::DPKG_QUERY_PROVIDES_FORMAT_STRING = %Q{'${Status} ${Package} ${Version} [${Provides}]\\n'}
47
47
  self::FIELDS_REGEX = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*)$}
48
+ self::FIELDS_REGEX_WITH_PROVIDES = %r{^(\S+) +(\S+) +(\S+) (\S+) (\S*) \[.*\]$}
48
49
  self::FIELDS= [:desired, :error, :status, :name, :ensure]
49
50
 
51
+ def self.defaultto_allow_virtual
52
+ false
53
+ end
54
+
50
55
  # @param line [String] one line of dpkg-query output
51
56
  # @return [Hash,nil] a hash of FIELDS or nil if we failed to match
52
57
  # @api private
53
- def self.parse_line(line)
58
+ def self.parse_line(line, regex=self::FIELDS_REGEX)
54
59
  hash = nil
55
60
 
56
- if match = self::FIELDS_REGEX.match(line)
61
+ match = regex.match(line)
62
+ if match
57
63
  hash = {}
58
64
 
59
65
  self::FIELDS.zip(match.captures) do |field,value|
@@ -78,7 +84,8 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
78
84
  public
79
85
 
80
86
  def install
81
- unless file = @resource[:source]
87
+ file = @resource[:source]
88
+ unless file
82
89
  raise ArgumentError, _("You cannot install dpkg packages without a source")
83
90
  end
84
91
  args = []
@@ -102,7 +109,11 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
102
109
 
103
110
  # Return the version from the package.
104
111
  def latest
105
- output = dpkg_deb "--show", @resource[:source]
112
+ source = @resource[:source]
113
+ unless source
114
+ @resource.fail _("Could not update: You cannot install dpkg packages without a source")
115
+ end
116
+ output = dpkg_deb "--show", source
106
117
  matches = /^(\S+)\t(\S+)$/.match(output).captures
107
118
  warning _("source doesn't contain named package, but %{name}") % { name: matches[0] } unless matches[0].match( Regexp.escape(@resource[:name]) )
108
119
  matches[1]
@@ -113,6 +124,20 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
113
124
 
114
125
  # list out our specific package
115
126
  begin
127
+ if @resource.allow_virtual?
128
+ output = dpkgquery(
129
+ "-W",
130
+ "--showformat",
131
+ self.class::DPKG_QUERY_PROVIDES_FORMAT_STRING
132
+ #the regex searches for the resource[:name] in the dpkquery result in which the Provides field is also available
133
+ #it will search for the packages only in the brackets ex: [rubygems]
134
+ ).lines.find {|package| package.match(/[\[ ](#{Regexp.escape(@resource[:name])})[\],]/)}
135
+ if output
136
+ hash = self.class.parse_line(output,self.class::FIELDS_REGEX_WITH_PROVIDES)
137
+ Puppet.info("Package #{@resource[:name]} is virtual, defaulting to #{hash[:name]}")
138
+ @resource[:name] = hash[:name]
139
+ end
140
+ end
116
141
  output = dpkgquery(
117
142
  "-W",
118
143
  "--showformat",
@@ -145,7 +170,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
145
170
  end
146
171
 
147
172
  def hold
148
- if package_not_installed?(@resource[:name])
173
+ if package_not_installed?
149
174
  self.install
150
175
  end
151
176
  Tempfile.open('puppet_dpkg_set_selection') do |tmpfile|
@@ -163,16 +188,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
163
188
  end
164
189
  end
165
190
 
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")
191
+ def package_not_installed?
192
+ query[:status] != "installed"
177
193
  end
178
194
  end