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
@@ -1,84 +1,86 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
 
4
- require 'puppet/util/network_device/transport/telnet'
4
+ if Puppet.features.telnet?
5
+ require 'puppet/util/network_device/transport/telnet'
5
6
 
6
- describe Puppet::Util::NetworkDevice::Transport::Telnet do
7
+ describe Puppet::Util::NetworkDevice::Transport::Telnet do
7
8
 
8
- before(:each) do
9
- TCPSocket.stubs(:open).returns stub_everything('tcp')
10
- @transport = Puppet::Util::NetworkDevice::Transport::Telnet.new()
11
- end
12
-
13
- it "should not handle login through the transport" do
14
- expect(@transport).not_to be_handles_login
15
- end
16
-
17
- it "should not open any files" do
18
- File.expects(:open).never
19
- @transport.host = "localhost"
20
- @transport.port = 23
21
-
22
- @transport.connect
23
- end
9
+ before(:each) do
10
+ TCPSocket.stubs(:open).returns stub_everything('tcp')
11
+ @transport = Puppet::Util::NetworkDevice::Transport::Telnet.new()
12
+ end
24
13
 
25
- it "should connect to the given host and port" do
26
- Net::Telnet.expects(:new).with { |args| args["Host"] == "localhost" && args["Port"] == 23 }.returns stub_everything
27
- @transport.host = "localhost"
28
- @transport.port = 23
14
+ it "should not handle login through the transport" do
15
+ expect(@transport).not_to be_handles_login
16
+ end
29
17
 
30
- @transport.connect
31
- end
18
+ it "should not open any files" do
19
+ File.expects(:open).never
20
+ @transport.host = "localhost"
21
+ @transport.port = 23
32
22
 
33
- it "should connect and specify the default prompt" do
34
- @transport.default_prompt = "prompt"
35
- Net::Telnet.expects(:new).with { |args| args["Prompt"] == "prompt" }.returns stub_everything
36
- @transport.host = "localhost"
37
- @transport.port = 23
23
+ @transport.connect
24
+ end
38
25
 
39
- @transport.connect
40
- end
26
+ it "should connect to the given host and port" do
27
+ Net::Telnet.expects(:new).with { |args| args["Host"] == "localhost" && args["Port"] == 23 }.returns stub_everything
28
+ @transport.host = "localhost"
29
+ @transport.port = 23
41
30
 
42
- describe "when connected" do
43
- before(:each) do
44
- @telnet = stub_everything 'telnet'
45
- Net::Telnet.stubs(:new).returns(@telnet)
46
31
  @transport.connect
47
32
  end
48
33
 
49
- it "should send line to the telnet session" do
50
- @telnet.expects(:puts).with("line")
51
- @transport.send("line")
34
+ it "should connect and specify the default prompt" do
35
+ @transport.default_prompt = "prompt"
36
+ Net::Telnet.expects(:new).with { |args| args["Prompt"] == "prompt" }.returns stub_everything
37
+ @transport.host = "localhost"
38
+ @transport.port = 23
39
+
40
+ @transport.connect
52
41
  end
53
42
 
54
- describe "when expecting output" do
55
- it "should waitfor output on the telnet session" do
56
- @telnet.expects(:waitfor).with(/regex/)
57
- @transport.expect(/regex/)
43
+ describe "when connected" do
44
+ before(:each) do
45
+ @telnet = stub_everything 'telnet'
46
+ Net::Telnet.stubs(:new).returns(@telnet)
47
+ @transport.connect
58
48
  end
59
49
 
60
- it "should return telnet session output" do
61
- @telnet.expects(:waitfor).returns("output")
62
- expect(@transport.expect(/regex/)).to eq("output")
50
+ it "should send line to the telnet session" do
51
+ @telnet.expects(:puts).with("line")
52
+ @transport.send("line")
63
53
  end
64
54
 
65
- it "should yield telnet session output to the given block" do
66
- @telnet.expects(:waitfor).yields("output")
67
- @transport.expect(/regex/) { |out| expect(out).to eq("output") }
55
+ describe "when expecting output" do
56
+ it "should waitfor output on the telnet session" do
57
+ @telnet.expects(:waitfor).with(/regex/)
58
+ @transport.expect(/regex/)
59
+ end
60
+
61
+ it "should return telnet session output" do
62
+ @telnet.expects(:waitfor).returns("output")
63
+ expect(@transport.expect(/regex/)).to eq("output")
64
+ end
65
+
66
+ it "should yield telnet session output to the given block" do
67
+ @telnet.expects(:waitfor).yields("output")
68
+ @transport.expect(/regex/) { |out| expect(out).to eq("output") }
69
+ end
68
70
  end
69
71
  end
70
- end
71
72
 
72
- describe "when closing" do
73
- before(:each) do
74
- @telnet = stub_everything 'telnet'
75
- Net::Telnet.stubs(:new).returns(@telnet)
76
- @transport.connect
77
- end
73
+ describe "when closing" do
74
+ before(:each) do
75
+ @telnet = stub_everything 'telnet'
76
+ Net::Telnet.stubs(:new).returns(@telnet)
77
+ @transport.connect
78
+ end
78
79
 
79
- it "should close the telnet session" do
80
- @telnet.expects(:close)
81
- @transport.close
80
+ it "should close the telnet session" do
81
+ @telnet.expects(:close)
82
+ @transport.close
83
+ end
82
84
  end
83
85
  end
84
86
  end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+ require 'puppet/util/plist' if Puppet.features.cfpropertylist?
3
+ require 'puppet_spec/files'
4
+
5
+ module Puppet::Util::Plist; end
6
+
7
+ describe Puppet::Util::Plist, :if => Puppet.features.cfpropertylist? do
8
+ include PuppetSpec::Files
9
+
10
+ let(:valid_xml_plist) do
11
+ '<?xml version="1.0" encoding="UTF-8"?>
12
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
13
+ <plist version="1.0">
14
+ <dict>
15
+ <key>LastUsedPrinters</key>
16
+ <array>
17
+ <dict>
18
+ <key>Network</key>
19
+ <string>10.85.132.1</string>
20
+ <key>PrinterID</key>
21
+ <string>baskerville_corp_puppetlabs_net</string>
22
+ </dict>
23
+ <dict>
24
+ <key>Network</key>
25
+ <string>10.14.96.1</string>
26
+ <key>PrinterID</key>
27
+ <string>Statler</string>
28
+ </dict>
29
+ </array>
30
+ </dict>
31
+ </plist>'
32
+ end
33
+ let(:invalid_xml_plist) do
34
+ '<?xml version="1.0" encoding="UTF-8"?>
35
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
36
+ <plist version="1.0">
37
+ <dict>
38
+ <key>LastUsedPrinters</key>
39
+ <array>
40
+ <dict>
41
+ <!-- this comment is --terrible -->
42
+ <key>Network</key>
43
+ <string>10.85.132.1</string>
44
+ <key>PrinterID</key>
45
+ <string>baskerville_corp_puppetlabs_net</string>
46
+ </dict>
47
+ <dict>
48
+ <key>Network</key>
49
+ <string>10.14.96.1</string>
50
+ <key>PrinterID</key>
51
+ <string>Statler</string>
52
+ </dict>
53
+ </array>
54
+ </dict>
55
+ </plist>'
56
+ end
57
+ let(:valid_xml_plist_hash) { {"LastUsedPrinters"=>[{"Network"=>"10.85.132.1", "PrinterID"=>"baskerville_corp_puppetlabs_net"}, {"Network"=>"10.14.96.1", "PrinterID"=>"Statler"}]} }
58
+ let(:plist_path) { file_containing('sample.plist', valid_xml_plist) }
59
+ let(:binary_plist_magic_number) { 'bplist00' }
60
+ let(:bad_xml_doctype) { '<!DOCTYPE plist PUBLIC -//Apple Computer' }
61
+ let(:good_xml_doctype) { '<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' }
62
+
63
+ describe "#read_plist_file" do
64
+ it "calls #convert_cfpropertylist_to_native_types on a plist object when a valid binary plist is read" do
65
+ subject.stubs(:read_file_with_offset).with(plist_path, 8).returns(binary_plist_magic_number)
66
+ subject.stubs(:new_cfpropertylist).with({:file => plist_path}).returns('plist_object')
67
+ subject.expects(:convert_cfpropertylist_to_native_types).with('plist_object').returns('plist_hash')
68
+ expect(subject.read_plist_file(plist_path)).to eq('plist_hash')
69
+ end
70
+ it "returns a valid hash when a valid XML plist is read" do
71
+ subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
72
+ subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(valid_xml_plist)
73
+ expect(subject.read_plist_file(plist_path)).to eq(valid_xml_plist_hash)
74
+ end
75
+ it "raises a debug message and replaces a bad XML plist doctype should one be encountered" do
76
+ subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
77
+ subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(bad_xml_doctype)
78
+ subject.expects(:new_cfpropertylist).with({:data => good_xml_doctype}).returns('plist_object')
79
+ subject.stubs(:convert_cfpropertylist_to_native_types).with('plist_object').returns('plist_hash')
80
+ Puppet.expects(:debug).with("Had to fix plist with incorrect DOCTYPE declaration: #{plist_path}")
81
+ expect(subject.read_plist_file(plist_path)).to eq('plist_hash')
82
+ end
83
+ it "attempts to read pure xml using plutil when reading an improperly formatted service plist" do
84
+ subject.stubs(:read_file_with_offset).with(plist_path, 8).returns('notbinary')
85
+ subject.stubs(:open_file_with_args).with(plist_path, 'r:UTF-8').returns(invalid_xml_plist)
86
+ Puppet.expects(:debug).with(regexp_matches(/^Failed with CFFormatError/))
87
+ Puppet.expects(:debug).with("Plist #{plist_path} ill-formatted, converting with plutil")
88
+ Puppet::Util::Execution.expects(:execute).with(['/usr/bin/plutil', '-convert', 'xml1', '-o', '/dev/stdout', plist_path],
89
+ {:failonfail => true, :combine => true}).returns(valid_xml_plist)
90
+ expect(subject.read_plist_file(plist_path)).to eq(valid_xml_plist_hash)
91
+ end
92
+ end
93
+
94
+ describe "#parse_plist" do
95
+ it "returns a valid hash when a valid XML plist is provided" do
96
+ expect(subject.parse_plist(valid_xml_plist)).to eq(valid_xml_plist_hash)
97
+ end
98
+ it "raises a debug message and replaces a bad XML plist doctype should one be encountered" do
99
+ subject.expects(:new_cfpropertylist).with({:data => good_xml_doctype}).returns('plist_object')
100
+ subject.stubs(:convert_cfpropertylist_to_native_types).with('plist_object')
101
+ Puppet.expects(:debug).with("Had to fix plist with incorrect DOCTYPE declaration: #{plist_path}")
102
+ subject.parse_plist(bad_xml_doctype, plist_path)
103
+ end
104
+ it "raises a debug message with malformed plist" do
105
+ subject.stubs(:convert_cfpropertylist_to_native_types).with('plist_object')
106
+ Puppet.expects(:debug).with(regexp_matches(/^Failed with CFFormatError/))
107
+ subject.parse_plist("<plist><dict><key>Foo</key>")
108
+ end
109
+ end
110
+ end
@@ -20,7 +20,7 @@ describe Puppet::Util::ResourceTemplate do
20
20
  describe "when evaluating" do
21
21
  before do
22
22
  Puppet::FileSystem.stubs(:exist?).returns true
23
- File.stubs(:read).returns "eh"
23
+ Puppet::FileSystem.stubs(:read).returns "eh"
24
24
 
25
25
  @template = stub 'template', :result => nil
26
26
  ERB.stubs(:new).returns @template
@@ -38,7 +38,7 @@ describe Puppet::Util::ResourceTemplate do
38
38
  end
39
39
 
40
40
  it "should create a template instance with the contents of the file" do
41
- File.expects(:read).with("/my/template").returns "yay"
41
+ Puppet::FileSystem.expects(:read).with("/my/template", :encoding => 'utf-8').returns "yay"
42
42
  ERB.expects(:new).with("yay", 0, "-").returns(@template)
43
43
 
44
44
  @wrapper.stubs :set_resource_variables
@@ -261,6 +261,30 @@ describe Puppet::Util::RunMode do
261
261
  end
262
262
  end
263
263
  end
264
+
265
+ describe "#without_env internal helper with UTF8 characters" do
266
+ let(:varname) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
267
+ let(:rune_utf8) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
268
+
269
+ before do
270
+ Puppet::Util::Windows::Process.set_environment_variable(varname, rune_utf8)
271
+ end
272
+
273
+ it "removes environment variables within the block with UTF8 name" do
274
+ without_env(varname) do
275
+ expect(ENV[varname]).to be(nil)
276
+ end
277
+ end
278
+
279
+ it "restores UTF8 characters in environment variable values" do
280
+ without_env(varname) do
281
+ Puppet::Util::Windows::Process.set_environment_variable(varname, 'bad value')
282
+ end
283
+
284
+ envhash = Puppet::Util::Windows::Process.get_environment_strings
285
+ expect(envhash[varname]).to eq(rune_utf8)
286
+ end
287
+ end
264
288
  end
265
289
 
266
290
  def as_root
@@ -274,11 +298,11 @@ describe Puppet::Util::RunMode do
274
298
  end
275
299
 
276
300
  def without_env(name, &block)
277
- saved = ENV[name]
278
- ENV.delete name
301
+ saved = Puppet::Util.get_env(name)
302
+ Puppet::Util.set_env(name, nil)
279
303
  yield
280
304
  ensure
281
- ENV[name] = saved
305
+ Puppet::Util.set_env(name, saved)
282
306
  end
283
307
 
284
308
  def without_home(&block)
@@ -108,14 +108,14 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
108
108
  end
109
109
 
110
110
  it "should be able to confirm the existence of a user with a well-known SID" do
111
- system_user = Win32::Security::SID::LocalSystem
111
+ system_user = Puppet::Util::Windows::SID::LocalSystem
112
112
  # ensure that the underlying OS is queried here
113
113
  Puppet::Util::Windows::ADSI.unstub(:connect)
114
114
  expect(Puppet::Util::Windows::ADSI::User.exists?(system_user)).to be_truthy
115
115
  end
116
116
 
117
117
  it "should return false with a well-known Group SID" do
118
- group = Win32::Security::SID::BuiltinAdministrators
118
+ group = Puppet::Util::Windows::SID::BuiltinAdministrators
119
119
  # ensure that the underlying OS is queried here
120
120
  Puppet::Util::Windows::ADSI.unstub(:connect)
121
121
  expect(Puppet::Util::Windows::ADSI::User.exists?(group)).to be_falsey
@@ -446,14 +446,14 @@ describe Puppet::Util::Windows::ADSI, :if => Puppet.features.microsoft_windows?
446
446
 
447
447
  it "should be able to confirm the existence of a group with a well-known SID" do
448
448
 
449
- service_group = Win32::Security::SID::Service
449
+ service_group = Puppet::Util::Windows::SID::Service
450
450
  # ensure that the underlying OS is queried here
451
451
  Puppet::Util::Windows::ADSI.unstub(:connect)
452
452
  expect(Puppet::Util::Windows::ADSI::Group.exists?(service_group)).to be_truthy
453
453
  end
454
454
 
455
455
  it "will return true with a well-known User SID, as there is no way to resolve it with a WinNT:// style moniker" do
456
- user = Win32::Security::SID::NtLocal
456
+ user = Puppet::Util::Windows::SID::NtLocal
457
457
  # ensure that the underlying OS is queried here
458
458
  Puppet::Util::Windows::ADSI.unstub(:connect)
459
459
  expect(Puppet::Util::Windows::ADSI::Group.exists?(user)).to be_truthy
@@ -25,4 +25,46 @@ describe "FFI::MemoryPointer", :if => Puppet.features.microsoft_windows? do
25
25
  expect(read_string.encoding).to eq(Encoding::UTF_8)
26
26
  end
27
27
  end
28
+
29
+ context "read_arbitrary_wide_string_up_to" do
30
+ let (:string) { "foo_bar" }
31
+ let (:single_null_string) { string + "\x00" }
32
+ let (:double_null_string) { string + "\x00\x00" }
33
+
34
+ it "should read a short single null terminated string" do
35
+ read_string = nil
36
+ FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
37
+ read_string = ptr.read_arbitrary_wide_string_up_to()
38
+ end
39
+
40
+ expect(read_string).to eq(string)
41
+ end
42
+
43
+ it "should read a short double null terminated string" do
44
+ read_string = nil
45
+ FFI::MemoryPointer.from_string_to_wide_string(double_null_string) do |ptr|
46
+ read_string = ptr.read_arbitrary_wide_string_up_to(512, :double_null)
47
+ end
48
+
49
+ expect(read_string).to eq(string)
50
+ end
51
+
52
+ it "should return a string of max_length characters when specified" do
53
+ read_string = nil
54
+ FFI::MemoryPointer.from_string_to_wide_string(single_null_string) do |ptr|
55
+ read_string = ptr.read_arbitrary_wide_string_up_to(3)
56
+ end
57
+
58
+ expect(read_string).to eq(string[0..2])
59
+ end
60
+
61
+ it "should return wide strings in UTF-8" do
62
+ read_string = nil
63
+ FFI::MemoryPointer.from_string_to_wide_string(string) do |ptr|
64
+ read_string = ptr.read_arbitrary_wide_string_up_to()
65
+ end
66
+
67
+ expect(read_string.encoding).to eq(Encoding::UTF_8)
68
+ end
69
+ end
28
70
  end
@@ -4,9 +4,9 @@ require 'spec_helper'
4
4
  require 'puppet/util/windows'
5
5
 
6
6
  describe "Puppet::Util::Windows::SecurityDescriptor", :if => Puppet.features.microsoft_windows? do
7
- let(:system_sid) { Win32::Security::SID::LocalSystem }
8
- let(:admins_sid) { Win32::Security::SID::BuiltinAdministrators }
9
- let(:group_sid) { Win32::Security::SID::Nobody }
7
+ let(:system_sid) { Puppet::Util::Windows::SID::LocalSystem }
8
+ let(:admins_sid) { Puppet::Util::Windows::SID::BuiltinAdministrators }
9
+ let(:group_sid) { Puppet::Util::Windows::SID::Nobody }
10
10
  let(:new_sid) { 'S-1-5-32-500-1-2-3' }
11
11
 
12
12
  def empty_dacl
@@ -7,7 +7,7 @@ describe "Puppet::Util::Windows::SID", :if => Puppet.features.microsoft_windows?
7
7
  end
8
8
 
9
9
  let(:subject) { Puppet::Util::Windows::SID }
10
- let(:sid) { Win32::Security::SID::LocalSystem }
10
+ let(:sid) { Puppet::Util::Windows::SID::LocalSystem }
11
11
  let(:invalid_sid) { 'bogus' }
12
12
  let(:unknown_sid) { 'S-0-0-0' }
13
13
  let(:unknown_name) { 'chewbacca' }
@@ -24,13 +24,15 @@ describe Puppet::Util do
24
24
  end
25
25
 
26
26
  describe "#withenv" do
27
+ let(:mode) { Puppet.features.microsoft_windows? ? :windows : :posix }
28
+
27
29
  before :each do
28
30
  @original_path = ENV["PATH"]
29
31
  @new_env = {:PATH => "/some/bogus/path"}
30
32
  end
31
33
 
32
34
  it "should change environment variables within the block then reset environment variables to their original values" do
33
- Puppet::Util.withenv @new_env do
35
+ Puppet::Util.withenv @new_env, mode do
34
36
  expect(ENV["PATH"]).to eq("/some/bogus/path")
35
37
  end
36
38
  expect(ENV["PATH"]).to eq(@original_path)
@@ -38,7 +40,7 @@ describe Puppet::Util do
38
40
 
39
41
  it "should reset environment variables to their original values even if the block fails" do
40
42
  begin
41
- Puppet::Util.withenv @new_env do
43
+ Puppet::Util.withenv @new_env, mode do
42
44
  expect(ENV["PATH"]).to eq("/some/bogus/path")
43
45
  raise "This is a failure"
44
46
  end
@@ -50,7 +52,7 @@ describe Puppet::Util do
50
52
  it "should reset environment variables even when they are set twice" do
51
53
  # Setting Path & Environment parameters in Exec type can cause weirdness
52
54
  @new_env["PATH"] = "/someother/bogus/path"
53
- Puppet::Util.withenv @new_env do
55
+ Puppet::Util.withenv @new_env, mode do
54
56
  # When assigning duplicate keys, can't guarantee order of evaluation
55
57
  expect(ENV["PATH"]).to match(/\/some.*\/bogus\/path/)
56
58
  end
@@ -60,12 +62,119 @@ describe Puppet::Util do
60
62
  it "should remove any new environment variables after the block ends" do
61
63
  @new_env[:FOO] = "bar"
62
64
  ENV["FOO"] = nil
63
- Puppet::Util.withenv @new_env do
65
+ Puppet::Util.withenv @new_env, mode do
64
66
  expect(ENV["FOO"]).to eq("bar")
65
67
  end
66
68
  expect(ENV["FOO"]).to eq(nil)
67
69
  end
70
+ end
71
+
72
+ describe "#withenv on POSIX", :unless => Puppet.features.microsoft_windows? do
73
+ it "should preserve case" do
74
+ # start with lower case key,
75
+ env_key = SecureRandom.uuid.downcase
76
+
77
+ begin
78
+ original_value = 'hello'
79
+ ENV[env_key] = original_value
80
+ new_value = 'goodbye'
81
+
82
+ Puppet::Util.withenv({env_key.upcase => new_value}, :posix) do
83
+ expect(ENV[env_key]).to eq(original_value)
84
+ expect(ENV[env_key.upcase]).to eq(new_value)
85
+ end
86
+
87
+ expect(ENV[env_key]).to eq(original_value)
88
+ expect(ENV[env_key.upcase]).to be_nil
89
+ ensure
90
+ ENV.delete(env_key)
91
+ end
92
+ end
93
+ end
94
+
95
+ describe "#withenv on Windows", :if => Puppet.features.microsoft_windows? do
96
+
97
+ let(:process) { Puppet::Util::Windows::Process }
98
+
99
+ it "should ignore case" do
100
+ # start with lower case key, ensuring string is not entirely numeric
101
+ env_key = SecureRandom.uuid.downcase + 'a'
102
+
103
+ begin
104
+ original_value = 'hello'
105
+ ENV[env_key] = original_value
106
+ new_value = 'goodbye'
107
+
108
+ Puppet::Util.withenv({env_key.upcase => new_value}, :windows) do
109
+ expect(ENV[env_key]).to eq(new_value)
110
+ expect(ENV[env_key.upcase]).to eq(new_value)
111
+ end
112
+
113
+ expect(ENV[env_key]).to eq(original_value)
114
+ expect(ENV[env_key.upcase]).to eq(original_value)
115
+ ensure
116
+ ENV.delete(env_key)
117
+ end
118
+ end
119
+
120
+ it "works around Ruby bug 8822 (which fails to preserve UTF-8 properly when accessing ENV)" do
121
+ env_var_name = SecureRandom.uuid
122
+ utf_8_bytes = [225, 154, 160] # rune ᚠ
123
+ utf_8_str = env_var_name + utf_8_bytes.pack('c*').force_encoding(Encoding::UTF_8)
68
124
 
125
+ Puppet::Util.withenv({utf_8_str => utf_8_str}, :windows) do
126
+ # the true Windows environemnt APIs see the variables correctly
127
+ expect(process.get_environment_strings[utf_8_str]).to eq(utf_8_str)
128
+
129
+ # document buggy Ruby behavior here for https://bugs.ruby-lang.org/issues/8822
130
+ # Ruby retrieves / stores ENV names in the current codepage
131
+ # when these tests no longer pass, Ruby has fixed its bugs and workarounds can be removed
132
+ # interestingly we would expect some of these tests to fail when codepage is 65001
133
+ # but instead the env values are in Encoding::ASCII_8BIT!
134
+
135
+ # both a string in UTF-8 and current codepage are deemed valid keys to the hash
136
+ # which in a sane world shouldn't be true
137
+ codepage_key = utf_8_str.dup.force_encoding(Encoding.default_external)
138
+ expect(ENV.key?(codepage_key)).to eq(true)
139
+ expect(ENV.key?(utf_8_str)).to eq(true)
140
+ # similarly the value stored at the key is in current codepage and won't match UTF-8 value
141
+ env_value = ENV[utf_8_str]
142
+ expect(env_value).to_not eq(utf_8_str)
143
+ expect(env_value.encoding).to_not eq(Encoding::UTF_8)
144
+ # but it can be forced back to UTF-8 to make it match.. ugh
145
+ converted_value = ENV[utf_8_str].dup.force_encoding(Encoding::UTF_8)
146
+ expect(converted_value).to eq(utf_8_str)
147
+ end
148
+
149
+ # real environment shouldn't have env var anymore
150
+ expect(process.get_environment_strings[utf_8_str]).to eq(nil)
151
+ end
152
+
153
+ it "should preseve existing environment and should not corrupt UTF-8 environment variables" do
154
+ env_var_name = SecureRandom.uuid
155
+ utf_8_bytes = [225, 154, 160] # rune ᚠ
156
+ utf_8_str = env_var_name + utf_8_bytes.pack('c*').force_encoding(Encoding::UTF_8)
157
+ env_var_name_utf_8 = utf_8_str
158
+
159
+ begin
160
+ # UTF-8 name and value
161
+ process.set_environment_variable(env_var_name_utf_8, utf_8_str)
162
+ # ASCII name / UTF-8 value
163
+ process.set_environment_variable(env_var_name, utf_8_str)
164
+
165
+ original_keys = process.get_environment_strings.keys.to_a
166
+ Puppet::Util.withenv({}, :windows) { }
167
+
168
+ env = process.get_environment_strings
169
+
170
+ expect(env[env_var_name]).to eq(utf_8_str)
171
+ expect(env[env_var_name_utf_8]).to eq(utf_8_str)
172
+ expect(env.keys.to_a).to eq(original_keys)
173
+ ensure
174
+ process.set_environment_variable(env_var_name_utf_8, nil)
175
+ process.set_environment_variable(env_var_name, nil)
176
+ end
177
+ end
69
178
  end
70
179
 
71
180
  describe "#absolute_path?" do
@@ -324,7 +433,8 @@ describe Puppet::Util do
324
433
  end
325
434
 
326
435
  it "should walk the search PATH returning the first executable" do
327
- ENV.stubs(:[]).with('PATH').returns(File.expand_path('/bin'))
436
+ Puppet::Util.stubs(:get_env).with('PATH').returns(File.expand_path('/bin'))
437
+ Puppet::Util.stubs(:get_env).with('PATHEXT').returns(nil)
328
438
 
329
439
  expect(Puppet::Util.which('foo')).to eq(path)
330
440
  end
@@ -340,11 +450,11 @@ describe Puppet::Util do
340
450
 
341
451
  describe "when a file extension is specified" do
342
452
  it "should walk each directory in PATH ignoring PATHEXT" do
343
- ENV.stubs(:[]).with('PATH').returns(%w[/bar /bin].map{|dir| File.expand_path(dir)}.join(File::PATH_SEPARATOR))
453
+ Puppet::Util.stubs(:get_env).with('PATH').returns(%w[/bar /bin].map{|dir| File.expand_path(dir)}.join(File::PATH_SEPARATOR))
454
+ Puppet::Util.stubs(:get_env).with('PATHEXT').returns('.FOOBAR')
344
455
 
345
456
  FileTest.expects(:file?).with(File.join(File.expand_path('/bar'), 'foo.CMD')).returns false
346
457
 
347
- ENV.expects(:[]).with('PATHEXT').never
348
458
  expect(Puppet::Util.which('foo.CMD')).to eq(path)
349
459
  end
350
460
  end
@@ -352,8 +462,8 @@ describe Puppet::Util do
352
462
  describe "when a file extension is not specified" do
353
463
  it "should walk each extension in PATHEXT until an executable is found" do
354
464
  bar = File.expand_path('/bar')
355
- ENV.stubs(:[]).with('PATH').returns("#{bar}#{File::PATH_SEPARATOR}#{base}")
356
- ENV.stubs(:[]).with('PATHEXT').returns(".EXE#{File::PATH_SEPARATOR}.CMD")
465
+ Puppet::Util.stubs(:get_env).with('PATH').returns("#{bar}#{File::PATH_SEPARATOR}#{base}")
466
+ Puppet::Util.stubs(:get_env).with('PATHEXT').returns(".EXE#{File::PATH_SEPARATOR}.CMD")
357
467
 
358
468
  exts = sequence('extensions')
359
469
  FileTest.expects(:file?).in_sequence(exts).with(File.join(bar, 'foo.EXE')).returns false
@@ -365,8 +475,8 @@ describe Puppet::Util do
365
475
  end
366
476
 
367
477
  it "should walk the default extension path if the environment variable is not defined" do
368
- ENV.stubs(:[]).with('PATH').returns(base)
369
- ENV.stubs(:[]).with('PATHEXT').returns(nil)
478
+ Puppet::Util.stubs(:get_env).with('PATH').returns(base)
479
+ Puppet::Util.stubs(:get_env).with('PATHEXT').returns(nil)
370
480
 
371
481
  exts = sequence('extensions')
372
482
  %w[.COM .EXE .BAT].each do |ext|
@@ -378,8 +488,8 @@ describe Puppet::Util do
378
488
  end
379
489
 
380
490
  it "should fall back if no extension matches" do
381
- ENV.stubs(:[]).with('PATH').returns(base)
382
- ENV.stubs(:[]).with('PATHEXT').returns(".EXE")
491
+ Puppet::Util.stubs(:get_env).with('PATH').returns(base)
492
+ Puppet::Util.stubs(:get_env).with('PATHEXT').returns(".EXE")
383
493
 
384
494
  FileTest.stubs(:file?).with(File.join(base, 'foo.EXE')).returns false
385
495
  FileTest.stubs(:file?).with(File.join(base, 'foo')).returns true