puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. 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 +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -367,9 +367,10 @@ Puppet::Type.newtype(:file) do
367
367
  creator_count += 1 if self.should(param)
368
368
  end
369
369
  creator_count += 1 if @parameters.include?(:source)
370
+
370
371
  self.fail "You cannot specify more than one of #{CREATORS.collect { |p| p.to_s}.join(", ")}" if creator_count > 1
371
372
 
372
- self.fail "You cannot specify a remote recursion without a source" if !self[:source] and self[:recurse] == :remote
373
+ self.fail "You cannot specify a remote recursion without a source" if !self[:source] && self[:recurse] == :remote
373
374
 
374
375
  self.fail "You cannot specify source when using checksum 'none'" if self[:checksum] == :none && !self[:source].nil?
375
376
 
@@ -377,13 +378,19 @@ Puppet::Type.newtype(:file) do
377
378
  self.fail "You cannot specify content when using checksum '#{checksum_type}'" if self[:checksum] == checksum_type && !self[:content].nil?
378
379
  end
379
380
 
380
- self.warning "Possible error: recurselimit is set but not recurse, no recursion will happen" if !self[:recurse] and self[:recurselimit]
381
+ self.warning "Possible error: recurselimit is set but not recurse, no recursion will happen" if !self[:recurse] && self[:recurselimit]
381
382
 
382
383
  if @parameters[:content] && @parameters[:content].actual_content
383
384
  # Now that we know the checksum, update content (in case it was created before checksum was known).
384
385
  @parameters[:content].value = @parameters[:checksum].sum(@parameters[:content].actual_content)
385
386
  end
386
387
 
388
+ if self[:checksum] && self[:checksum_value] && !send("#{self[:checksum]}?", self[:checksum_value])
389
+ self.fail "Checksum value '#{self[:checksum_value]}' is not a valid checksum type #{self[:checksum]}"
390
+ end
391
+
392
+ self.warning "Checksum value is ignored unless content or source are specified" if self[:checksum_value] && !self[:content] && !self[:source]
393
+
387
394
  provider.validate if provider.respond_to?(:validate)
388
395
  end
389
396
 
@@ -398,7 +405,7 @@ Puppet::Type.newtype(:file) do
398
405
 
399
406
  # Determine the user to write files as.
400
407
  def asuser
401
- if self.should(:owner) and ! self.should(:owner).is_a?(Symbol)
408
+ if self.should(:owner) && ! self.should(:owner).is_a?(Symbol)
402
409
  writeable = Puppet::Util::SUIDManager.asuser(self.should(:owner)) {
403
410
  FileTest.writable?(::File.dirname(self[:path]))
404
411
  }
@@ -571,22 +578,29 @@ Puppet::Type.newtype(:file) do
571
578
  remove_less_specific_files(result)
572
579
  end
573
580
 
581
+ def remove_less_specific_files(files)
582
+ existing_files = catalog.vertices.select { |r| r.is_a?(self.class) }
583
+ self.class.remove_less_specific_files(files, self[:path], existing_files) do |file|
584
+ file[:path]
585
+ end
586
+ end
587
+
574
588
  # This is to fix bug #2296, where two files recurse over the same
575
589
  # set of files. It's a rare case, and when it does happen you're
576
590
  # not likely to have many actual conflicts, which is good, because
577
591
  # this is a pretty inefficient implementation.
578
- def remove_less_specific_files(files)
592
+ def self.remove_less_specific_files(files, parent_path, existing_files, &block)
579
593
  # REVISIT: is this Windows safe? AltSeparator?
580
- mypath = self[:path].split(::File::Separator)
581
- other_paths = catalog.vertices.
582
- select { |r| r.is_a?(self.class) and r[:path] != self[:path] }.
583
- collect { |r| r[:path].split(::File::Separator) }.
594
+ mypath = parent_path.split(::File::Separator)
595
+ other_paths = existing_files.
596
+ select { |r| (yield r) != parent_path}.
597
+ collect { |r| (yield r).split(::File::Separator) }.
584
598
  select { |p| p[0,mypath.length] == mypath }
585
599
 
586
600
  return files if other_paths.empty?
587
601
 
588
602
  files.reject { |file|
589
- path = file[:path].split(::File::Separator)
603
+ path = (yield file).split(::File::Separator)
590
604
  other_paths.any? { |p| path[0,p.length] == p }
591
605
  }
592
606
  end
@@ -629,12 +643,43 @@ Puppet::Type.newtype(:file) do
629
643
 
630
644
  # Recurse against our remote file.
631
645
  def recurse_remote(children)
646
+ recurse_remote_metadata.each do |meta|
647
+ if meta.relative_path == "."
648
+ self[:checksum] = meta.checksum_type
649
+ parameter(:source).metadata = meta
650
+ next
651
+ end
652
+ children[meta.relative_path] ||= newchild(meta.relative_path)
653
+ children[meta.relative_path][:source] = meta.source
654
+ children[meta.relative_path][:checksum] = meta.checksum_type
655
+ children[meta.relative_path].parameter(:source).metadata = meta
656
+ end
657
+
658
+ children
659
+ end
660
+
661
+ def recurse_remote_metadata
632
662
  sourceselect = self[:sourceselect]
633
663
 
634
664
  total = self[:source].collect do |source|
635
- next unless result = perform_recursion(source)
636
- return if top = result.find { |r| r.relative_path == "." } and top.ftype != "directory"
637
- result.each { |data| data.source = "#{source}/#{data.relative_path}" }
665
+ # For each inlined file resource, the catalog contains a hash mapping
666
+ # source path to lists of metadata returned by a server-side search.
667
+ if recursive_metadata = catalog.recursive_metadata[title]
668
+ result = recursive_metadata[source]
669
+ else
670
+ result = perform_recursion(source)
671
+ end
672
+
673
+ next unless result
674
+ return [] if top = result.find { |r| r.relative_path == "." } and top.ftype != "directory"
675
+ result.each do |data|
676
+ if data.relative_path == '.'
677
+ data.source = source
678
+ else
679
+ # REMIND: appending file paths to URL may not be safe, e.g. foo+bar
680
+ data.source = "#{source}/#{data.relative_path}"
681
+ end
682
+ end
638
683
  break result if result and ! result.empty? and sourceselect == :first
639
684
  result
640
685
  end.flatten.compact
@@ -644,22 +689,12 @@ Puppet::Type.newtype(:file) do
644
689
  found = []
645
690
  total.reject! do |data|
646
691
  result = found.include?(data.relative_path)
647
- found << data.relative_path unless found.include?(data.relative_path)
692
+ found << data.relative_path unless result
648
693
  result
649
694
  end
650
695
  end
651
696
 
652
- total.each do |meta|
653
- if meta.relative_path == "."
654
- parameter(:source).metadata = meta
655
- next
656
- end
657
- children[meta.relative_path] ||= newchild(meta.relative_path)
658
- children[meta.relative_path][:source] = meta.source
659
- children[meta.relative_path].parameter(:source).metadata = meta
660
- end
661
-
662
- children
697
+ total
663
698
  end
664
699
 
665
700
  def perform_recursion(path)
@@ -707,7 +742,27 @@ Puppet::Type.newtype(:file) do
707
742
  end
708
743
 
709
744
  def retrieve
710
- if source = parameter(:source)
745
+ # This check is done in retrieve to ensure it happens before we try to use
746
+ # metadata in `copy_source_values`, but so it only fails the resource and not
747
+ # catalog validation (because that would be a breaking change from Puppet 4).
748
+ if Puppet.features.microsoft_windows? && parameter(:source) &&
749
+ [:use, :use_when_creating].include?(self[:source_permissions])
750
+ err_msg = "Copying owner/mode/group from the source file on Windows" <<
751
+ " is not supported; use source_permissions => ignore."
752
+
753
+ if self[:owner] == nil || self[:group] == nil || self[:mode] == nil
754
+ # Fail on Windows if source permissions are being used and the file resource
755
+ # does not have mode owner, group, and mode all set (which would take precedence).
756
+ self.fail err_msg
757
+ else
758
+ # Warn if use source permissions is specified on Windows
759
+ self.warning err_msg
760
+ end
761
+ end
762
+
763
+ # `checksum_value` implies explicit management of all metadata, so skip metadata
764
+ # retrieval. Otherwise, if source is set, retrieve metadata for source.
765
+ if (source = parameter(:source)) && property(:checksum_value).nil?
711
766
  source.copy_source_values
712
767
  end
713
768
  super
@@ -786,9 +841,10 @@ Puppet::Type.newtype(:file) do
786
841
  resource
787
842
  end
788
843
 
789
- # Write out the file. Requires the property name for logging.
790
- # Write will be done by the content property, along with checksum computation
791
- def write(property)
844
+ # Write out the file. To write content, pass the property as an argument
845
+ # to delegate writing to; must implement a #write method that takes the file
846
+ # as an argument.
847
+ def write(property = nil)
792
848
  remove_existing(:file)
793
849
 
794
850
  mode = self.should(:mode) # might be nil
@@ -797,7 +853,8 @@ Puppet::Type.newtype(:file) do
797
853
  if write_temporary_file?
798
854
  Puppet::Util.replace_file(self[:path], mode_int) do |file|
799
855
  file.binmode
800
- content_checksum = write_content(file)
856
+ devfail 'a property should have been provided if write_temporary_file? returned true' if property.nil?
857
+ content_checksum = property.write(file)
801
858
  file.flush
802
859
  fail_if_checksum_is_wrong(file.path, content_checksum) if validate_checksum?
803
860
  if self[:validate_cmd]
@@ -809,7 +866,7 @@ Puppet::Type.newtype(:file) do
809
866
  end
810
867
  else
811
868
  umask = mode ? 000 : 022
812
- Puppet::Util.withumask(umask) { ::File.open(self[:path], 'wb', mode_int ) { |f| write_content(f) } }
869
+ Puppet::Util.withumask(umask) { ::File.open(self[:path], 'wb', mode_int ) { |f| property.write(f) if property } }
813
870
  end
814
871
 
815
872
  # make sure all of the modes are actually correct
@@ -889,16 +946,9 @@ Puppet::Type.newtype(:file) do
889
946
  self.fail "File written to disk did not match checksum; discarding changes (#{content_checksum} vs #{newsum})"
890
947
  end
891
948
 
892
- # write the current content. Note that if there is no content property
893
- # simply opening the file with 'w' as done in write is enough to truncate
894
- # or write an empty length file.
895
- def write_content(file)
896
- (content = property(:content)) && content.write(file)
897
- end
898
-
899
949
  def write_temporary_file?
900
- # unfortunately we don't know the source file size before fetching it
901
- # so let's assume the file won't be empty
950
+ # Unfortunately we don't know the source file size before fetching it so
951
+ # let's assume the file won't be empty. Why isn't it part of the metadata?
902
952
  (c = property(:content) and c.length) || @parameters[:source]
903
953
  end
904
954
 
@@ -914,6 +964,7 @@ Puppet::Type.newtype(:file) do
914
964
  thing.sync unless thing.safe_insync?(currentvalue)
915
965
  end
916
966
  end
967
+
917
968
  end
918
969
 
919
970
  # We put all of the properties in separate files, because there are so many
@@ -922,6 +973,7 @@ end
922
973
  require 'puppet/type/file/checksum'
923
974
  require 'puppet/type/file/content' # can create the file
924
975
  require 'puppet/type/file/source' # can create the file
976
+ require 'puppet/type/file/checksum_value' # can create the file, in place of content
925
977
  require 'puppet/type/file/target' # creates a different type of file
926
978
  require 'puppet/type/file/ensure' # can create the file
927
979
  require 'puppet/type/file/owner'
@@ -21,7 +21,7 @@ module Puppet
21
21
  puppet master's filebucket with the _desired_ content for each file,
22
22
  then instructs the agent to retrieve the content for a specific
23
23
  checksum. For more details,
24
- [see the `static_compiler` section in the catalog indirection docs](http://docs.puppetlabs.com/references/latest/indirection.html#catalog).
24
+ [see the `static_compiler` section in the catalog indirection docs](https://docs.puppetlabs.com/references/latest/indirection.html#catalog).
25
25
 
26
26
  To use a central filebucket for backups, you will usually want to declare
27
27
  a filebucket resource and a resource default for the `backup` attribute
@@ -80,7 +80,9 @@ module Puppet
80
80
 
81
81
  newproperty(:members, :array_matching => :all, :required_features => :manages_members) do
82
82
  desc "The members of the group. For directory services where group
83
- membership is stored in the group objects, not the users."
83
+ membership is stored in the group objects, not the users. Use
84
+ with auth_membership to determine whether the specified members
85
+ are inclusive or the minimum."
84
86
 
85
87
  def change_to_s(currentvalue, newvalue)
86
88
  currentvalue = currentvalue.join(",") if currentvalue != :absent
@@ -116,7 +118,9 @@ module Puppet
116
118
  end
117
119
 
118
120
  newparam(:auth_membership, :boolean => true, :parent => Puppet::Parameter::Boolean) do
119
- desc "whether the provider is authoritative for group membership."
121
+ desc "Whether the provider is authoritative for group membership. This
122
+ must be set to true to allow setting the group to no members with
123
+ `members => [],`."
120
124
  defaultto false
121
125
  end
122
126
 
@@ -45,19 +45,24 @@ Puppet::Type.newtype(:interface) do
45
45
  newvalues(:auto, :full, :half)
46
46
  end
47
47
 
48
+ newproperty(:access_vlan) do
49
+ desc "Interface static access vlan."
50
+ newvalues(/^\d+/)
51
+ end
52
+
48
53
  newproperty(:native_vlan) do
49
- desc "Interface native vlan (for access mode only)."
54
+ desc "Interface native vlan when trunking."
50
55
  newvalues(/^\d+/)
51
56
  end
52
57
 
53
58
  newproperty(:encapsulation) do
54
59
  desc "Interface switchport encapsulation."
55
- newvalues(:none, :dot1q, :isl )
60
+ newvalues(:none, :dot1q, :isl, :negotiate)
56
61
  end
57
62
 
58
63
  newproperty(:mode) do
59
64
  desc "Interface switchport mode."
60
- newvalues(:access, :trunk)
65
+ newvalues(:access, :trunk, 'dynamic auto', 'dynamic desirable')
61
66
  end
62
67
 
63
68
  newproperty(:allowed_trunk_vlans) do
@@ -1,7 +1,7 @@
1
1
  Puppet::Type.newtype(:macauthorization) do
2
2
 
3
3
  @doc = "Manage the Mac OS X authorization database. See the
4
- [Apple developer site](http://developer.apple.com/documentation/Security/Conceptual/Security_Overview/Security_Services/chapter_4_section_5.html)
4
+ [Apple developer site](https://developer.apple.com/documentation/Security/Conceptual/Security_Overview/Security_Services/chapter_4_section_5.html)
5
5
  for more information.
6
6
 
7
7
  Note that authorization store directives with hyphens in their names have
@@ -74,6 +74,12 @@ module Puppet
74
74
  value. On packaging systems that manage configuration files separately
75
75
  from "normal" system files, you can uninstall config files by
76
76
  specifying `purged` as the ensure value. This defaults to `installed`.
77
+
78
+ Version numbers must match the full version to install, including
79
+ release if the provider uses a release moniker. Ranges or semver
80
+ patterns are not accepted except for the `gem` package provider. For
81
+ example, to install the bash package from the rpm
82
+ `bash-4.1.2-29.el6.x86_64.rpm`, use the string `'4.1.2-29.el6'`.
77
83
  EOT
78
84
 
79
85
  attr_accessor :latest
@@ -2,7 +2,7 @@ module Puppet
2
2
  Type.newtype(:schedule) do
3
3
  @doc = <<-'EOT'
4
4
  Define schedules for Puppet. Resources can be limited to a schedule by using the
5
- [`schedule`](http://docs.puppetlabs.com/references/latest/metaparameter.html#schedule)
5
+ [`schedule`](https://docs.puppetlabs.com/references/latest/metaparameter.html#schedule)
6
6
  metaparameter.
7
7
 
8
8
  Currently, **schedules can only be used to stop a resource from being
@@ -2,7 +2,7 @@ Puppet::Type.newtype(:stage) do
2
2
  desc "A resource type for creating new run stages. Once a stage is available,
3
3
  classes can be assigned to it by declaring them with the resource-like syntax
4
4
  and using
5
- [the `stage` metaparameter](http://docs.puppetlabs.com/references/latest/metaparameter.html#stage).
5
+ [the `stage` metaparameter](https://docs.puppetlabs.com/references/latest/metaparameter.html#stage).
6
6
 
7
7
  Note that new stages are not useful unless you also declare their order
8
8
  in relation to the default `main` stage.
@@ -185,25 +185,26 @@ module Puppet
185
185
  end
186
186
 
187
187
  newproperty(:password, :required_features => :manages_passwords) do
188
- desc %q{The user's password, in whatever encrypted format the local
189
- system requires.
190
-
191
- * Most modern Unix-like systems use salted SHA1 password hashes. You can use
192
- Puppet's built-in `sha1` function to generate a hash from a password.
193
- * Mac OS X 10.5 and 10.6 also use salted SHA1 hashes.
194
- * Mac OS X 10.7 (Lion) uses salted SHA512 hashes. The Puppet Labs [stdlib][]
195
- module contains a `str2saltedsha512` function which can generate password
196
- hashes for Lion.
197
- * Mac OS X 10.8 and higher use salted SHA512 PBKDF2 hashes. When
198
- managing passwords on these systems the salt and iterations properties
199
- need to be specified as well as the password.
188
+ desc %q{The user's password, in whatever encrypted format the local system
189
+ requires. Consult your operating system's documentation for acceptable password
190
+ encryption formats and requirements.
191
+
192
+ * Mac OS X 10.5 and 10.6, and some older Linux distributions, use salted SHA1
193
+ hashes. You can use Puppet's built-in `sha1` function to generate a salted SHA1
194
+ hash from a password.
195
+ * Mac OS X 10.7 (Lion), and many recent Linux distributions, use salted SHA512
196
+ hashes. The Puppet Labs [stdlib][] module contains a `str2saltedsha512` function
197
+ which can generate password hashes for these operating systems.
198
+ * OS X 10.8 and higher use salted SHA512 PBKDF2 hashes. When managing passwords
199
+ on these systems, the `salt` and `iterations` attributes need to be specified as
200
+ well as the password.
200
201
  * Windows passwords can only be managed in cleartext, as there is no Windows API
201
202
  for setting the password hash.
202
203
 
203
204
  [stdlib]: https://github.com/puppetlabs/puppetlabs-stdlib/
204
205
 
205
- Be sure to enclose any value that includes a dollar sign ($) in single
206
- quotes (') to avoid accidental variable interpolation.}
206
+ Enclose any value that includes a dollar sign ($) in single quotes (') to avoid
207
+ accidental variable interpolation.}
207
208
 
208
209
  validate do |value|
209
210
  raise ArgumentError, "Passwords cannot include ':'" if value.is_a?(String) and value.include?(":")
@@ -584,14 +585,15 @@ module Puppet
584
585
  end
585
586
 
586
587
  newproperty(:salt, :required_features => :manages_password_salt) do
587
- desc "This is the 32 byte salt used to generate the PBKDF2 password used in
588
+ desc "This is the 32-byte salt used to generate the PBKDF2 password used in
588
589
  OS X. This field is required for managing passwords on OS X >= 10.8."
589
590
  end
590
591
 
591
592
  newproperty(:iterations, :required_features => :manages_password_salt) do
592
593
  desc "This is the number of iterations of a chained computation of the
593
- password hash (http://en.wikipedia.org/wiki/PBKDF2). This parameter
594
- is used in OS X. This field is required for managing passwords on OS X >= 10.8."
594
+ [PBKDF2 password hash](https://en.wikipedia.org/wiki/PBKDF2). This parameter
595
+ is used in OS X, and is required for managing passwords on OS X 10.8 and
596
+ newer."
595
597
 
596
598
  munge do |value|
597
599
  if value.is_a?(String) and value =~/^[-0-9]+$/
@@ -21,6 +21,16 @@ Puppet::Type.newtype(:yumrepo) do
21
21
  YUM_BOOLEAN=/^(True|False|0|1|No|Yes)$/i
22
22
  YUM_BOOLEAN_DOC="Valid values are: False/0/No or True/1/Yes."
23
23
 
24
+ # Common munge logic for YUM_BOOLEAN values. Munges for two requirements:
25
+ # 1) Because of how regex validation works in Puppet::Parameter::Value,
26
+ # Boolean false and lowercase false will not be considered invalid. However,
27
+ # if the user specified false (or true), they meant False (or True).
28
+ # 2) In order for parameter removal to work correctly, when absent is passed
29
+ # as a string it needs to be munged back to a symbol.
30
+ munge_yum_bool = Proc.new do |val|
31
+ val.to_s == 'absent' ? :absent : val.to_s.capitalize
32
+ end
33
+
24
34
  VALID_SCHEMES = %w[file http https ftp]
25
35
 
26
36
  newparam(:name, :namevar => true) do
@@ -81,6 +91,7 @@ Puppet::Type.newtype(:yumrepo) do
81
91
  #{ABSENT_DOC}"
82
92
 
83
93
  newvalues(YUM_BOOLEAN, :absent)
94
+ munge(&munge_yum_bool)
84
95
  end
85
96
 
86
97
  newproperty(:gpgcheck) do
@@ -90,6 +101,7 @@ Puppet::Type.newtype(:yumrepo) do
90
101
  #{ABSENT_DOC}"
91
102
 
92
103
  newvalues(YUM_BOOLEAN, :absent)
104
+ munge(&munge_yum_bool)
93
105
  end
94
106
 
95
107
  newproperty(:repo_gpgcheck) do
@@ -98,6 +110,7 @@ Puppet::Type.newtype(:yumrepo) do
98
110
  #{ABSENT_DOC}"
99
111
 
100
112
  newvalues(YUM_BOOLEAN, :absent)
113
+ munge(&munge_yum_bool)
101
114
  end
102
115
 
103
116
  newproperty(:gpgkey) do
@@ -179,6 +192,7 @@ Puppet::Type.newtype(:yumrepo) do
179
192
  #{ABSENT_DOC}"
180
193
 
181
194
  newvalues(YUM_BOOLEAN, :absent)
195
+ munge(&munge_yum_bool)
182
196
  end
183
197
 
184
198
  newproperty(:failovermethod) do
@@ -194,6 +208,7 @@ Puppet::Type.newtype(:yumrepo) do
194
208
  #{ABSENT_DOC}"
195
209
 
196
210
  newvalues(YUM_BOOLEAN, :absent)
211
+ munge(&munge_yum_bool)
197
212
  end
198
213
 
199
214
  newproperty(:retries) do
@@ -231,6 +246,7 @@ Puppet::Type.newtype(:yumrepo) do
231
246
  #{ABSENT_DOC}"
232
247
 
233
248
  newvalues(YUM_BOOLEAN, :absent)
249
+ munge(&munge_yum_bool)
234
250
  end
235
251
 
236
252
  newproperty(:priority) do
@@ -307,6 +323,7 @@ Puppet::Type.newtype(:yumrepo) do
307
323
  #{ABSENT_DOC}"
308
324
 
309
325
  newvalues(YUM_BOOLEAN, :absent)
326
+ munge(&munge_yum_bool)
310
327
  end
311
328
 
312
329
  newproperty(:sslcacert) do
@@ -323,6 +340,7 @@ Puppet::Type.newtype(:yumrepo) do
323
340
  #{ABSENT_DOC}"
324
341
 
325
342
  newvalues(YUM_BOOLEAN, :absent)
343
+ munge(&munge_yum_bool)
326
344
  end
327
345
 
328
346
  newproperty(:sslclientcert) do
@@ -359,6 +377,7 @@ Puppet::Type.newtype(:yumrepo) do
359
377
  #{ABSENT_DOC}"
360
378
 
361
379
  newvalues(YUM_BOOLEAN, :absent)
380
+ munge(&munge_yum_bool)
362
381
  end
363
382
 
364
383
  newproperty(:assumeyes) do
@@ -367,6 +386,7 @@ Puppet::Type.newtype(:yumrepo) do
367
386
  #{ABSENT_DOC}"
368
387
 
369
388
  newvalues(YUM_BOOLEAN, :absent)
389
+ munge(&munge_yum_bool)
370
390
  end
371
391
 
372
392
  newproperty(:deltarpm_percentage) do
data/lib/puppet/type.rb CHANGED
@@ -1246,7 +1246,7 @@ class Type
1246
1246
  event _would_ have been sent.
1247
1247
 
1248
1248
  **Important note:**
1249
- [The `noop` setting](http://docs.puppetlabs.com/references/latest/configuration.html#noop)
1249
+ [The `noop` setting](https://docs.puppetlabs.com/references/latest/configuration.html#noop)
1250
1250
  allows you to globally enable or disable noop mode, but it will _not_ override
1251
1251
  the `noop` metaparameter on individual resources. That is, the value of the
1252
1252
  global `noop` setting will _only_ affect resources that do not have an explicit
@@ -1266,7 +1266,7 @@ class Type
1266
1266
  The value of this metaparameter must be the `name` of a `schedule`
1267
1267
  resource. This means you must declare a schedule resource, then
1268
1268
  refer to it by name; see
1269
- [the docs for the `schedule` type](http://docs.puppetlabs.com/references/latest/type.html#schedule)
1269
+ [the docs for the `schedule` type](https://docs.puppetlabs.com/references/latest/type.html#schedule)
1270
1270
  for more info.
1271
1271
 
1272
1272
  schedule { 'everyday':
@@ -1558,7 +1558,7 @@ class Type
1558
1558
 
1559
1559
  newmetaparam(:require, :parent => RelationshipMetaparam, :attributes => {:direction => :in, :events => :NONE}) do
1560
1560
  desc "One or more resources that this resource depends on, expressed as
1561
- [resource references](http://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1561
+ [resource references](https://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1562
1562
  Multiple resources can be specified as an array of references. When this
1563
1563
  attribute is present:
1564
1564
 
@@ -1567,12 +1567,12 @@ class Type
1567
1567
  This is one of the four relationship metaparameters, along with
1568
1568
  `before`, `notify`, and `subscribe`. For more context, including the
1569
1569
  alternate chaining arrow (`->` and `~>`) syntax, see
1570
- [the language page on relationships](http://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1570
+ [the language page on relationships](https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1571
1571
  end
1572
1572
 
1573
1573
  newmetaparam(:subscribe, :parent => RelationshipMetaparam, :attributes => {:direction => :in, :events => :ALL_EVENTS, :callback => :refresh}) do
1574
1574
  desc "One or more resources that this resource depends on, expressed as
1575
- [resource references](http://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1575
+ [resource references](https://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1576
1576
  Multiple resources can be specified as an array of references. When this
1577
1577
  attribute is present:
1578
1578
 
@@ -1585,12 +1585,12 @@ class Type
1585
1585
  This is one of the four relationship metaparameters, along with
1586
1586
  `before`, `require`, and `notify`. For more context, including the
1587
1587
  alternate chaining arrow (`->` and `~>`) syntax, see
1588
- [the language page on relationships](http://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1588
+ [the language page on relationships](https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1589
1589
  end
1590
1590
 
1591
1591
  newmetaparam(:before, :parent => RelationshipMetaparam, :attributes => {:direction => :out, :events => :NONE}) do
1592
1592
  desc "One or more resources that depend on this resource, expressed as
1593
- [resource references](http://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1593
+ [resource references](https://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1594
1594
  Multiple resources can be specified as an array of references. When this
1595
1595
  attribute is present:
1596
1596
 
@@ -1599,12 +1599,12 @@ class Type
1599
1599
  This is one of the four relationship metaparameters, along with
1600
1600
  `require`, `notify`, and `subscribe`. For more context, including the
1601
1601
  alternate chaining arrow (`->` and `~>`) syntax, see
1602
- [the language page on relationships](http://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1602
+ [the language page on relationships](https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1603
1603
  end
1604
1604
 
1605
1605
  newmetaparam(:notify, :parent => RelationshipMetaparam, :attributes => {:direction => :out, :events => :ALL_EVENTS, :callback => :refresh}) do
1606
1606
  desc "One or more resources that depend on this resource, expressed as
1607
- [resource references](http://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1607
+ [resource references](https://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1608
1608
  Multiple resources can be specified as an array of references. When this
1609
1609
  attribute is present:
1610
1610
 
@@ -1617,7 +1617,7 @@ class Type
1617
1617
  This is one of the four relationship metaparameters, along with
1618
1618
  `before`, `require`, and `subscribe`. For more context, including the
1619
1619
  alternate chaining arrow (`->` and `~>`) syntax, see
1620
- [the language page on relationships](http://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1620
+ [the language page on relationships](https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1621
1621
  end
1622
1622
 
1623
1623
  newmetaparam(:stage) do
@@ -1630,7 +1630,7 @@ class Type
1630
1630
  By default, all classes are declared in the `main` stage. To assign a class
1631
1631
  to a different stage, you must:
1632
1632
 
1633
- * Declare the new stage as a [`stage` resource](http://docs.puppetlabs.com/references/latest/type.html#stage).
1633
+ * Declare the new stage as a [`stage` resource](https://docs.puppetlabs.com/references/latest/type.html#stage).
1634
1634
  * Declare an order relationship between the new stage and the `main` stage.
1635
1635
  * Use the resource-like syntax to declare the class, and set the `stage`
1636
1636
  metaparameter to the name of the desired stage.
@@ -2,6 +2,15 @@ require 'pathname'
2
2
  require 'puppet/util/rubygems'
3
3
  require 'puppet/util/warnings'
4
4
  require 'puppet/util/methodhelper'
5
+ require 'puppet/pops/adaptable'
6
+
7
+ # An adapter that ties the module_directories cache to the environment where the modules are parsed. This
8
+ # adapter ensures that the life-cycle of this cache doesn't exceed the life-cycle of the environment.
9
+ #
10
+ # @api private
11
+ class Puppet::Util::ModuleDirectoriesAdapter < Puppet::Pops::Adaptable::Adapter
12
+ attr_accessor :directories
13
+ end
5
14
 
6
15
  # Autoload paths, either based on names or all at once.
7
16
  class Puppet::Util::Autoload
@@ -99,12 +108,6 @@ class Puppet::Util::Autoload
99
108
  end
100
109
 
101
110
  def module_directories(env)
102
- # We're using a per-thread cache of module directories so that we don't
103
- # scan the filesystem each time we try to load something. This is reset
104
- # at the beginning of compilation and at the end of an agent run.
105
- $env_module_directories ||= {}
106
-
107
-
108
111
  # This is a little bit of a hack. Basically, the autoloader is being
109
112
  # called indirectly during application bootstrapping when we do things
110
113
  # such as check "features". However, during bootstrapping, we haven't
@@ -129,11 +132,13 @@ class Puppet::Util::Autoload
129
132
 
130
133
  if env
131
134
  # if the app defaults have been initialized then it should be safe to access the module path setting.
132
- $env_module_directories[env] ||= env.modulepath.collect do |dir|
133
- Dir.entries(dir).reject { |f| f =~ /^\./ }.collect { |f| File.join(dir, f, "lib") }
134
- end.flatten.find_all do |d|
135
- FileTest.directory?(d)
136
- end
135
+ Puppet::Util::ModuleDirectoriesAdapter.adapt(env) do |a|
136
+ a.directories ||= env.modulepath.collect do |dir|
137
+ Dir.entries(dir).reject { |f| f =~ /^\./ }.collect { |f| File.join(dir, f, "lib") }
138
+ end.flatten.find_all do |d|
139
+ FileTest.directory?(d)
140
+ end
141
+ end.directories
137
142
  else
138
143
  []
139
144
  end