puppet 4.3.2 → 4.4.0

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 (487) hide show
  1. checksums.yaml +4 -4
  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/debian/README.source +1 -1
  9. data/ext/debian/control +1 -1
  10. data/ext/debian/copyright +4 -4
  11. data/ext/debian/puppetmaster.README.debian +11 -9
  12. data/ext/emacs/puppet-mode.el +1 -1
  13. data/ext/envpuppet +2 -2
  14. data/ext/ips/puppetagent.xml +1 -1
  15. data/ext/ips/puppetmaster.xml +1 -1
  16. data/ext/project_data.yaml +8 -0
  17. data/ext/puppet-test +3 -3
  18. data/ext/rack/example-passenger-vhost.conf +1 -1
  19. data/ext/redhat/puppet.spec.erb +2 -2
  20. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  21. data/ext/solaris/pkginfo +1 -1
  22. data/ext/solaris/smf/puppet.xml +1 -1
  23. data/ext/suse/puppet.spec +2 -2
  24. data/ext/upload_facts.rb +1 -1
  25. data/ext/windows/puppet_interactive.bat +6 -0
  26. data/ext/windows/puppet_shell.bat +9 -0
  27. data/ext/windows/run_puppet_interactive.bat +9 -0
  28. data/ext/yaml_nodes.rb +1 -1
  29. data/install.rb +30 -20
  30. data/lib/puppet/agent.rb +1 -1
  31. data/lib/puppet/application/agent.rb +4 -2
  32. data/lib/puppet/application/apply.rb +7 -4
  33. data/lib/puppet/application/cert.rb +1 -1
  34. data/lib/puppet/application/device.rb +1 -1
  35. data/lib/puppet/application/filebucket.rb +1 -1
  36. data/lib/puppet/application/inspect.rb +1 -1
  37. data/lib/puppet/application/lookup.rb +4 -4
  38. data/lib/puppet/application/master.rb +2 -2
  39. data/lib/puppet/application/resource.rb +1 -1
  40. data/lib/puppet/configurer.rb +100 -22
  41. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  42. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  43. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  44. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  45. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  46. data/lib/puppet/defaults.rb +65 -19
  47. data/lib/puppet/environments.rb +3 -1
  48. data/lib/puppet/face/config.rb +1 -1
  49. data/lib/puppet/face/epp.rb +1 -1
  50. data/lib/puppet/face/help/man.erb +1 -1
  51. data/lib/puppet/face/module/install.rb +6 -6
  52. data/lib/puppet/face/parser.rb +12 -9
  53. data/lib/puppet/face/status.rb +2 -1
  54. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  55. data/lib/puppet/feature/telnet.rb +9 -0
  56. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  57. data/lib/puppet/file_serving/metadata.rb +18 -2
  58. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  59. data/lib/puppet/file_system.rb +2 -2
  60. data/lib/puppet/file_system/file_impl.rb +2 -2
  61. data/lib/puppet/file_system/memory_impl.rb +1 -1
  62. data/lib/puppet/file_system/uniquefile.rb +1 -1
  63. data/lib/puppet/forge.rb +1 -1
  64. data/lib/puppet/forge/repository.rb +1 -31
  65. data/lib/puppet/functions.rb +45 -6
  66. data/lib/puppet/functions/assert_type.rb +9 -9
  67. data/lib/puppet/functions/each.rb +5 -13
  68. data/lib/puppet/functions/filter.rb +5 -14
  69. data/lib/puppet/functions/map.rb +6 -14
  70. data/lib/puppet/functions/reduce.rb +5 -13
  71. data/lib/puppet/functions/reverse_each.rb +82 -0
  72. data/lib/puppet/functions/scanf.rb +15 -18
  73. data/lib/puppet/functions/slice.rb +22 -36
  74. data/lib/puppet/functions/split.rb +2 -2
  75. data/lib/puppet/functions/step.rb +88 -0
  76. data/lib/puppet/functions/type.rb +70 -0
  77. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  78. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  79. data/lib/puppet/indirector/file_content/http.rb +15 -0
  80. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  81. data/lib/puppet/indirector/generic_http.rb +16 -0
  82. data/lib/puppet/indirector/node/exec.rb +1 -1
  83. data/lib/puppet/indirector/node/ldap.rb +1 -1
  84. data/lib/puppet/indirector/rest.rb +2 -1
  85. data/lib/puppet/info_service/class_information_service.rb +13 -12
  86. data/lib/puppet/loaders.rb +1 -0
  87. data/lib/puppet/module.rb +3 -0
  88. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  89. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  90. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  91. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  92. data/lib/puppet/network/http/pool.rb +9 -0
  93. data/lib/puppet/node.rb +1 -1
  94. data/lib/puppet/node/environment.rb +11 -2
  95. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  96. data/lib/puppet/parser/compiler.rb +3 -3
  97. data/lib/puppet/parser/environment_compiler.rb +0 -1
  98. data/lib/puppet/parser/functions.rb +28 -16
  99. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  100. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  101. data/lib/puppet/parser/functions/map.rb +1 -1
  102. data/lib/puppet/parser/functions/scanf.rb +15 -26
  103. data/lib/puppet/parser/functions/slice.rb +17 -24
  104. data/lib/puppet/parser/functions/split.rb +1 -1
  105. data/lib/puppet/parser/resource.rb +19 -17
  106. data/lib/puppet/parser/scope.rb +176 -5
  107. data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
  108. data/lib/puppet/pops.rb +0 -8
  109. data/lib/puppet/pops/adaptable.rb +4 -1
  110. data/lib/puppet/pops/adapters.rb +38 -13
  111. data/lib/puppet/pops/binder/binder.rb +21 -17
  112. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  113. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  114. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  115. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  116. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  117. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  118. data/lib/puppet/pops/binder/injector.rb +53 -48
  119. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  120. data/lib/puppet/pops/binder/producers.rb +67 -62
  121. data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
  122. data/lib/puppet/pops/evaluator/closure.rb +84 -68
  123. data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
  124. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  125. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  126. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  127. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  128. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  129. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  130. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  131. data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
  132. data/lib/puppet/pops/issue_reporter.rb +6 -4
  133. data/lib/puppet/pops/issues.rb +34 -11
  134. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  135. data/lib/puppet/pops/loader/loader.rb +1 -1
  136. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  137. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  138. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
  139. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  140. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  141. data/lib/puppet/pops/loaders.rb +51 -9
  142. data/lib/puppet/pops/lookup.rb +14 -12
  143. data/lib/puppet/pops/merge_strategy.rb +16 -19
  144. data/lib/puppet/pops/model/factory.rb +26 -2
  145. data/lib/puppet/pops/model/model.rb +8 -8
  146. data/lib/puppet/pops/model/model_label_provider.rb +13 -7
  147. data/lib/puppet/pops/model/model_meta.rb +17 -0
  148. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  149. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  150. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  151. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  152. data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
  153. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  154. data/lib/puppet/pops/parser/lexer2.rb +26 -19
  155. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  156. data/lib/puppet/pops/parser/locator.rb +21 -0
  157. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  158. data/lib/puppet/pops/parser/slurp_support.rb +11 -7
  159. data/lib/puppet/pops/types/class_loader.rb +23 -19
  160. data/lib/puppet/pops/types/enumeration.rb +9 -26
  161. data/lib/puppet/pops/types/iterable.rb +308 -0
  162. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  163. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  164. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  165. data/lib/puppet/pops/types/type_calculator.rb +138 -381
  166. data/lib/puppet/pops/types/type_factory.rb +91 -57
  167. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  168. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  169. data/lib/puppet/pops/types/type_parser.rb +159 -112
  170. data/lib/puppet/pops/types/types.rb +2057 -1247
  171. data/lib/puppet/pops/utils.rb +11 -10
  172. data/lib/puppet/pops/validation.rb +11 -9
  173. data/lib/puppet/pops/validation/checker4_0.rb +83 -55
  174. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  175. data/lib/puppet/provider/aixobject.rb +1 -1
  176. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  177. data/lib/puppet/provider/cron/crontab.rb +1 -1
  178. data/lib/puppet/provider/exec/windows.rb +1 -1
  179. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  180. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  181. data/lib/puppet/provider/package/appdmg.rb +3 -2
  182. data/lib/puppet/provider/package/dnf.rb +1 -1
  183. data/lib/puppet/provider/package/pip.rb +5 -8
  184. data/lib/puppet/provider/package/pip3.rb +1 -1
  185. data/lib/puppet/provider/package/pkg.rb +1 -1
  186. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  187. data/lib/puppet/provider/package/pkgng.rb +13 -4
  188. data/lib/puppet/provider/package/windows.rb +1 -1
  189. data/lib/puppet/provider/package/yum.rb +1 -1
  190. data/lib/puppet/provider/package/zypper.rb +19 -0
  191. data/lib/puppet/provider/service/debian.rb +2 -2
  192. data/lib/puppet/provider/service/launchd.rb +6 -18
  193. data/lib/puppet/provider/service/systemd.rb +9 -2
  194. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  195. data/lib/puppet/provider/user/aix.rb +1 -1
  196. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  197. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  198. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  199. data/lib/puppet/reference/configuration.rb +1 -1
  200. data/lib/puppet/reference/providers.rb +1 -1
  201. data/lib/puppet/resource.rb +15 -12
  202. data/lib/puppet/resource/capability_finder.rb +20 -13
  203. data/lib/puppet/resource/catalog.rb +60 -3
  204. data/lib/puppet/resource/status.rb +11 -2
  205. data/lib/puppet/resource/type.rb +28 -38
  206. data/lib/puppet/settings.rb +1 -1
  207. data/lib/puppet/settings/config_file.rb +1 -1
  208. data/lib/puppet/settings/environment_conf.rb +13 -5
  209. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  210. data/lib/puppet/ssl/certificate_request.rb +4 -4
  211. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  212. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  213. data/lib/puppet/test/test_helper.rb +16 -4
  214. data/lib/puppet/transaction.rb +15 -2
  215. data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
  216. data/lib/puppet/transaction/report.rb +31 -1
  217. data/lib/puppet/transaction/resource_harness.rb +0 -25
  218. data/lib/puppet/type.rb +11 -11
  219. data/lib/puppet/type/augeas.rb +1 -1
  220. data/lib/puppet/type/cron.rb +12 -12
  221. data/lib/puppet/type/file.rb +91 -39
  222. data/lib/puppet/type/file/checksum_value.rb +53 -0
  223. data/lib/puppet/type/file/content.rb +26 -111
  224. data/lib/puppet/type/file/data_sync.rb +84 -0
  225. data/lib/puppet/type/file/ensure.rb +17 -14
  226. data/lib/puppet/type/file/selcontext.rb +1 -1
  227. data/lib/puppet/type/file/source.rb +103 -18
  228. data/lib/puppet/type/filebucket.rb +1 -1
  229. data/lib/puppet/type/interface.rb +8 -3
  230. data/lib/puppet/type/macauthorization.rb +1 -1
  231. data/lib/puppet/type/package.rb +6 -0
  232. data/lib/puppet/type/schedule.rb +1 -1
  233. data/lib/puppet/type/stage.rb +1 -1
  234. data/lib/puppet/type/user.rb +19 -17
  235. data/lib/puppet/type/yumrepo.rb +20 -0
  236. data/lib/puppet/util.rb +109 -22
  237. data/lib/puppet/util/autoload.rb +16 -11
  238. data/lib/puppet/util/checksums.rb +74 -31
  239. data/lib/puppet/util/execution.rb +1 -1
  240. data/lib/puppet/util/http_proxy.rb +72 -0
  241. data/lib/puppet/util/log.rb +2 -0
  242. data/lib/puppet/util/logging.rb +43 -1
  243. data/lib/puppet/util/monkey_patches.rb +2 -2
  244. data/lib/puppet/util/multi_match.rb +51 -0
  245. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  246. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  247. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  248. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  249. data/lib/puppet/util/plist.rb +130 -0
  250. data/lib/puppet/util/resource_template.rb +1 -1
  251. data/lib/puppet/util/run_mode.rb +2 -2
  252. data/lib/puppet/util/skip_tags.rb +9 -0
  253. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  254. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  255. data/lib/puppet/util/windows/adsi.rb +4 -4
  256. data/lib/puppet/util/windows/api_types.rb +24 -18
  257. data/lib/puppet/util/windows/com.rb +3 -3
  258. data/lib/puppet/util/windows/error.rb +1 -1
  259. data/lib/puppet/util/windows/file.rb +8 -8
  260. data/lib/puppet/util/windows/principal.rb +23 -14
  261. data/lib/puppet/util/windows/process.rb +78 -11
  262. data/lib/puppet/util/windows/registry.rb +1 -1
  263. data/lib/puppet/util/windows/root_certs.rb +5 -5
  264. data/lib/puppet/util/windows/security.rb +33 -35
  265. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  266. data/lib/puppet/util/windows/sid.rb +42 -4
  267. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  268. data/lib/puppet/util/windows/user.rb +10 -10
  269. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  270. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  271. data/lib/puppet/vendor/pathspec/README.md +1 -1
  272. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  273. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  274. data/lib/puppet/version.rb +1 -1
  275. data/lib/semver.rb +17 -1
  276. data/man/man5/puppet.conf.5 +12 -12
  277. data/man/man8/extlookup2hiera.8 +1 -1
  278. data/man/man8/puppet-agent.8 +2 -2
  279. data/man/man8/puppet-apply.8 +2 -2
  280. data/man/man8/puppet-ca.8 +2 -2
  281. data/man/man8/puppet-catalog.8 +2 -2
  282. data/man/man8/puppet-cert.8 +2 -2
  283. data/man/man8/puppet-certificate.8 +2 -2
  284. data/man/man8/puppet-certificate_request.8 +2 -2
  285. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  286. data/man/man8/puppet-config.8 +3 -3
  287. data/man/man8/puppet-describe.8 +1 -1
  288. data/man/man8/puppet-device.8 +1 -1
  289. data/man/man8/puppet-doc.8 +1 -1
  290. data/man/man8/puppet-epp.8 +2 -2
  291. data/man/man8/puppet-facts.8 +2 -2
  292. data/man/man8/puppet-file.8 +2 -2
  293. data/man/man8/puppet-filebucket.8 +2 -2
  294. data/man/man8/puppet-help.8 +2 -2
  295. data/man/man8/puppet-inspect.8 +2 -2
  296. data/man/man8/puppet-key.8 +2 -2
  297. data/man/man8/puppet-man.8 +2 -2
  298. data/man/man8/puppet-master.8 +2 -2
  299. data/man/man8/puppet-module.8 +9 -9
  300. data/man/man8/puppet-node.8 +2 -2
  301. data/man/man8/puppet-parser.8 +2 -2
  302. data/man/man8/puppet-plugin.8 +2 -2
  303. data/man/man8/puppet-report.8 +2 -2
  304. data/man/man8/puppet-resource.8 +2 -2
  305. data/man/man8/puppet-resource_type.8 +2 -2
  306. data/man/man8/puppet-status.8 +3 -3
  307. data/man/man8/puppet.8 +1 -1
  308. data/spec/fixtures/module.tar.gz +0 -0
  309. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  310. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  311. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  312. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  313. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  314. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  315. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  316. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  317. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  318. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  319. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  320. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  321. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
  322. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  323. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  324. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  325. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  326. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  327. 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
  328. 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
  329. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  330. 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
  331. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  332. 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
  333. 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
  334. data/spec/integration/defaults_spec.rb +14 -2
  335. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  336. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  337. data/spec/integration/node/environment_spec.rb +13 -0
  338. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  339. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  340. data/spec/integration/parser/undef_param_spec.rb +8 -0
  341. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  342. data/spec/integration/test/test_helper_spec.rb +28 -0
  343. data/spec/integration/transaction/report_spec.rb +16 -0
  344. data/spec/integration/transaction_spec.rb +11 -0
  345. data/spec/integration/type/file_spec.rb +194 -4
  346. data/spec/integration/type/package_spec.rb +5 -1
  347. data/spec/integration/type/tidy_spec.rb +21 -9
  348. data/spec/integration/util/execution_spec.rb +22 -0
  349. data/spec/integration/util/windows/principal_spec.rb +90 -4
  350. data/spec/integration/util/windows/process_spec.rb +31 -0
  351. data/spec/integration/util/windows/security_spec.rb +6 -6
  352. data/spec/integration/util/windows/user_spec.rb +1 -1
  353. data/spec/integration/util_spec.rb +49 -27
  354. data/spec/lib/puppet_spec/compiler.rb +17 -0
  355. data/spec/lib/puppet_spec/files.rb +2 -2
  356. data/spec/lib/puppet_spec/pops.rb +13 -0
  357. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  358. data/spec/shared_contexts/types_setup.rb +96 -0
  359. data/spec/unit/agent_spec.rb +1 -0
  360. data/spec/unit/application/agent_spec.rb +10 -0
  361. data/spec/unit/application/apply_spec.rb +9 -0
  362. data/spec/unit/configurer/downloader_spec.rb +5 -5
  363. data/spec/unit/configurer_spec.rb +271 -39
  364. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  365. data/spec/unit/defaults_spec.rb +15 -0
  366. data/spec/unit/environments_spec.rb +24 -4
  367. data/spec/unit/face/parser_spec.rb +43 -2
  368. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  369. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  371. data/spec/unit/file_system_spec.rb +26 -0
  372. data/spec/unit/functions/assert_type_spec.rb +36 -2
  373. data/spec/unit/functions/defined_spec.rb +2 -2
  374. data/spec/unit/functions/epp_spec.rb +11 -3
  375. data/spec/unit/functions/lookup_spec.rb +58 -13
  376. data/spec/unit/functions/regsubst_spec.rb +1 -1
  377. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  378. data/spec/unit/functions/step_spec.rb +113 -0
  379. data/spec/unit/functions/type_spec.rb +35 -0
  380. data/spec/unit/functions4_spec.rb +61 -5
  381. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  382. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  383. data/spec/unit/indirector/indirection_spec.rb +1 -1
  384. data/spec/unit/info_service_spec.rb +94 -32
  385. data/spec/unit/module_spec.rb +14 -0
  386. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  387. data/spec/unit/network/authstore_spec.rb +1 -1
  388. data/spec/unit/network/http/connection_spec.rb +1 -0
  389. data/spec/unit/network/http/pool_spec.rb +30 -0
  390. data/spec/unit/node_spec.rb +1 -1
  391. data/spec/unit/parser/compiler_spec.rb +16 -0
  392. data/spec/unit/parser/scope_spec.rb +28 -11
  393. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  394. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  395. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
  396. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  397. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  398. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  400. data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
  401. data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
  402. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  403. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  404. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  405. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  406. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  407. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  408. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  409. data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
  410. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  411. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  412. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  413. data/spec/unit/pops/types/types_spec.rb +241 -0
  414. data/spec/unit/pops/validator/validator_spec.rb +100 -43
  415. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  416. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  417. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  418. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  419. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  420. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  421. data/spec/unit/provider/package/pip_spec.rb +47 -34
  422. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  423. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  424. data/spec/unit/provider/package/yum_spec.rb +11 -0
  425. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  426. data/spec/unit/provider/service/launchd_spec.rb +17 -35
  427. data/spec/unit/provider/service/systemd_spec.rb +7 -0
  428. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  429. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  430. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  431. data/spec/unit/resource/catalog_spec.rb +33 -1
  432. data/spec/unit/resource/type_spec.rb +149 -7
  433. data/spec/unit/resource_spec.rb +96 -57
  434. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  435. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  436. data/spec/unit/transaction/report_spec.rb +27 -0
  437. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  438. data/spec/unit/transaction_spec.rb +5 -0
  439. data/spec/unit/type/file/checksum_spec.rb +6 -0
  440. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  441. data/spec/unit/type/file/content_spec.rb +12 -193
  442. data/spec/unit/type/file/source_spec.rb +211 -119
  443. data/spec/unit/type/file_spec.rb +133 -34
  444. data/spec/unit/type/interface_spec.rb +32 -0
  445. data/spec/unit/type/macauthorization_spec.rb +4 -1
  446. data/spec/unit/type/yumrepo_spec.rb +2 -2
  447. data/spec/unit/util/filetype_spec.rb +1 -1
  448. data/spec/unit/util/http_proxy_spec.rb +2 -2
  449. data/spec/unit/util/log/destinations_spec.rb +0 -2
  450. data/spec/unit/util/logging_spec.rb +69 -0
  451. data/spec/unit/util/multi_match_spec.rb +39 -0
  452. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  453. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  454. data/spec/unit/util/plist_spec.rb +110 -0
  455. data/spec/unit/util/resource_template_spec.rb +2 -2
  456. data/spec/unit/util/run_mode_spec.rb +27 -3
  457. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  458. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  459. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  460. data/spec/unit/util/windows/sid_spec.rb +1 -1
  461. data/spec/unit/util_spec.rb +123 -13
  462. data/tasks/cfpropertylist.rake +15 -0
  463. metadata +114 -26
  464. data/lib/puppet/vendor/load_plist.rb +0 -1
  465. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  466. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  467. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  468. data/lib/puppet/vendor/plist/README +0 -36
  469. data/lib/puppet/vendor/plist/Rakefile +0 -144
  470. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  471. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  472. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  473. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  474. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  475. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  476. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  477. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  478. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  479. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  480. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  481. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  482. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  483. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  484. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  485. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  486. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  487. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -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
@@ -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
@@ -21,24 +21,118 @@ module Util
21
21
  require 'puppet/util/posix'
22
22
  extend Puppet::Util::POSIX
23
23
 
24
+ # Can't use Puppet.features.microsoft_windows? as it may be mocked out in a test. This can cause test recurring test failures
25
+ require 'puppet/util/windows/process' if Puppet::Util::Platform.windows?
26
+
24
27
  extend Puppet::Util::SymbolicFileMode
25
28
 
26
- # Run some code with a specific environment. Resets the environment back to
27
- # what it was at the end of the code.
28
- def self.withenv(hash)
29
- saved = ENV.to_hash
30
- hash.each do |name, val|
31
- ENV[name.to_s] = val
29
+ def default_env
30
+ Puppet.features.microsoft_windows? ?
31
+ :windows :
32
+ :posix
33
+ end
34
+ module_function :default_env
35
+
36
+ # @param name [String] The name of the environment variable to retrieve
37
+ # @param mode [Symbol] Which operating system mode to use e.g. :posix or :windows. Use nil to autodetect
38
+ # @return [String] Value of the specified environment variable. nil if it does not exist
39
+ # @api private
40
+ def get_env(name, mode = default_env)
41
+ if mode == :windows
42
+ Puppet::Util::Windows::Process.get_environment_strings.each do |key, value |
43
+ if name.casecmp(key) == 0 then
44
+ return value
45
+ end
46
+ end
47
+ return nil
48
+ else
49
+ ENV[name]
50
+ end
51
+ end
52
+ module_function :get_env
53
+
54
+ # @param mode [Symbol] Which operating system mode to use e.g. :posix or :windows. Use nil to autodetect
55
+ # @return [Hash] A hashtable of all environment variables
56
+ # @api private
57
+ def get_environment(mode = default_env)
58
+ case mode
59
+ when :posix
60
+ ENV.to_hash
61
+ when :windows
62
+ Puppet::Util::Windows::Process.get_environment_strings
63
+ else
64
+ raise "Unable to retrieve the environment for mode #{mode}"
65
+ end
66
+ end
67
+ module_function :get_environment
68
+
69
+ # Removes all environment variables
70
+ # @param mode [Symbol] Which operating system mode to use e.g. :posix or :windows. Use nil to autodetect
71
+ # @api private
72
+ def clear_environment(mode = default_env)
73
+ case mode
74
+ when :posix
75
+ ENV.clear
76
+ when :windows
77
+ Puppet::Util::Windows::Process.get_environment_strings.each do |key, _|
78
+ Puppet::Util::Windows::Process.set_environment_variable(key, nil)
79
+ end
80
+ else
81
+ raise "Unable to clear the environment for mode #{mode}"
82
+ end
83
+ end
84
+ module_function :clear_environment
85
+
86
+ # @param name [String] The name of the environment variable to set
87
+ # @param value [String] The value to set the variable to. nil deletes the environment variable
88
+ # @param mode [Symbol] Which operating system mode to use e.g. :posix or :windows. Use nil to autodetect
89
+ # @api private
90
+ def set_env(name, value = nil, mode = default_env)
91
+ case mode
92
+ when :posix
93
+ ENV[name] = value
94
+ when :windows
95
+ Puppet::Util::Windows::Process.set_environment_variable(name,value)
96
+ else
97
+ raise "Unable to set the environment variable #{name} for mode #{mode}"
98
+ end
99
+ end
100
+ module_function :set_env
101
+
102
+ # @param name [Hash] Environment variables to merge into the existing environment. nil values will remove the variable
103
+ # @param mode [Symbol] Which operating system mode to use e.g. :posix or :windows. Use nil to autodetect
104
+ # @api private
105
+ def merge_environment(env_hash, mode = default_env)
106
+ case mode
107
+ when :posix
108
+ env_hash.each { |name, val| ENV[name.to_s] = val }
109
+ when :windows
110
+ env_hash.each do |name, val|
111
+ Puppet::Util::Windows::Process.set_environment_variable(name.to_s, val)
112
+ end
113
+ else
114
+ raise "Unable to merge given values into the current environment for mode #{mode}"
32
115
  end
116
+ end
117
+ module_function :merge_environment
33
118
 
119
+ # Run some code with a specific environment. Resets the environment back to
120
+ # what it was at the end of the code.
121
+ # Windows can store unicode chars in the environment as keys or values, but
122
+ # Rubys ENV tries to roundtrip them through the local codepage, which can
123
+ # cause encoding problems - underlying helpers use Windows APIs on Windows
124
+ # see https://bugs.ruby-lang.org/issues/8822
125
+ def withenv(hash, mode = :posix)
126
+ saved = get_environment(mode)
127
+ merge_environment(hash, mode)
34
128
  yield
35
129
  ensure
36
- ENV.clear
37
- saved.each do |name, val|
38
- ENV[name] = val
130
+ if saved
131
+ clear_environment(mode)
132
+ merge_environment(saved, mode)
39
133
  end
40
134
  end
41
-
135
+ module_function :withenv
42
136
 
43
137
  # Execute a given chunk of code with a new umask.
44
138
  def self.withumask(mask)
@@ -147,14 +241,16 @@ module Util
147
241
  if absolute_path?(bin)
148
242
  return bin if FileTest.file? bin and FileTest.executable? bin
149
243
  else
150
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |dir|
244
+ exts = Puppet::Util.get_env('PATHEXT')
245
+ exts = exts ? exts.split(File::PATH_SEPARATOR) : %w[.COM .EXE .BAT .CMD]
246
+ Puppet::Util.get_env('PATH').split(File::PATH_SEPARATOR).each do |dir|
151
247
  begin
152
248
  dest = File.expand_path(File.join(dir, bin))
153
249
  rescue ArgumentError => e
154
250
  # if the user's PATH contains a literal tilde (~) character and HOME is not set, we may get
155
251
  # an ArgumentError here. Let's check to see if that is the case; if not, re-raise whatever error
156
252
  # was thrown.
157
- if e.to_s =~ /HOME/ and (ENV['HOME'].nil? || ENV['HOME'] == "")
253
+ if e.to_s =~ /HOME/ and (Puppet::Util.get_env('HOME').nil? || Puppet::Util.get_env('HOME') == "")
158
254
  # if we get here they have a tilde in their PATH. We'll issue a single warning about this and then
159
255
  # ignore this path element and carry on with our lives.
160
256
  Puppet::Util::Warnings.warnonce("PATH contains a ~ character, and HOME is not set; ignoring PATH element '#{dir}'.")
@@ -166,8 +262,6 @@ module Util
166
262
  end
167
263
  else
168
264
  if Puppet.features.microsoft_windows? && File.extname(dest).empty?
169
- exts = ENV['PATHEXT']
170
- exts = exts ? exts.split(File::PATH_SEPARATOR) : %w[.COM .EXE .BAT .CMD]
171
265
  exts.each do |ext|
172
266
  destext = File.expand_path(dest + ext)
173
267
  return destext if FileTest.file? destext and FileTest.executable? destext
@@ -467,14 +561,7 @@ module Util
467
561
  module_function :deterministic_rand
468
562
 
469
563
  def deterministic_rand_int(seed,max)
470
- if defined?(Random) == 'constant' && Random.class == Class
471
- Random.new(seed).rand(max)
472
- else
473
- srand(seed)
474
- result = rand(max)
475
- srand()
476
- result
477
- end
564
+ Random.new(seed).rand(max)
478
565
  end
479
566
  module_function :deterministic_rand_int
480
567
  end
@@ -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