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
@@ -0,0 +1,53 @@
1
+ require 'puppet/util/checksums'
2
+ require 'puppet/type/file/data_sync'
3
+
4
+ module Puppet
5
+ Puppet::Type.type(:file).newproperty(:checksum_value) do
6
+ include Puppet::Util::Checksums
7
+ include Puppet::DataSync
8
+
9
+ desc "The checksum of the source contents. Only md5 and sha256 are supported when
10
+ specifying this parameter. If this parameter is set, source_permissions will be
11
+ assumed to be false, and ownership and permissions will not be read from source."
12
+
13
+ def insync?(is)
14
+ # If checksum_value and source are specified, manage the file contents.
15
+ # Otherwise the content property will manage syncing.
16
+ if resource.parameter(:source).nil?
17
+ return true
18
+ end
19
+
20
+ checksum_insync?(resource.parameter(:source), is, true) {|_is| super(_is)}
21
+ end
22
+
23
+ def property_matches?(current, desired)
24
+ return true if super(current, desired)
25
+ return date_matches?(resource.parameter(:checksum).value, current, desired)
26
+ end
27
+
28
+ def retrieve
29
+ # If checksum_value and source are specified, manage the file contents.
30
+ # Otherwise the content property will manage syncing. Don't compute the checksum twice.
31
+ if resource.parameter(:source).nil?
32
+ return nil
33
+ end
34
+
35
+ result = retrieve_checksum(resource)
36
+ # If the returned type matches the util/checksums format (prefixed with the type),
37
+ # strip the checksum type.
38
+ result = sumdata(result) if checksum?(result)
39
+ result
40
+ end
41
+
42
+ def sync
43
+ if resource.parameter(:source).nil?
44
+ devfail "checksum_value#sync should not be called without a source parameter"
45
+ end
46
+
47
+ # insync? only returns false if it expects to manage the file content,
48
+ # so instruct the resource to write its contents.
49
+ contents_sync(resource.parameter(:source))
50
+ end
51
+
52
+ end
53
+ end
@@ -1,18 +1,14 @@
1
1
  require 'net/http'
2
2
  require 'uri'
3
3
  require 'tempfile'
4
- require 'date'
5
4
 
6
5
  require 'puppet/util/checksums'
7
- require 'puppet/network/http'
8
- require 'puppet/network/http/api/indirected_routes'
9
- require 'puppet/network/http/compression'
6
+ require 'puppet/type/file/data_sync.rb'
10
7
 
11
8
  module Puppet
12
9
  Puppet::Type.type(:file).newproperty(:content) do
13
- include Puppet::Util::Diff
14
10
  include Puppet::Util::Checksums
15
- include Puppet::Network::HTTP::Compression.module
11
+ include Puppet::DataSync
16
12
 
17
13
  attr_reader :actual_content
18
14
 
@@ -39,8 +35,8 @@ module Puppet
39
35
  }
40
36
 
41
37
  ...but for larger files, this attribute is more useful when combined with the
42
- [template](http://docs.puppetlabs.com/references/latest/function.html#template)
43
- or [file](http://docs.puppetlabs.com/references/latest/function.html#file)
38
+ [template](https://docs.puppetlabs.com/references/latest/function.html#template)
39
+ or [file](https://docs.puppetlabs.com/references/latest/function.html#file)
44
40
  function.
45
41
  EOT
46
42
 
@@ -86,53 +82,29 @@ module Puppet
86
82
  # Also, fix #872: when content is used, and replace is true, the file
87
83
  # should be insync when it exists
88
84
  def insync?(is)
89
- if resource.should_be_file?
90
- return false if is == :absent
91
- else
92
- if resource[:ensure] == :present and resource[:content] and s = resource.stat
93
- resource.warning "Ensure set to :present but file type is #{s.ftype} so no content will be synced"
94
- end
95
- return true
85
+ if resource[:source] && resource[:checksum_value]
86
+ # Asserts that nothing has changed since validate ran.
87
+ devfail "content property should not exist if source and checksum_value are specified"
96
88
  end
97
89
 
98
- return true if ! @resource.replace?
99
-
100
- result = super
101
-
102
- if ! result and Puppet[:show_diff] and resource.show_diff?
103
- write_temporarily do |path|
104
- send @resource[:loglevel], "\n" + diff(@resource[:path], path)
105
- end
106
- end
107
- result
90
+ contents_prop = resource.parameter(:source) || self
91
+ checksum_insync?(contents_prop, is, !resource[:content].nil?) {|_is| super(_is)}
108
92
  end
109
93
 
110
94
  def property_matches?(current, desired)
111
- basic = super
112
- # The inherited equality is always accepted, so use it if valid.
113
- time_types = [:mtime, :ctime]
95
+ # If checksum_value is specified, it overrides comparing the content field.
114
96
  checksum_type = resource.parameter(:checksum).value
115
- return basic if basic || !time_types.include?(checksum_type)
116
- return false unless current && desired
117
- begin
118
- raise if !time_types.include?(sumtype(current).to_sym) || !time_types.include?(sumtype(desired).to_sym)
119
- DateTime.parse(sumdata(current)) >= DateTime.parse(sumdata(desired))
120
- rescue => detail
121
- self.fail Puppet::Error, "Resource with checksum_type #{checksum_type} didn't contain a date in #{current} or #{desired}", detail.backtrace
97
+ if checksum_value = resource.parameter(:checksum_value)
98
+ desired = "{#{checksum_type}}#{checksum_value.value}"
122
99
  end
100
+
101
+ # The inherited equality is always accepted, so use it if valid.
102
+ return true if super(current, desired)
103
+ return date_matches?(checksum_type, current, desired)
123
104
  end
124
105
 
125
106
  def retrieve
126
- return :absent unless stat = @resource.stat
127
- ftype = stat.ftype
128
- # Don't even try to manage the content on directories or links
129
- return nil if ["directory","link"].include?(ftype)
130
-
131
- begin
132
- resource.parameter(:checksum).sum_file(resource[:path])
133
- rescue => detail
134
- raise Puppet::Error, "Could not read #{ftype} #{@resource.title}: #{detail}", detail.backtrace
135
- end
107
+ retrieve_checksum(resource)
136
108
  end
137
109
 
138
110
  # Make sure we're also managing the checksum property.
@@ -146,93 +118,36 @@ module Puppet
146
118
 
147
119
  # Just write our content out to disk.
148
120
  def sync
149
- return_event = @resource.stat ? :file_changed : :file_created
150
-
151
- # We're safe not testing for the 'source' if there's no 'should'
152
- # because we wouldn't have gotten this far if there weren't at least
153
- # one valid value somewhere.
154
- @resource.write(:content)
155
-
156
- return_event
157
- end
158
-
159
- def write_temporarily
160
- tempfile = Tempfile.new("puppet-file")
161
- tempfile.open
162
-
163
- write(tempfile)
164
-
165
- tempfile.close
166
-
167
- yield tempfile.path
168
-
169
- tempfile.delete
121
+ contents_sync(resource.parameter(:source) || self)
170
122
  end
171
123
 
172
124
  def write(file)
173
125
  resource.parameter(:checksum).sum_stream { |sum|
174
- each_chunk_from(actual_content || resource.parameter(:source)) { |chunk|
126
+ each_chunk_from { |chunk|
175
127
  sum << chunk
176
128
  file.print chunk
177
129
  }
178
130
  }
179
131
  end
180
132
 
133
+ private
134
+
181
135
  # the content is munged so if it's a checksum source_or_content is nil
182
136
  # unless the checksum indirectly comes from source
183
- def each_chunk_from(source_or_content)
184
- if source_or_content.is_a?(String)
185
- yield source_or_content
186
- elsif content_is_really_a_checksum? && source_or_content.nil?
137
+ def each_chunk_from
138
+ if actual_content.is_a?(String)
139
+ yield actual_content
140
+ elsif content_is_really_a_checksum? && actual_content.nil?
187
141
  yield read_file_from_filebucket
188
- elsif source_or_content.nil?
142
+ elsif actual_content.nil?
189
143
  yield ''
190
- elsif Puppet[:default_file_terminus] == :file_server
191
- yield source_or_content.content
192
- elsif source_or_content.local?
193
- chunk_file_from_disk(source_or_content) { |chunk| yield chunk }
194
- else
195
- chunk_file_from_source(source_or_content) { |chunk| yield chunk }
196
144
  end
197
145
  end
198
146
 
199
- private
200
-
201
147
  def content_is_really_a_checksum?
202
148
  checksum?(should)
203
149
  end
204
150
 
205
- def chunk_file_from_disk(source_or_content)
206
- File.open(source_or_content.full_path, "rb") do |src|
207
- while chunk = src.read(8192)
208
- yield chunk
209
- end
210
- end
211
- end
212
-
213
- def get_from_source(source_or_content, &block)
214
- source = source_or_content.metadata.source
215
- request = Puppet::Indirector::Request.new(:file_content, :find, source, nil, :environment => resource.catalog.environment_instance)
216
-
217
- request.do_request(:fileserver) do |req|
218
- connection = Puppet::Network::HttpPool.http_instance(req.server, req.port)
219
- connection.request_get(Puppet::Network::HTTP::API::IndirectedRoutes.request_to_uri(req), add_accept_encoding({"Accept" => "binary"}), &block)
220
- end
221
- end
222
-
223
-
224
- def chunk_file_from_source(source_or_content)
225
- get_from_source(source_or_content) do |response|
226
- case response.code
227
- when /^2/; uncompress(response) { |uncompressor| response.read_body { |chunk| yield uncompressor.uncompress(chunk) } }
228
- else
229
- # Raise the http error if we didn't get a 'success' of some kind.
230
- message = "Error #{response.code} on SERVER: #{(response.body||'').empty? ? response.message : uncompress_body(response)}"
231
- raise Net::HTTPError.new(message, response)
232
- end
233
- end
234
- end
235
-
236
151
  def read_file_from_filebucket
237
152
  raise "Could not get filebucket from file" unless dipper = resource.bucket
238
153
  sum = should.sub(/\{\w+\}/, '')
@@ -0,0 +1,84 @@
1
+ require 'puppet/util/checksums'
2
+ require 'puppet/util/diff'
3
+ require 'date'
4
+ require 'tempfile'
5
+
6
+ module Puppet
7
+ module DataSync
8
+ include Puppet::Util::Checksums
9
+ include Puppet::Util::Diff
10
+
11
+ def write_temporarily(param)
12
+ tempfile = Tempfile.new("puppet-file")
13
+ tempfile.open
14
+
15
+ param.write(tempfile)
16
+
17
+ tempfile.close
18
+
19
+ yield tempfile.path
20
+ ensure
21
+ tempfile.delete if tempfile
22
+ end
23
+
24
+ def checksum_insync?(param, is, has_contents, &block)
25
+ resource = param.resource
26
+ if resource.should_be_file?
27
+ return false if is == :absent
28
+ else
29
+ if resource[:ensure] == :present && has_contents && (s = resource.stat)
30
+ resource.warning "Ensure set to :present but file type is #{s.ftype} so no content will be synced"
31
+ end
32
+ return true
33
+ end
34
+
35
+ return true if ! resource.replace?
36
+
37
+ result = yield(is)
38
+
39
+ if !result && Puppet[:show_diff] && resource.show_diff?
40
+ write_temporarily(param) do |path|
41
+ send resource[:loglevel], "\n" + diff(resource[:path], path)
42
+ end
43
+ end
44
+ result
45
+ end
46
+
47
+ def date_matches?(checksum_type, current, desired)
48
+ time_types = [:mtime, :ctime]
49
+ return false if !time_types.include?(checksum_type)
50
+ return false unless current && desired
51
+
52
+ begin
53
+ if checksum?(current) || checksum?(desired)
54
+ raise if !time_types.include?(sumtype(current).to_sym) || !time_types.include?(sumtype(desired).to_sym)
55
+ current = sumdata(current)
56
+ desired = sumdata(desired)
57
+ end
58
+ DateTime.parse(current) >= DateTime.parse(desired)
59
+ rescue => detail
60
+ self.fail Puppet::Error, "Resource with checksum_type #{checksum_type} didn't contain a date in #{current} or #{desired}", detail.backtrace
61
+ end
62
+ end
63
+
64
+ def retrieve_checksum(resource)
65
+ return :absent unless stat = resource.stat
66
+ ftype = stat.ftype
67
+ # Don't even try to manage the content on directories or links
68
+ return nil if ["directory","link"].include?(ftype)
69
+
70
+ begin
71
+ resource.parameter(:checksum).sum_file(resource[:path])
72
+ rescue => detail
73
+ raise Puppet::Error, "Could not read #{ftype} #{resource.title}: #{detail}", detail.backtrace
74
+ end
75
+ end
76
+
77
+ def contents_sync(param)
78
+ return_event = param.resource.stat ? :file_changed : :file_created
79
+ resource.write(param)
80
+ return_event
81
+ end
82
+
83
+ end
84
+ end
@@ -9,22 +9,21 @@ module Puppet
9
9
  Whether the file should exist, and if so what kind of file it should be.
10
10
  Possible values are `present`, `absent`, `file`, `directory`, and `link`.
11
11
 
12
- * `present` will accept any form of file existence, and will create a
12
+ * `present` accepts any form of file existence, and creates a
13
13
  normal file if the file is missing. (The file will have no content
14
14
  unless the `content` or `source` attribute is used.)
15
- * `absent` will make sure the file doesn't exist, deleting it
16
- if necessary.
17
- * `file` will make sure it's a normal file, and enables use of the
18
- `content` or `source` attribute.
19
- * `directory` will make sure it's a directory, and enables use of the
20
- `source`, `recurse`, `recurselimit`, `ignore`, and `purge` attributes.
21
- * `link` will make sure the file is a symlink, and **requires** that you
22
- also set the `target` attribute. Symlinks are supported on all Posix
15
+ * `absent` ensures the file doesn't exist, and deletes it if necessary.
16
+ * `file` ensures it's a normal file, and enables use of the `content` or
17
+ `source` attribute.
18
+ * `directory` ensures it's a directory, and enables use of the `source`,
19
+ `recurse`, `recurselimit`, `ignore`, and `purge` attributes.
20
+ * `link` ensures the file is a symlink, and **requires** that you also
21
+ set the `target` attribute. Symlinks are supported on all Posix
23
22
  systems and on Windows Vista / 2008 and higher. On Windows, managing
24
- symlinks requires puppet agent's user account to have the "Create
23
+ symlinks requires Puppet agent's user account to have the "Create
25
24
  Symbolic Links" privilege; this can be configured in the "User Rights
26
- Assignment" section in the Windows policy editor. By default, puppet
27
- agent runs as the Administrator account, which does have this privilege.
25
+ Assignment" section in the Windows policy editor. By default, Puppet
26
+ agent runs as the Administrator account, which has this privilege.
28
27
 
29
28
  Puppet avoids destroying directories unless the `force` attribute is set
30
29
  to `true`. This means that if a file is currently a directory, setting
@@ -47,7 +46,9 @@ module Puppet
47
46
  }
48
47
 
49
48
  However, we recommend using `link` and `target` explicitly, since this
50
- behavior can be harder to read.
49
+ behavior can be harder to read and is
50
+ [deprecated](https://docs.puppetlabs.com/puppet/4.3/reference/deprecated_language.html)
51
+ as of Puppet 4.3.0.
51
52
  EOT
52
53
 
53
54
  # Most 'ensure' properties have a default, but with files we, um, don't.
@@ -63,8 +64,10 @@ module Puppet
63
64
  # Make sure we're not managing the content some other way
64
65
  if property = @resource.property(:content)
65
66
  property.sync
67
+ elsif property = @resource.property(:checksum_value)
68
+ property.sync
66
69
  else
67
- @resource.write(:ensure)
70
+ @resource.write
68
71
  @resource.should(:mode)
69
72
  end
70
73
  end
@@ -17,7 +17,7 @@
17
17
  # command. This allows the user to specify a subset of the three
18
18
  # values while leaving the others alone.
19
19
  #
20
- # See http://www.nsa.gov/selinux/ for complete docs on SELinux.
20
+ # See https://www.nsa.gov/selinux/ for complete docs on SELinux.
21
21
 
22
22
 
23
23
  module Puppet
@@ -1,5 +1,11 @@
1
1
  require 'puppet/file_serving/content'
2
2
  require 'puppet/file_serving/metadata'
3
+ require 'puppet/file_serving/terminus_helper'
4
+
5
+ require 'puppet/util/http_proxy'
6
+ require 'puppet/network/http'
7
+ require 'puppet/network/http/api/indirected_routes'
8
+ require 'puppet/network/http/compression'
3
9
 
4
10
  module Puppet
5
11
  # Copy files from a local or remote source. This state *only* does any work
@@ -8,7 +14,7 @@ module Puppet
8
14
  # this state, during retrieval, modifies the appropriate other states
9
15
  # so that things get taken care of appropriately.
10
16
  Puppet::Type.type(:file).newparam(:source) do
11
- include Puppet::Util::Diff
17
+ include Puppet::Network::HTTP::Compression.module
12
18
 
13
19
  attr_accessor :source, :local
14
20
  desc <<-'EOT'
@@ -21,6 +27,7 @@ module Puppet
21
27
  * Fully qualified paths to locally available files (including files on NFS
22
28
  shares or Windows mapped drives).
23
29
  * `file:` URIs, which behave the same as local file paths.
30
+ * `http:` URIs, which point to files served by common web servers
24
31
 
25
32
  The normal form of a `puppet:` URI is:
26
33
 
@@ -36,6 +43,11 @@ module Puppet
36
43
  a source directory contains symlinks, use the `links` attribute to
37
44
  specify whether to recreate links or follow them.
38
45
 
46
+ *HTTP* URIs cannot be used to recursively synchronize whole directory
47
+ trees. It is also not possible to use `source_permissions` values other
48
+ than `ignore`. That's because HTTP servers do not transfer any metadata
49
+ that translates to ownership or permission details.
50
+
39
51
  Multiple `source` values can be specified as an array, and Puppet will
40
52
  use the first source that exists. This can be used to serve different
41
53
  files to different system types:
@@ -65,7 +77,9 @@ module Puppet
65
77
 
66
78
  self.fail "Cannot use relative URLs '#{source}'" unless uri.absolute?
67
79
  self.fail "Cannot use opaque URLs '#{source}'" unless uri.hierarchical?
68
- self.fail "Cannot use URLs of type '#{uri.scheme}' as source for fileserving" unless %w{file puppet}.include?(uri.scheme)
80
+ unless %w{file puppet http https}.include?(uri.scheme)
81
+ self.fail "Cannot use URLs of type '#{uri.scheme}' as source for fileserving"
82
+ end
69
83
  end
70
84
  end
71
85
 
@@ -74,7 +88,7 @@ module Puppet
74
88
  munge do |sources|
75
89
  sources = [sources] unless sources.is_a?(Array)
76
90
  sources.map do |source|
77
- source = source.sub(/[#{SEPARATOR_REGEX}]+$/, '')
91
+ source = self.class.normalize(source)
78
92
 
79
93
  if Puppet::Util.absolute_path?(source)
80
94
  URI.unescape(Puppet::Util.path_to_uri(source).to_s)
@@ -84,6 +98,10 @@ module Puppet
84
98
  end
85
99
  end
86
100
 
101
+ def self.normalize(source)
102
+ source.sub(/[#{SEPARATOR_REGEX}]+$/, '')
103
+ end
104
+
87
105
  def change_to_s(currentvalue, newvalue)
88
106
  # newvalue = "{md5}#{@metadata.checksum}"
89
107
  if resource.property(:ensure).retrieve == :absent
@@ -123,21 +141,6 @@ module Puppet
123
141
  next if metadata_method == :owner and !Puppet.features.root?
124
142
  next if metadata_method == :group and !Puppet.features.root?
125
143
 
126
- if Puppet.features.microsoft_windows?
127
- # Warn on Windows if source permissions are being used and the file resource
128
- # does not have mode owner and group all set (which would take precedence).
129
- if [:use, :use_when_creating].include?(resource[:source_permissions]) &&
130
- (resource[:owner] == nil || resource[:group] == nil || resource[:mode] == nil)
131
-
132
- err_msg = "Copying %s from the source" <<
133
- " file on Windows is not supported;" <<
134
- " use source_permissions => ignore."
135
- self.fail Puppet::Error, err_msg % 'owner/mode/group'
136
- end
137
- # But never try to copy remote owner/group on Windows
138
- next if [:owner, :group].include?(metadata_method) && !local?
139
- end
140
-
141
144
  case resource[:source_permissions]
142
145
  when :ignore
143
146
  next
@@ -167,6 +170,11 @@ module Puppet
167
170
  # problems in our query.
168
171
  def metadata
169
172
  return @metadata if @metadata
173
+
174
+ if @metadata = resource.catalog.metadata[resource.title]
175
+ return @metadata
176
+ end
177
+
170
178
  return nil unless value
171
179
  value.each do |source|
172
180
  begin
@@ -214,6 +222,15 @@ module Puppet
214
222
  @uri ||= URI.parse(URI.escape(metadata.source))
215
223
  end
216
224
 
225
+ def write(file)
226
+ resource.parameter(:checksum).sum_stream { |sum|
227
+ each_chunk_from { |chunk|
228
+ sum << chunk
229
+ file.print chunk
230
+ }
231
+ }
232
+ end
233
+
217
234
  private
218
235
 
219
236
  def scheme
@@ -227,10 +244,78 @@ module Puppet
227
244
  def copy_source_value(metadata_method)
228
245
  param_name = (metadata_method == :checksum) ? :content : metadata_method
229
246
  if resource[param_name].nil? or resource[param_name] == :absent
247
+ if Puppet.features.microsoft_windows? && [:owner, :group, :mode].include?(metadata_method)
248
+ devfail "Should not have tried to use source owner/mode/group on Windows"
249
+ end
250
+
230
251
  value = metadata.send(metadata_method)
231
252
  # Force the mode value in file resources to be a string containing octal.
232
253
  value = value.to_s(8) if param_name == :mode && value.is_a?(Numeric)
233
254
  resource[param_name] = value
255
+
256
+ if (metadata_method == :checksum)
257
+ # If copying checksum, also copy checksum_type
258
+ resource[:checksum] = metadata.checksum_type
259
+ end
260
+ end
261
+ end
262
+
263
+ def each_chunk_from
264
+ if Puppet[:default_file_terminus] == :file_server
265
+ yield content
266
+ elsif local?
267
+ chunk_file_from_disk { |chunk| yield chunk }
268
+ else
269
+ chunk_file_from_source { |chunk| yield chunk }
270
+ end
271
+ end
272
+
273
+ def chunk_file_from_disk
274
+ File.open(full_path, "rb") do |src|
275
+ while chunk = src.read(8192)
276
+ yield chunk
277
+ end
278
+ end
279
+ end
280
+
281
+ def get_from_puppet_source(source_uri, content_uri, &block)
282
+ options = { :environment => resource.catalog.environment_instance }
283
+ if content_uri
284
+ options[:code_id] = resource.catalog.code_id
285
+ request = Puppet::Indirector::Request.new(:static_file_content, :find, content_uri, nil, options)
286
+ else
287
+ request = Puppet::Indirector::Request.new(:file_content, :find, source_uri, nil, options)
288
+ end
289
+
290
+ request.do_request(:fileserver) do |req|
291
+ connection = Puppet::Network::HttpPool.http_instance(req.server, req.port)
292
+ connection.request_get(Puppet::Network::HTTP::API::IndirectedRoutes.request_to_uri(req), add_accept_encoding({"Accept" => "binary"}), &block)
293
+ end
294
+ end
295
+
296
+ def get_from_http_source(source_uri, &block)
297
+ Puppet::Util::HttpProxy.request_with_redirects(URI(source_uri), :get, &block)
298
+ end
299
+
300
+ def get_from_source(&block)
301
+ source_uri = metadata.source
302
+ if source_uri =~ /^https?:/
303
+ get_from_http_source(source_uri, &block)
304
+ else
305
+ get_from_puppet_source(source_uri, metadata.content_uri, &block)
306
+ end
307
+ end
308
+
309
+
310
+ def chunk_file_from_source
311
+ get_from_source do |response|
312
+ case response.code
313
+ when /^2/; uncompress(response) { |uncompressor| response.read_body { |chunk| yield uncompressor.uncompress(chunk) } }
314
+ else
315
+ # Raise the http error if we didn't get a 'success' of some kind.
316
+ message = "Error #{response.code} on SERVER: #{(response.body||'').empty? ? response.message : uncompress_body(response)}"
317
+ raise Net::HTTPError.new(message, response)
318
+ end
234
319
  end
235
320
  end
236
321
  end