puppet 6.12.0-x64-mingw32 → 6.17.0-x64-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 (412) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -106
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  251. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -102
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -186,6 +186,13 @@ module Puppet::Environments
186
186
  end
187
187
  end
188
188
 
189
+ def self.real_path(dir)
190
+ if Puppet::FileSystem.symlink?(dir) && Puppet[:versioned_environment_dirs]
191
+ dir = Puppet::FileSystem.expand_path(Puppet::FileSystem.readlink(dir))
192
+ end
193
+ return dir
194
+ end
195
+
189
196
  # @!macro loader_search_paths
190
197
  def search_paths
191
198
  ["file://#{@environment_dir}"]
@@ -193,27 +200,26 @@ module Puppet::Environments
193
200
 
194
201
  # @!macro loader_list
195
202
  def list
196
- valid_directories.collect do |envdir|
197
- name = Puppet::FileSystem.basename_string(envdir).intern
198
-
203
+ valid_environment_names.collect do |name|
199
204
  create_environment(name)
200
205
  end
201
206
  end
202
207
 
203
208
  # @!macro loader_get
204
209
  def get(name)
205
- if valid_directory?(File.join(@environment_dir, name.to_s))
210
+ if validated_directory(File.join(@environment_dir, name.to_s))
206
211
  create_environment(name)
207
212
  end
208
213
  end
209
214
 
210
215
  # @!macro loader_get_conf
211
216
  def get_conf(name)
212
- envdir = File.join(@environment_dir, name.to_s)
213
- if valid_directory?(envdir)
214
- return Puppet::Settings::EnvironmentConf.load_from(envdir, @global_module_path)
217
+ envdir = validated_directory(File.join(@environment_dir, name.to_s))
218
+ if envdir
219
+ Puppet::Settings::EnvironmentConf.load_from(envdir, @global_module_path)
220
+ else
221
+ nil
215
222
  end
216
- nil
217
223
  end
218
224
 
219
225
  private
@@ -230,21 +236,22 @@ module Puppet::Environments
230
236
  env
231
237
  end
232
238
 
233
- def valid_directory?(envdir)
234
- name = Puppet::FileSystem.basename_string(envdir)
235
- Puppet::FileSystem.directory?(envdir) &&
236
- Puppet::Node::Environment.valid_name?(name)
237
- end
238
-
239
- def valid_directories
240
- if Puppet::FileSystem.directory?(@environment_dir)
241
- Puppet::FileSystem.children(@environment_dir).select do |child|
242
- valid_directory?(child)
243
- end
239
+ def validated_directory(envdir)
240
+ env_name = Puppet::FileSystem.basename_string(envdir)
241
+ envdir = Puppet::Environments::Directories.real_path(envdir)
242
+ if Puppet::FileSystem.directory?(envdir) && Puppet::Node::Environment.valid_name?(env_name)
243
+ envdir
244
244
  else
245
- []
245
+ nil
246
246
  end
247
247
  end
248
+
249
+ def valid_environment_names
250
+ return [] unless Puppet::FileSystem.directory?(@environment_dir)
251
+ Puppet::FileSystem.children(@environment_dir).map do |child|
252
+ Puppet::FileSystem.basename_string(child).intern if validated_directory(child)
253
+ end.compact
254
+ end
248
255
  end
249
256
 
250
257
  # Combine together multiple loaders to act as one.
@@ -75,13 +75,16 @@ Puppet::Indirector::Face.define(:facts, '0.0.1') do
75
75
  facts.name = Puppet[:node_name_value]
76
76
  end
77
77
 
78
- Puppet::Node::Facts.indirection.terminus_class = :rest
79
- server = Puppet::Node::Facts::Rest.server
80
- Puppet.notice(_("Uploading facts for '%{node}' to: '%{server}'") % {
78
+ client = Puppet.runtime[:http]
79
+ session = client.create_session
80
+ puppet = session.route_to(:puppet)
81
+
82
+ Puppet.notice(_("Uploading facts for '%{node}' to '%{server}'") % {
81
83
  node: Puppet[:node_name_value],
82
- server: server})
84
+ server: puppet.url.hostname})
83
85
 
84
- Puppet::Node::Facts.indirection.save(facts, nil, :environment => Puppet.lookup(:current_environment))
86
+ puppet.put_facts(Puppet[:node_name_value], facts: facts, environment: Puppet.lookup(:current_environment).name.to_s)
87
+ nil
85
88
  end
86
89
  end
87
90
  end
@@ -24,12 +24,19 @@ Puppet::Face.define(:help, '0.0.1') do
24
24
  summary _("The version of the subcommand for which to show help.")
25
25
  end
26
26
 
27
+ option "--ronn" do
28
+ summary _("Whether to render the help text in ronn format.")
29
+ default_to { false }
30
+ end
31
+
27
32
  default
28
33
  when_invoked do |*args|
29
34
  options = args.pop
30
35
 
31
- if default_case?(args) || help_for_help?(args)
32
- return erb('global.erb').result(binding)
36
+ unless options[:ronn]
37
+ if default_case?(args) || help_for_help?(args)
38
+ return erb('global.erb').result(binding)
39
+ end
33
40
  end
34
41
 
35
42
  if args.length > 2
@@ -54,9 +61,20 @@ Puppet::Face.define(:help, '0.0.1') do
54
61
  if actionname
55
62
  raise ArgumentError, _("The legacy subcommand '%{sub_command}' does not support supplying an action") % { sub_command: facename }
56
63
  end
64
+ # legacy apps already emit ronn output
57
65
  return render_application_help(facename)
58
66
  else
59
- return render_face_help(facename, actionname, version)
67
+ if options[:ronn]
68
+ # Calling `puppet help <app> --ronn` normally calls this action with
69
+ # <app> as the first argument in the `args` array. However, if <app>
70
+ # happens to match the name of an action, like `puppet help help
71
+ # --ronn`, then face_base "eats" the argument and `args` will be
72
+ # empty. Rather than force users to type `puppet help help help
73
+ # --ronn`, default the facename to `:help`
74
+ render_face_man(facename || :help)
75
+ else
76
+ render_face_help(facename, actionname, version)
77
+ end
60
78
  end
61
79
  end
62
80
  end
@@ -69,6 +87,14 @@ Puppet::Face.define(:help, '0.0.1') do
69
87
  args.length == 1 && args.first == 'help'
70
88
  end
71
89
 
90
+ def render_face_man(facename)
91
+ # set 'face' as it's used in the erb processing.
92
+ face = Puppet::Face[facename.to_sym, :current]
93
+ # avoid unused variable warning
94
+ _face = face
95
+ erb('man.erb').result(binding)
96
+ end
97
+
72
98
  def render_application_help(applicationname)
73
99
  return Puppet::Application[applicationname].help
74
100
  rescue StandardError, LoadError => detail
@@ -5,6 +5,8 @@ Puppet::Face.define(:module, '1.0.0') do
5
5
  action(:search) do
6
6
  summary _("Search the Puppet Forge for a module.")
7
7
  description <<-EOT
8
+ This action has been deprecated. Please use the Puppet Forge to search for modules.
9
+
8
10
  Searches a repository for modules whose names, descriptions, or keywords
9
11
  match the provided search term.
10
12
  EOT
@@ -22,6 +24,7 @@ Puppet::Face.define(:module, '1.0.0') do
22
24
  arguments _("<search_term>")
23
25
 
24
26
  when_invoked do |term, options|
27
+ Puppet.deprecation_warning(_("This action has been deprecated. Please use the Puppet Forge to search for modules."))
25
28
  Puppet::ModuleTool.set_option_defaults options
26
29
  Puppet::ModuleTool::Applications::Searcher.new(term, Puppet::Forge.new(options[:module_repository] || Puppet[:module_repository]), options).run
27
30
  end
@@ -94,5 +97,7 @@ Puppet::Face.define(:module, '1.0.0') do
94
97
  highlight[format % [ name.sub('/', '-'), desc, "@#{author}", [keywords].flatten.join(' ') ]]
95
98
  end.join
96
99
  end
100
+
101
+ deprecate
97
102
  end
98
103
  end
@@ -41,10 +41,10 @@ Puppet::Face.define(:plugin, '0.0.1') do
41
41
  when_invoked do |options|
42
42
  remote_environment_for_plugins = Puppet::Node::Environment.remote(Puppet[:environment])
43
43
 
44
- pool = Puppet::Network::HTTP::Pool.new(Puppet[:http_keepalive_timeout])
44
+ pool = Puppet.runtime[:http].pool
45
45
  Puppet.override(:http_pool => pool) do
46
46
  begin
47
- handler = Puppet::Configurer::PluginHandler.new()
47
+ handler = Puppet::Configurer::PluginHandler.new
48
48
  handler.download_plugins(remote_environment_for_plugins)
49
49
  ensure
50
50
  pool.close
@@ -15,13 +15,25 @@ class Puppet::FileServing::HttpMetadata < Puppet::FileServing::Metadata
15
15
  # use a default mtime in case there is no usable HTTP header
16
16
  @checksums[:mtime] = "{mtime}#{Time.now}"
17
17
 
18
+ # RFC-1864, deprecated in HTTP/1.1 due to partial responses
18
19
  checksum = http_response['content-md5']
19
20
  if checksum
20
21
  # convert base64 digest to hex
21
- checksum = checksum.unpack("m0").first.unpack("H*").first
22
+ checksum = checksum.unpack("m").first.unpack("H*").first
22
23
  @checksums[:md5] = "{md5}#{checksum}"
23
24
  end
24
25
 
26
+ {
27
+ md5: 'X-Checksum-Md5',
28
+ sha1: 'X-Checksum-Sha1',
29
+ sha256: 'X-Checksum-Sha256'
30
+ }.each_pair do |checksum_type, header|
31
+ checksum = http_response[header]
32
+ if checksum
33
+ @checksums[checksum_type] = "{#{checksum_type}}#{checksum}"
34
+ end
35
+ end
36
+
25
37
  last_modified = http_response['last-modified']
26
38
  if last_modified
27
39
  mtime = DateTime.httpdate(last_modified).to_time
@@ -39,7 +51,7 @@ class Puppet::FileServing::HttpMetadata < Puppet::FileServing::Metadata
39
51
  def collect
40
52
  # Prefer the checksum_type from the indirector request options
41
53
  # but fall back to the alternative otherwise
42
- [ @checksum_type, :md5, :sha256, :sha384, :sha512, :sha224, :mtime ].each do |type|
54
+ [ @checksum_type, :md5, :sha256, :sha1, :mtime ].each do |type|
43
55
  @checksum_type = type
44
56
  @checksum = @checksums[type]
45
57
  break if @checksum
@@ -138,7 +138,10 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::Base
138
138
  @source = data.delete('source')
139
139
  @content_uri = data.delete('content_uri')
140
140
 
141
- super(path, data.map { |k, v| [k.to_sym, v] }.to_h)
141
+ links = data.fetch('links', nil) || data.fetch(:links, nil)
142
+ relative_path = data.fetch('relative_path', nil) || data.fetch(:relative_path, nil)
143
+ source = @source || data.fetch(:source, nil)
144
+ super(path, links: links, relative_path: relative_path, source: source)
142
145
  end
143
146
 
144
147
  def to_data_hash
@@ -7,11 +7,6 @@ module Puppet::FileServing::TerminusSelector
7
7
  def select(request)
8
8
  # We rely on the request's parsing of the URI.
9
9
 
10
- # Short-circuit to :file if it's a fully-qualified path or specifies a 'file' protocol.
11
- if Puppet::Util.absolute_path?(request.key)
12
- return :file
13
- end
14
-
15
10
  case request.protocol
16
11
  when "file"
17
12
  :file
@@ -21,10 +16,14 @@ module Puppet::FileServing::TerminusSelector
21
16
  else
22
17
  Puppet[:default_file_terminus]
23
18
  end
24
- when "http","https"
25
- :http
19
+ when "http","https"
20
+ :http
26
21
  when nil
27
- :file_server
22
+ if Puppet::Util.absolute_path?(request.key)
23
+ :file
24
+ else
25
+ :file_server
26
+ end
28
27
  else
29
28
  raise ArgumentError, _("URI protocol '%{protocol}' is not currently supported for file serving") % { protocol: request.protocol }
30
29
  end
@@ -80,7 +80,7 @@ class Puppet::FileSystem::FileImpl
80
80
  end
81
81
 
82
82
  def read(path, opts = {})
83
- path.read(opts)
83
+ path.read(**opts)
84
84
  end
85
85
 
86
86
  def read_preserve_line_endings(path)
@@ -124,7 +124,7 @@ class Puppet::FileSystem::FileImpl
124
124
  end
125
125
 
126
126
  def symlink(path, dest, options = {})
127
- FileUtils.symlink(path, dest, options)
127
+ FileUtils.symlink(path, dest, **options)
128
128
  end
129
129
 
130
130
  def symlink?(path)
@@ -156,12 +156,14 @@ class Puppet::FileSystem::FileImpl
156
156
  end
157
157
 
158
158
  def replace_file(path, mode = nil)
159
- mode ||= begin
160
- stat = Puppet::FileSystem.lstat(path)
161
- stat.mode & 07777
162
- rescue Errno::ENOENT
163
- 0640
164
- end
159
+ begin
160
+ stat = Puppet::FileSystem.lstat(path)
161
+ gid = stat.gid
162
+ uid = stat.uid
163
+ mode ||= stat.mode & 07777
164
+ rescue Errno::ENOENT
165
+ mode ||= 0640
166
+ end
165
167
 
166
168
  tempfile = Puppet::FileSystem::Uniquefile.new(Puppet::FileSystem.basename_string(path), Puppet::FileSystem.dir_string(path))
167
169
  begin
@@ -173,8 +175,10 @@ class Puppet::FileSystem::FileImpl
173
175
  tempfile.close
174
176
  end
175
177
 
176
- chmod(mode, tempfile.path)
177
- File.rename(tempfile.path, Puppet::FileSystem.path_string(path))
178
+ tempfile_path = tempfile.path
179
+ FileUtils.chown(uid, gid, tempfile_path) if uid && gid
180
+ chmod(mode, tempfile_path)
181
+ File.rename(tempfile_path, Puppet::FileSystem.path_string(path))
178
182
  ensure
179
183
  tempfile.close!
180
184
  end
@@ -23,6 +23,10 @@ class Puppet::FileSystem::MemoryFile
23
23
  :children => children)
24
24
  end
25
25
 
26
+ def self.a_symlink(target_path, source_path)
27
+ new(target_path, :exist? => true, :symlink? => true, :source_path => source_path)
28
+ end
29
+
26
30
  def initialize(path, properties)
27
31
  @path = path
28
32
  @properties = properties
@@ -34,6 +38,8 @@ class Puppet::FileSystem::MemoryFile
34
38
  def directory?; @properties[:directory?]; end
35
39
  def exist?; @properties[:exist?]; end
36
40
  def executable?; @properties[:executable?]; end
41
+ def symlink?; @properties[:symlink?]; end
42
+ def source_path; @properties[:source_path]; end
37
43
 
38
44
  def each_line(&block)
39
45
  handle.each_line(&block)
@@ -23,6 +23,19 @@ class Puppet::FileSystem::MemoryImpl
23
23
  path.executable?
24
24
  end
25
25
 
26
+ def symlink?(path)
27
+ path.symlink?
28
+ end
29
+
30
+ def readlink(path)
31
+ path = path.path
32
+ link = find(path)
33
+ return Puppet::FileSystem::MemoryFile.a_missing_file(path) unless link
34
+ source = link.source_path
35
+ return Puppet::FileSystem::MemoryFile.a_missing_file(link) unless source
36
+ find(source) || Puppet::FileSystem::MemoryFile.a_missing_file(source)
37
+ end
38
+
26
39
  def children(path)
27
40
  path.children
28
41
  end
@@ -124,11 +124,7 @@ class Puppet::FileSystem::Uniquefile < DelegateClass(File)
124
124
  opts = []
125
125
  end
126
126
  tmpdir, = *rest
127
- if $SAFE > 0 and tmpdir.tainted?
128
- tmpdir = '/tmp'
129
- else
130
- tmpdir ||= tmpdir()
131
- end
127
+ tmpdir ||= tmpdir()
132
128
  n = nil
133
129
  begin
134
130
  path = File.expand_path(make_tmpname(basename, n), tmpdir)
@@ -154,18 +150,14 @@ class Puppet::FileSystem::Uniquefile < DelegateClass(File)
154
150
 
155
151
  def tmpdir
156
152
  tmp = '.'
157
- if $SAFE > 0
158
- @@systmpdir
159
- else
160
- for dir in [ Puppet::Util.get_env('TMPDIR'), Puppet::Util.get_env('TMP'), Puppet::Util.get_env('TEMP'), @@systmpdir, '/tmp']
161
- stat = File.stat(dir) if dir
162
- if stat && stat.directory? && stat.writable?
163
- tmp = dir
164
- break
165
- end rescue nil
166
- end
167
- File.expand_path(tmp)
153
+ for dir in [ Puppet::Util.get_env('TMPDIR'), Puppet::Util.get_env('TMP'), Puppet::Util.get_env('TEMP'), @@systmpdir, '/tmp']
154
+ stat = File.stat(dir) if dir
155
+ if stat && stat.directory? && stat.writable?
156
+ tmp = dir
157
+ break
158
+ end rescue nil
168
159
  end
160
+ File.expand_path(tmp)
169
161
  end
170
162
 
171
163
 
@@ -176,6 +168,10 @@ class Puppet::FileSystem::Uniquefile < DelegateClass(File)
176
168
  lock = tmpname + '.lock'
177
169
  mkdir(lock)
178
170
  yield
171
+ rescue Errno::ENOENT => e
172
+ ex = Errno::ENOENT.new("A directory component in #{lock} does not exist or is a dangling symbolic link")
173
+ ex.set_backtrace(e.backtrace)
174
+ raise ex
179
175
  ensure
180
176
  rmdir(lock) if Puppet::FileSystem.exist?(lock)
181
177
  end
@@ -117,6 +117,7 @@ class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
117
117
  end
118
118
 
119
119
  # https://docs.microsoft.com/en-us/windows/desktop/debug/system-error-codes--0-499-
120
+ FILE_NOT_FOUND = 2
120
121
  ACCESS_DENIED = 5
121
122
  SHARING_VIOLATION = 32
122
123
  LOCK_VIOLATION = 33
@@ -132,12 +133,12 @@ class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
132
133
  dacl = secure_dacl(current_sid)
133
134
  dacl.allow(Puppet::Util::Windows::SID::BuiltinUsers, FILE_READ)
134
135
  dacl
135
- when 0640, 0600
136
+ when 0660, 0640, 0600, 0440
136
137
  secure_dacl(current_sid)
137
138
  when nil
138
139
  get_dacl_from_file(path) || secure_dacl(current_sid)
139
140
  else
140
- raise ArgumentError, "Only modes 0644, 0640 and 0600 are allowed"
141
+ raise ArgumentError, "#{mode} is invalid: Only modes 0644, 0640, 0660, and 0440 are allowed"
141
142
  end
142
143
 
143
144
 
@@ -180,9 +181,9 @@ class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
180
181
  def secure_dacl(current_sid)
181
182
  dacl = Puppet::Util::Windows::AccessControlList.new
182
183
  [
183
- Puppet::Util::Windows::SID::LocalSystem,
184
- Puppet::Util::Windows::SID::BuiltinAdministrators,
185
- current_sid
184
+ Puppet::Util::Windows::SID::LocalSystem,
185
+ Puppet::Util::Windows::SID::BuiltinAdministrators,
186
+ current_sid
186
187
  ].uniq.map do |sid|
187
188
  dacl.allow(sid, FULL_CONTROL)
188
189
  end
@@ -193,11 +194,7 @@ class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
193
194
  sd = Puppet::Util::Windows::Security.get_security_descriptor(Puppet::FileSystem.path_string(path))
194
195
  sd.dacl
195
196
  rescue Puppet::Util::Windows::Error => e
196
- if e.code == 2 # ERROR_FILE_NOT_FOUND
197
- nil
198
- else
199
- raise e
200
- end
197
+ raise e unless e.code == FILE_NOT_FOUND
201
198
  end
202
199
 
203
200
  def raise_if_symlinks_unsupported