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
@@ -150,16 +150,13 @@ RSpec.describe Puppet::Type.type(:exec) do
150
150
  end
151
151
  end
152
152
 
153
- it "should redact the command on failure" do
153
+ it "should redact the sensitive command on failure" do
154
154
  output = "output1\noutput2\n"
155
155
  expect { exec_tester('false', 1, :output => output, :logoutput => :on_failure, :sensitive_parameters => [:command]).refresh }.
156
156
  to raise_error(Puppet::Error, /^\[command redacted\] returned 1 instead of/)
157
157
 
158
- output.split("\n").each do |line|
159
- log = @logs.shift
160
- expect(log.level).to eq(:err)
161
- expect(log.message).to eq(line)
162
- end
158
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: '[output redacted]'))
159
+ expect(@logs).to_not include(an_object_having_attributes(message: /output1|output2/))
163
160
  end
164
161
 
165
162
  it "should log the output on failure when returns is specified as an array" do
@@ -177,7 +174,7 @@ RSpec.describe Puppet::Type.type(:exec) do
177
174
  end
178
175
  end
179
176
 
180
- it "should redact the command on failure when returns is specified as an array" do
177
+ it "should redact the sensitive command on failure when returns is specified as an array" do
181
178
  output = "output1\noutput2\n"
182
179
 
183
180
  expect {
@@ -185,11 +182,8 @@ RSpec.describe Puppet::Type.type(:exec) do
185
182
  :logoutput => :on_failure, :sensitive_parameters => [:command]).refresh
186
183
  }.to raise_error(Puppet::Error, /^\[command redacted\] returned 1 instead of/)
187
184
 
188
- output.split("\n").each do |line|
189
- log = @logs.shift
190
- expect(log.level).to eq(:err)
191
- expect(log.message).to eq(line)
192
- end
185
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: '[output redacted]'))
186
+ expect(@logs).to_not include(an_object_having_attributes(message: /output1|output2/))
193
187
  end
194
188
 
195
189
  it "shouldn't log the output on success" do
@@ -200,15 +200,21 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
200
200
  end
201
201
 
202
202
  it "prints the diff" do
203
- expect(content).to receive(:diff).and_return("my diff").once
204
- expect(content).to receive(:debug).with("\nmy diff").once
203
+ expect(content).to receive(:diff).and_return("my diff")
204
+ expect(content).to receive(:debug).with("\nmy diff")
205
+ expect(content).not_to be_safe_insync("other content")
206
+ end
207
+
208
+ it "prints binary file notice if diff is not valid encoding" do
209
+ expect(content).to receive(:diff).and_return("\xc7\xd1\xfc\x84")
210
+ expect(content).to receive(:debug).with(/\nBinary files #{filename} and .* differ/)
205
211
  expect(content).not_to be_safe_insync("other content")
206
212
  end
207
213
 
208
214
  it "redacts the diff when the property is sensitive" do
209
215
  content.sensitive = true
210
216
  expect(content).not_to receive(:diff)
211
- expect(content).to receive(:debug).with("[diff redacted]").once
217
+ expect(content).to receive(:debug).with("[diff redacted]")
212
218
  expect(content).not_to be_safe_insync("other content")
213
219
  end
214
220
  end
@@ -477,6 +477,9 @@ describe Puppet::Type.type(:file) do
477
477
  end
478
478
 
479
479
  describe "#recurse" do
480
+ let(:name) { 'bar' }
481
+ let(:child) { double('puppet_type_file') }
482
+
480
483
  before do
481
484
  file[:recurse] = true
482
485
  @metadata = Puppet::FileServing::Metadata
@@ -485,8 +488,9 @@ describe Puppet::Type.type(:file) do
485
488
  describe "and a source is set" do
486
489
  it "should pass the already-discovered resources to recurse_remote" do
487
490
  file[:source] = File.expand_path(__FILE__)
488
- allow(file).to receive(:recurse_local).and_return(:foo => "bar")
489
- expect(file).to receive(:recurse_remote).with(:foo => "bar").and_return([])
491
+ allow(child).to receive(:[]).with(:path).and_return(name)
492
+ allow(file).to receive(:recurse_local).and_return(name => child)
493
+ expect(file).to receive(:recurse_remote).with(name => child).and_return([])
490
494
  file.recurse
491
495
  end
492
496
  end
@@ -494,8 +498,9 @@ describe Puppet::Type.type(:file) do
494
498
  describe "and a target is set" do
495
499
  it "should use recurse_link" do
496
500
  file[:target] = File.expand_path(__FILE__)
497
- allow(file).to receive(:recurse_local).and_return(:foo => "bar")
498
- expect(file).to receive(:recurse_link).with(:foo => "bar").and_return([])
501
+ allow(child).to receive(:[]).with(:path).and_return(name)
502
+ allow(file).to receive(:recurse_local).and_return(name => child)
503
+ expect(file).to receive(:recurse_link).with(name => child).and_return([])
499
504
  file.recurse
500
505
  end
501
506
  end
@@ -24,12 +24,10 @@ describe Puppet::Type.type(:selboolean), "when validating values" do
24
24
  allow(@provider_class).to receive(:new).and_return(@provider)
25
25
  end
26
26
 
27
- it "should support :on as a value to :value" do
28
- Puppet::Type.type(:selboolean).new(:name => "yay", :value => :on)
29
- end
30
-
31
- it "should support :off as a value to :value" do
32
- Puppet::Type.type(:selboolean).new(:name => "yay", :value => :off)
27
+ [:on, :off, :true, :false, true, false].each do |val|
28
+ it "should support #{val.inspect} as a value to :value" do
29
+ Puppet::Type.type(:selboolean).new(:name => "yay", :value => val)
30
+ end
33
31
  end
34
32
 
35
33
  it "should support :true as a value to :persistent" do
@@ -128,6 +128,13 @@ describe Puppet::Util::Execution do
128
128
 
129
129
  call_exec_posix('test command', { :cwd => cwd }, @stdin, @stdout, @stderr)
130
130
  end
131
+
132
+ it "should not change the current working directory if cwd is unspecified" do
133
+ expect(Dir).to receive(:chdir).never
134
+ expect(Kernel).to receive(:exec).with('test command')
135
+
136
+ call_exec_posix('test command', {}, @stdin, @stdout, @stderr)
137
+ end
131
138
  end
132
139
 
133
140
  it "should return the pid of the child process" do
@@ -171,6 +178,15 @@ describe Puppet::Util::Execution do
171
178
 
172
179
  call_exec_windows('test command', { :cwd => cwd }, @stdin, @stdout, @stderr)
173
180
  end
181
+
182
+ it "should not change the current working directory if cwd is unspecified" do
183
+ expect(Dir).to receive(:chdir).never
184
+ expect(Process).to receive(:create) do |args|
185
+ expect(args[:cwd]).to be_nil
186
+ end
187
+
188
+ call_exec_windows('test command', {}, @stdin, @stdout, @stderr)
189
+ end
174
190
  end
175
191
 
176
192
  context 'suppress_window option' do
@@ -12,6 +12,103 @@ describe Puppet::Util::HttpProxy do
12
12
 
13
13
  host, port, user, password = 'some.host', 1234, 'user1', 'pAssw0rd'
14
14
 
15
+ def expects_direct_connection_to(http, www)
16
+ expect(http.address).to eq(www.host)
17
+ expect(http.port).to eq(www.port)
18
+
19
+ expect(http.proxy_address).to be_nil
20
+ expect(http.proxy_port).to be_nil
21
+ expect(http.proxy_user).to be_nil
22
+ expect(http.proxy_pass).to be_nil
23
+ end
24
+
25
+ def expects_proxy_connection_via(http, www, host, port, user, password)
26
+ expect(http.address).to eq(www.host)
27
+ expect(http.port).to eq(www.port)
28
+
29
+ expect(http.proxy_address).to eq(host)
30
+ expect(http.proxy_port).to eq(port)
31
+ expect(http.proxy_user).to eq(user)
32
+ expect(http.proxy_pass).to eq(password)
33
+ end
34
+
35
+ describe '.proxy' do
36
+ let(:www) { URI::HTTP.build(host: 'www.example.com', port: 80) }
37
+
38
+ it 'uses a proxy' do
39
+ Puppet[:http_proxy_host] = host
40
+ Puppet[:http_proxy_port] = port
41
+ Puppet[:http_proxy_user] = user
42
+ Puppet[:http_proxy_password] = password
43
+
44
+ http = subject.proxy(www)
45
+ expects_proxy_connection_via(http, www, host, port, user, password)
46
+ end
47
+
48
+ it 'connects directly to the server' do
49
+ http = subject.proxy(www)
50
+ expects_direct_connection_to(http, www)
51
+ end
52
+
53
+ context 'when setting no_proxy' do
54
+ before :each do
55
+ Puppet[:http_proxy_host] = host
56
+ Puppet[:http_proxy_port] = port
57
+ end
58
+
59
+ it 'connects directly to the server when HTTP_PROXY environment variable is set, but server matches no_proxy setting' do
60
+ Puppet[:no_proxy] = www.host
61
+
62
+ Puppet::Util.withenv('HTTP_PROXY' => "http://#{host}:#{port}") do
63
+ http = subject.proxy(www)
64
+ expects_direct_connection_to(http, www)
65
+ end
66
+ end
67
+
68
+ it 'connects directly to the server when no_proxy matches wildcard domain' do
69
+ Puppet[:no_proxy] = '*.example.com'
70
+
71
+ http = subject.proxy(www)
72
+ expects_direct_connection_to(http, www)
73
+ end
74
+
75
+ it 'connects directly to the server when no_proxy matches dotted domain' do
76
+ Puppet[:no_proxy] = '.example.com'
77
+
78
+ http = subject.proxy(www)
79
+ expects_direct_connection_to(http, www)
80
+ end
81
+
82
+ it 'connects directly to the server when no_proxy matches a domain suffix like ruby does' do
83
+ Puppet[:no_proxy] = 'example.com'
84
+
85
+ http = subject.proxy(www)
86
+ expects_direct_connection_to(http, www)
87
+ end
88
+
89
+ it 'connects directly to the server when no_proxy matches a partial suffix like ruby does' do
90
+ Puppet[:no_proxy] = 'ample.com'
91
+
92
+ http = subject.proxy(www)
93
+ expects_direct_connection_to(http, www)
94
+ end
95
+
96
+ it 'connects directly to the server when it is a subdomain of no_proxy' do
97
+ Puppet[:no_proxy] = '*.com'
98
+
99
+ http = subject.proxy(www)
100
+ expects_direct_connection_to(http, www)
101
+ end
102
+
103
+ it 'connects directly to the server when no_proxy is *' do
104
+ Puppet[:no_proxy] = '*'
105
+
106
+ http = subject.proxy(www)
107
+ expects_direct_connection_to(http, www)
108
+ end
109
+ end
110
+ end
111
+
15
112
  describe ".http_proxy_env" do
16
113
  it "should return nil if no environment variables" do
17
114
  expect(subject.http_proxy_env).to eq(nil)
@@ -46,13 +46,15 @@ describe Puppet::Util::Log.desttypes[:file] do
46
46
 
47
47
  describe "on POSIX systems", :if => Puppet.features.posix? do
48
48
  describe "with a normal file" do
49
+ let (:parent) { Pathname.new('/tmp') }
49
50
  let (:abspath) { '/tmp/log' }
50
51
  let (:relpath) { 'log' }
51
52
 
52
53
  it_behaves_like "file destination"
53
54
 
54
55
  it "logs an error if it can't chown the file owner & group" do
55
- expect(File).to receive(:exists?).with(abspath).and_return(false)
56
+ allow(File).to receive(:exist?).with(parent).and_return(true)
57
+ expect(File).to receive(:exist?).with(Pathname.new(abspath)).and_return(false)
56
58
  expect(FileUtils).to receive(:chown).with(Puppet[:user], Puppet[:group], abspath).and_raise(Errno::EPERM)
57
59
  expect(Puppet.features).to receive(:root?).and_return(true)
58
60
  expect(Puppet).to receive(:err).with("Unable to set ownership to #{Puppet[:user]}:#{Puppet[:group]} for log file: #{abspath}")
@@ -61,7 +63,8 @@ describe Puppet::Util::Log.desttypes[:file] do
61
63
  end
62
64
 
63
65
  it "doesn't attempt to chown when running as non-root" do
64
- expect(File).to receive(:exists?).with(abspath).and_return(false)
66
+ allow(File).to receive(:exist?).with(parent).and_return(true)
67
+ expect(File).to receive(:exist?).with(Pathname.new(abspath)).and_return(false)
65
68
  expect(FileUtils).not_to receive(:chown).with(Puppet[:user], Puppet[:group], abspath)
66
69
  expect(Puppet.features).to receive(:root?).and_return(false)
67
70
 
@@ -69,7 +72,8 @@ describe Puppet::Util::Log.desttypes[:file] do
69
72
  end
70
73
 
71
74
  it "doesn't attempt to chown when file already exists" do
72
- expect(File).to receive(:exists?).with(abspath).and_return(true)
75
+ allow(File).to receive(:exist?).with(parent).and_return(true)
76
+ expect(File).to receive(:exist?).with(Pathname.new(abspath)).and_return(true)
73
77
  expect(FileUtils).not_to receive(:chown).with(Puppet[:user], Puppet[:group], abspath)
74
78
  expect(Puppet.features).to receive(:root?).and_return(true)
75
79
 
@@ -177,144 +177,6 @@ describe Puppet::Util::Log do
177
177
 
178
178
  expect(logs.collect(&:message)).to include("Inner block", "Outer block")
179
179
  end
180
-
181
- it 'includes backtrace for RuntimeError in log message when trace option is passed' do
182
- logs = []
183
- destination = Puppet::Test::LogCollector.new(logs)
184
-
185
- Puppet::Util::Log.newdestination(destination)
186
- Puppet::Util::Log.with_destination(destination) do
187
- begin
188
- raise RuntimeError, 'Oops'
189
- rescue RuntimeError => e
190
- Puppet.log_exception(e, :default, :trace => true)
191
- end
192
- end
193
- expect(logs.size).to eq(1)
194
- log = logs[0]
195
- expect(log.message).to match('/log_spec.rb')
196
- expect(log.backtrace).to be_nil
197
- end
198
-
199
- context "global options" do
200
- around :each do |example|
201
- Puppet[:trace] = true
202
- example.run
203
- Puppet[:trace] = false
204
- end
205
-
206
- it 'includes backtrace for RuntimeError in log message when trace is enabled globally' do
207
- logs = []
208
- destination = Puppet::Test::LogCollector.new(logs)
209
-
210
- Puppet::Util::Log.newdestination(destination)
211
- Puppet::Util::Log.with_destination(destination) do
212
- begin
213
- raise RuntimeError, 'Oops'
214
- rescue RuntimeError => e
215
- Puppet.log_exception(e, :default)
216
- end
217
- end
218
- expect(logs.size).to eq(1)
219
- log = logs[0]
220
- expect(log.message).to match('/log_spec.rb')
221
- expect(log.backtrace).to be_nil
222
- end
223
- end
224
-
225
- it 'excludes backtrace for RuntimeError in log message when trace is disabled' do
226
- logs = []
227
- destination = Puppet::Test::LogCollector.new(logs)
228
-
229
- Puppet::Util::Log.newdestination(destination)
230
- Puppet::Util::Log.with_destination(destination) do
231
- begin
232
- raise RuntimeError, 'Oops'
233
- rescue RuntimeError => e
234
- Puppet.log_exception(e)
235
- end
236
- end
237
- expect(logs.size).to eq(1)
238
- log = logs[0]
239
- expect(log.message).to_not match('/log_spec.rb')
240
- expect(log.backtrace).to be_nil
241
- end
242
-
243
- it "backtrace is Array in 'backtrace' and excluded from 'message' when logging ParseErrorWithIssue with trace enabled" do
244
- logs = []
245
- destination = Puppet::Test::LogCollector.new(logs)
246
-
247
- Puppet::Util::Log.newdestination(destination)
248
- Puppet::Util::Log.with_destination(destination) do
249
- begin
250
- raise Puppet::ParseErrorWithIssue.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
251
- rescue RuntimeError => e
252
- Puppet.log_exception(e, :default, :trace => true)
253
- end
254
- end
255
- expect(logs.size).to eq(1)
256
- log = logs[0]
257
- expect(log.message).to_not match('/log_spec.rb')
258
- expect(log.backtrace).to be_a(Array)
259
- end
260
-
261
- it "backtrace is excluded when logging ParseErrorWithIssue with trace disabled" do
262
- logs = []
263
- destination = Puppet::Test::LogCollector.new(logs)
264
-
265
- Puppet::Util::Log.newdestination(destination)
266
- Puppet::Util::Log.with_destination(destination) do
267
- begin
268
- raise Puppet::ParseErrorWithIssue.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
269
- rescue RuntimeError => e
270
- Puppet.log_exception(e)
271
- end
272
- end
273
- expect(logs.size).to eq(1)
274
- log = logs[0]
275
- expect(log.message).to_not match('/log_spec.rb')
276
- expect(log.backtrace).to be_nil
277
- end
278
-
279
- it 'includes position details for ParseError in log message' do
280
- logs = []
281
- destination = Puppet::Test::LogCollector.new(logs)
282
-
283
- Puppet::Util::Log.newdestination(destination)
284
- Puppet::Util::Log.with_destination(destination) do
285
- begin
286
- raise Puppet::ParseError.new('Oops', '/tmp/test.pp', 30, 15)
287
- rescue RuntimeError => e
288
- Puppet.log_exception(e)
289
- end
290
- end
291
- expect(logs.size).to eq(1)
292
- log = logs[0]
293
- expect(log.message).to match(/ \(file: \/tmp\/test\.pp, line: 30, column: 15\)/)
294
- expect(log.message).to be(log.to_s)
295
- end
296
-
297
- it 'excludes position details for ParseErrorWithIssue from log message' do
298
- logs = []
299
- destination = Puppet::Test::LogCollector.new(logs)
300
-
301
- Puppet::Util::Log.newdestination(destination)
302
- Puppet::Util::Log.with_destination(destination) do
303
- begin
304
- raise Puppet::ParseErrorWithIssue.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
305
- rescue RuntimeError => e
306
- Puppet.log_exception(e)
307
- end
308
- end
309
- expect(logs.size).to eq(1)
310
- log = logs[0]
311
- expect(log.message).to_not match(/ \(file: \/tmp\/test\.pp, line: 30, column: 15\)/)
312
- expect(log.to_s).to match(/ \(file: \/tmp\/test\.pp, line: 30, column: 15\)/)
313
- expect(log.issue_code).to eq(:SYNTAX_ERROR)
314
- expect(log.file).to eq('/tmp/test.pp')
315
- expect(log.line).to eq(30)
316
- expect(log.pos).to eq(15)
317
- end
318
180
  end
319
181
 
320
182
  describe Puppet::Util::Log::DestConsole do
@@ -6,6 +6,39 @@ class LoggingTester
6
6
  include Puppet::Util::Logging
7
7
  end
8
8
 
9
+ class PuppetStackCreator
10
+ def raise_error(exception_class)
11
+ case exception_class
12
+ when Puppet::ParseErrorWithIssue
13
+ raise exception_class.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
14
+ when Puppet::ParseError
15
+ raise exception_class.new('Oops', '/tmp/test.pp', 30, 15)
16
+ else
17
+ raise exception_class.new('Oops')
18
+ end
19
+ end
20
+
21
+ def call_raiser(exception_class)
22
+ Puppet::Pops::PuppetStack.stack('/tmp/test2.pp', 20, self, :raise_error, [exception_class])
23
+ end
24
+
25
+ def two_frames_and_a_raise(exception_class)
26
+ Puppet::Pops::PuppetStack.stack('/tmp/test3.pp', 15, self, :call_raiser, [exception_class])
27
+ end
28
+
29
+ def outer_rescue(exception_class)
30
+ begin
31
+ two_frames_and_a_raise(exception_class)
32
+ rescue Puppet::Error => e
33
+ Puppet.log_exception(e)
34
+ end
35
+ end
36
+
37
+ def run(exception_class)
38
+ Puppet::Pops::PuppetStack.stack('/tmp/test4.pp', 10, self, :outer_rescue, [exception_class])
39
+ end
40
+ end
41
+
9
42
  describe Puppet::Util::Logging do
10
43
  before do
11
44
  @logger = LoggingTester.new
@@ -275,6 +308,173 @@ original
275
308
  .*2\.rb:2:in `b'
276
309
  .*3\.rb:1/)
277
310
  end
311
+
312
+ describe "when trace is disabled" do
313
+ it 'excludes backtrace for RuntimeError in log message' do
314
+ begin
315
+ raise RuntimeError, 'Oops'
316
+ rescue RuntimeError => e
317
+ Puppet.log_exception(e)
318
+ end
319
+
320
+ expect(@logs.size).to eq(1)
321
+ log = @logs[0]
322
+ expect(log.message).to_not match('/logging_spec.rb')
323
+ expect(log.backtrace).to be_nil
324
+ end
325
+
326
+ it "backtrace member is unset when logging ParseErrorWithIssue" do
327
+ begin
328
+ raise Puppet::ParseErrorWithIssue.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
329
+ rescue RuntimeError => e
330
+ Puppet.log_exception(e)
331
+ end
332
+
333
+ expect(@logs.size).to eq(1)
334
+ log = @logs[0]
335
+ expect(log.message).to_not match('/logging_spec.rb')
336
+ expect(log.backtrace).to be_nil
337
+ end
338
+ end
339
+
340
+ describe "when trace is enabled" do
341
+ it 'includes backtrace for RuntimeError in log message when enabled globally' do
342
+ Puppet[:trace] = true
343
+ begin
344
+ raise RuntimeError, 'Oops'
345
+ rescue RuntimeError => e
346
+ Puppet.log_exception(e, :default)
347
+ end
348
+ Puppet[:trace] = false
349
+
350
+ expect(@logs.size).to eq(1)
351
+ log = @logs[0]
352
+ expect(log.message).to match('/logging_spec.rb')
353
+ expect(log.backtrace).to be_nil
354
+ end
355
+
356
+ it 'includes backtrace for RuntimeError in log message when enabled via option' do
357
+ begin
358
+ raise RuntimeError, 'Oops'
359
+ rescue RuntimeError => e
360
+ Puppet.log_exception(e, :default, :trace => true)
361
+ end
362
+
363
+ expect(@logs.size).to eq(1)
364
+ log = @logs[0]
365
+ expect(log.message).to match('/logging_spec.rb')
366
+ expect(log.backtrace).to be_nil
367
+ end
368
+
369
+
370
+ it "backtrace member is set when logging ParseErrorWithIssue" do
371
+ begin
372
+ raise Puppet::ParseErrorWithIssue.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
373
+ rescue RuntimeError => e
374
+ Puppet.log_exception(e, :default, :trace => true)
375
+ end
376
+
377
+ expect(@logs.size).to eq(1)
378
+ log = @logs[0]
379
+ expect(log.message).to_not match('/logging_spec.rb')
380
+ expect(log.backtrace).to be_a(Array)
381
+ expect(log.backtrace[0]).to match('/logging_spec.rb')
382
+ end
383
+ it "backtrace has interleaved PuppetStack when logging ParseErrorWithIssue" do
384
+ Puppet[:trace] = true
385
+ PuppetStackCreator.new.run(Puppet::ParseErrorWithIssue)
386
+ Puppet[:trace] = false
387
+
388
+ expect(@logs.size).to eq(1)
389
+ log = @logs[0]
390
+ expect(log.message).to_not match('/logging_spec.rb')
391
+ expect(log.backtrace[0]).to match('/logging_spec.rb')
392
+
393
+ expect(log.backtrace[1]).to match('/tmp/test2.pp:20')
394
+ puppetstack = log.backtrace.select { |l| l =~ /tmp\/test\d\.pp/ }
395
+
396
+ expect(puppetstack.length).to equal 3
397
+ end
398
+
399
+ it "message has interleaved PuppetStack when logging ParseError" do
400
+ Puppet[:trace] = true
401
+ PuppetStackCreator.new.run(Puppet::ParseError)
402
+ Puppet[:trace] = false
403
+
404
+ expect(@logs.size).to eq(1)
405
+ log = @logs[0]
406
+
407
+ log_lines = log.message.split("\n")
408
+ expect(log_lines[1]).to match('/logging_spec.rb')
409
+ expect(log_lines[2]).to match('/tmp/test2.pp:20')
410
+ puppetstack = log_lines.select { |l| l =~ /tmp\/test\d\.pp/ }
411
+
412
+ expect(puppetstack.length).to equal 3
413
+ end
414
+ end
415
+
416
+ describe "when trace is disabled but puppet_trace is enabled" do
417
+ it "includes only PuppetStack as backtrace member with ParseErrorWithIssue" do
418
+ Puppet[:trace] = false
419
+ Puppet[:puppet_trace] = true
420
+ PuppetStackCreator.new.run(Puppet::ParseErrorWithIssue)
421
+ Puppet[:trace] = false
422
+ Puppet[:puppet_trace] = false
423
+
424
+ expect(@logs.size).to eq(1)
425
+ log = @logs[0]
426
+
427
+ expect(log.backtrace[0]).to match('/tmp/test2.pp:20')
428
+ expect(log.backtrace.length).to equal 3
429
+ end
430
+
431
+ it "includes only PuppetStack in message with ParseError" do
432
+ Puppet[:trace] = false
433
+ Puppet[:puppet_trace] = true
434
+ PuppetStackCreator.new.run(Puppet::ParseError)
435
+ Puppet[:trace] = false
436
+ Puppet[:puppet_trace] = false
437
+
438
+ expect(@logs.size).to eq(1)
439
+ log = @logs[0]
440
+
441
+ log_lines = log.message.split("\n")
442
+ expect(log_lines[1]).to match('/tmp/test2.pp:20')
443
+ puppetstack = log_lines.select { |l| l =~ /tmp\/test\d\.pp/ }
444
+
445
+ expect(puppetstack.length).to equal 3
446
+ end
447
+ end
448
+
449
+ it 'includes position details for ParseError in log message' do
450
+ begin
451
+ raise Puppet::ParseError.new('Oops', '/tmp/test.pp', 30, 15)
452
+ rescue RuntimeError => e
453
+ Puppet.log_exception(e)
454
+ end
455
+
456
+ expect(@logs.size).to eq(1)
457
+ log = @logs[0]
458
+ expect(log.message).to match(/ \(file: \/tmp\/test\.pp, line: 30, column: 15\)/)
459
+ expect(log.message).to be(log.to_s)
460
+ end
461
+
462
+ it 'excludes position details for ParseErrorWithIssue from log message' do
463
+ begin
464
+ raise Puppet::ParseErrorWithIssue.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
465
+ rescue RuntimeError => e
466
+ Puppet.log_exception(e)
467
+ end
468
+
469
+ expect(@logs.size).to eq(1)
470
+ log = @logs[0]
471
+ expect(log.message).to_not match(/ \(file: \/tmp\/test\.pp, line: 30, column: 15\)/)
472
+ expect(log.to_s).to match(/ \(file: \/tmp\/test\.pp, line: 30, column: 15\)/)
473
+ expect(log.issue_code).to eq(:SYNTAX_ERROR)
474
+ expect(log.file).to eq('/tmp/test.pp')
475
+ expect(log.line).to eq(30)
476
+ expect(log.pos).to eq(15)
477
+ end
278
478
  end
279
479
 
280
480
  describe 'when Facter' do