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,5 +1,6 @@
1
1
  require 'puppet'
2
2
  require 'puppet/util/tagging'
3
+ require 'puppet/util/skip_tags'
3
4
  require 'puppet/application'
4
5
  require 'digest/sha1'
5
6
  require 'set'
@@ -185,6 +186,10 @@ class Puppet::Transaction
185
186
  super
186
187
  end
187
188
 
189
+ def skip_tags
190
+ @skip_tags ||= Puppet::Util::SkipTags.new(Puppet[:skip_tags]).tags
191
+ end
192
+
188
193
  def prefetch_if_necessary(resource)
189
194
  provider_class = resource.provider.class
190
195
  return unless provider_class.respond_to?(:prefetch) and !prefetched_providers[resource.type][provider_class.name]
@@ -339,7 +344,9 @@ class Puppet::Transaction
339
344
 
340
345
  # Should this resource be skipped?
341
346
  def skip?(resource)
342
- if missing_tags?(resource)
347
+ if skip_tags?(resource)
348
+ resource.debug "Skipping with skip tags #{skip_tags.join(", ")}"
349
+ elsif missing_tags?(resource)
343
350
  resource.debug "Not tagged with #{tags.join(", ")}"
344
351
  elsif ! scheduled?(resource)
345
352
  resource.debug "Not scheduled"
@@ -375,6 +382,13 @@ class Puppet::Transaction
375
382
  not resource.tagged?(*tags)
376
383
  end
377
384
 
385
+ def skip_tags?(resource)
386
+ return false if ignore_tags?
387
+ return false if skip_tags.empty?
388
+
389
+ resource.tagged?(*skip_tags)
390
+ end
391
+
378
392
  def split_qualified_tags?
379
393
  false
380
394
  end
@@ -389,4 +403,3 @@ class Puppet::Transaction
389
403
  end
390
404
 
391
405
  require 'puppet/transaction/report'
392
-
@@ -22,9 +22,10 @@ class Puppet::Transaction::AdditionalResourceGenerator
22
22
  end
23
23
  return unless generated
24
24
  generated = [generated] unless generated.is_a?(Array)
25
- generated.collect do |res|
25
+ generated.collect! do |res|
26
26
  @catalog.resource(res.ref) || res
27
- end.reverse_each do |res|
27
+ end
28
+ unless resource.depthfirst?
28
29
  # This is reversed becuase PUP-1963 changed how generated
29
30
  # resources were added to the catalog. It exists for backwards
30
31
  # compatibility only, and can probably be removed in Puppet 5
@@ -34,6 +35,9 @@ class Puppet::Transaction::AdditionalResourceGenerator
34
35
  # catalog one by one adjacent to the parent resource. This
35
36
  # causes an implicit reversal of their application order from
36
37
  # the old code. The reverse makes it all work like it did.
38
+ generated.reverse!
39
+ end
40
+ generated.each do |res|
37
41
  add_resource(res, resource)
38
42
 
39
43
  add_generated_directed_dependency(resource, res)
@@ -48,6 +48,17 @@ class Puppet::Transaction::Report
48
48
  # @return [String] uuid
49
49
  attr_accessor :transaction_uuid
50
50
 
51
+ # The id of the code input to the compiler.
52
+ attr_accessor :code_id
53
+
54
+ # A master generated catalog uuid, useful for connecting a single catalog to multiple reports.
55
+ attr_accessor :catalog_uuid
56
+
57
+ # Whether a cached catalog was used in the run, and if so, the reason that it was used.
58
+ # @return [String] One of the values: 'not_used', 'explicitly_requested',
59
+ # or 'on_failure'
60
+ attr_accessor :cached_catalog_status
61
+
51
62
  # The host name for which the report is generated
52
63
  # @return [String] the host name
53
64
  attr_accessor :host
@@ -172,10 +183,13 @@ class Puppet::Transaction::Report
172
183
  @host = Puppet[:node_name_value]
173
184
  @time = Time.now
174
185
  @kind = kind
175
- @report_format = 4
186
+ @report_format = 5
176
187
  @puppet_version = Puppet.version
177
188
  @configuration_version = configuration_version
178
189
  @transaction_uuid = transaction_uuid
190
+ @code_id = nil
191
+ @catalog_uuid = nil
192
+ @cached_catalog_status = nil
179
193
  @environment = environment
180
194
  @status = 'failed' # assume failed until the report is finalized
181
195
  end
@@ -190,6 +204,19 @@ class Puppet::Transaction::Report
190
204
  @status = data['status']
191
205
  @host = data['host']
192
206
  @time = data['time']
207
+
208
+ if catalog_uuid = data['catalog_uuid']
209
+ @catalog_uuid = catalog_uuid
210
+ end
211
+
212
+ if code_id = data['code_id']
213
+ @code_id = code_id
214
+ end
215
+
216
+ if cached_catalog_status = data['cached_catalog_status']
217
+ @cached_catalog_status = cached_catalog_status
218
+ end
219
+
193
220
  if @time.is_a? String
194
221
  @time = Time.parse(@time)
195
222
  end
@@ -221,6 +248,9 @@ class Puppet::Transaction::Report
221
248
  'time' => @time.iso8601(9),
222
249
  'configuration_version' => @configuration_version,
223
250
  'transaction_uuid' => @transaction_uuid,
251
+ 'catalog_uuid' => @catalog_uuid,
252
+ 'code_id' => @code_id,
253
+ 'cached_catalog_status' => @cached_catalog_status,
224
254
  'report_format' => @report_format,
225
255
  'puppet_version' => @puppet_version,
226
256
  'kind' => @kind,
@@ -69,8 +69,6 @@ class Puppet::Transaction::ResourceHarness
69
69
  def perform_changes(resource, context)
70
70
  cache(resource, :checked, Time.now)
71
71
 
72
- return [] if ! allow_changes?(resource)
73
-
74
72
  # Record the current state in state.yml.
75
73
  context.audited_params.each do |param|
76
74
  cache(resource, param, context.current_values[param])
@@ -96,29 +94,6 @@ class Puppet::Transaction::ResourceHarness
96
94
  capture_audit_events(resource, context)
97
95
  end
98
96
 
99
- def allow_changes?(resource)
100
- if resource.purging? and resource.deleting? and deps = relationship_graph.dependents(resource) \
101
- and ! deps.empty? and deps.detect { |d| ! d.deleting? }
102
- real_deps = deps.reject { |r| r.class.name == :whit }
103
- if real_deps.empty?
104
- true
105
- else
106
- deplabel = real_deps.collect { |r| r.ref }.join(",")
107
- plurality = real_deps.length > 1 ? "":"s"
108
- resource.warning "#{deplabel} still depend#{plurality} on me -- not purging"
109
- false
110
- end
111
- else
112
- true
113
- end
114
- end
115
-
116
- # allow_changes? is only made public to enable the existing spec tests to run
117
- # under rspec 3 (apparently rspec 2 didn't enforce access controls?). Please do not
118
- # treat this as part of a public API.
119
- # Possible future improvement: rewrite to not require access to private methods.
120
- public :allow_changes?
121
-
122
97
  def sync_if_needed(param, context)
123
98
  historical_value = context.historical_values[param.name]
124
99
  current_value = context.current_values[param.name]
@@ -1246,7 +1246,7 @@ class Type
1246
1246
  event _would_ have been sent.
1247
1247
 
1248
1248
  **Important note:**
1249
- [The `noop` setting](http://docs.puppetlabs.com/references/latest/configuration.html#noop)
1249
+ [The `noop` setting](https://docs.puppetlabs.com/references/latest/configuration.html#noop)
1250
1250
  allows you to globally enable or disable noop mode, but it will _not_ override
1251
1251
  the `noop` metaparameter on individual resources. That is, the value of the
1252
1252
  global `noop` setting will _only_ affect resources that do not have an explicit
@@ -1266,7 +1266,7 @@ class Type
1266
1266
  The value of this metaparameter must be the `name` of a `schedule`
1267
1267
  resource. This means you must declare a schedule resource, then
1268
1268
  refer to it by name; see
1269
- [the docs for the `schedule` type](http://docs.puppetlabs.com/references/latest/type.html#schedule)
1269
+ [the docs for the `schedule` type](https://docs.puppetlabs.com/references/latest/type.html#schedule)
1270
1270
  for more info.
1271
1271
 
1272
1272
  schedule { 'everyday':
@@ -1558,7 +1558,7 @@ class Type
1558
1558
 
1559
1559
  newmetaparam(:require, :parent => RelationshipMetaparam, :attributes => {:direction => :in, :events => :NONE}) do
1560
1560
  desc "One or more resources that this resource depends on, expressed as
1561
- [resource references](http://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1561
+ [resource references](https://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1562
1562
  Multiple resources can be specified as an array of references. When this
1563
1563
  attribute is present:
1564
1564
 
@@ -1567,12 +1567,12 @@ class Type
1567
1567
  This is one of the four relationship metaparameters, along with
1568
1568
  `before`, `notify`, and `subscribe`. For more context, including the
1569
1569
  alternate chaining arrow (`->` and `~>`) syntax, see
1570
- [the language page on relationships](http://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1570
+ [the language page on relationships](https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1571
1571
  end
1572
1572
 
1573
1573
  newmetaparam(:subscribe, :parent => RelationshipMetaparam, :attributes => {:direction => :in, :events => :ALL_EVENTS, :callback => :refresh}) do
1574
1574
  desc "One or more resources that this resource depends on, expressed as
1575
- [resource references](http://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1575
+ [resource references](https://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1576
1576
  Multiple resources can be specified as an array of references. When this
1577
1577
  attribute is present:
1578
1578
 
@@ -1585,12 +1585,12 @@ class Type
1585
1585
  This is one of the four relationship metaparameters, along with
1586
1586
  `before`, `require`, and `notify`. For more context, including the
1587
1587
  alternate chaining arrow (`->` and `~>`) syntax, see
1588
- [the language page on relationships](http://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1588
+ [the language page on relationships](https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1589
1589
  end
1590
1590
 
1591
1591
  newmetaparam(:before, :parent => RelationshipMetaparam, :attributes => {:direction => :out, :events => :NONE}) do
1592
1592
  desc "One or more resources that depend on this resource, expressed as
1593
- [resource references](http://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1593
+ [resource references](https://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1594
1594
  Multiple resources can be specified as an array of references. When this
1595
1595
  attribute is present:
1596
1596
 
@@ -1599,12 +1599,12 @@ class Type
1599
1599
  This is one of the four relationship metaparameters, along with
1600
1600
  `require`, `notify`, and `subscribe`. For more context, including the
1601
1601
  alternate chaining arrow (`->` and `~>`) syntax, see
1602
- [the language page on relationships](http://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1602
+ [the language page on relationships](https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1603
1603
  end
1604
1604
 
1605
1605
  newmetaparam(:notify, :parent => RelationshipMetaparam, :attributes => {:direction => :out, :events => :ALL_EVENTS, :callback => :refresh}) do
1606
1606
  desc "One or more resources that depend on this resource, expressed as
1607
- [resource references](http://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1607
+ [resource references](https://docs.puppetlabs.com/puppet/latest/reference/lang_data_resource_reference.html).
1608
1608
  Multiple resources can be specified as an array of references. When this
1609
1609
  attribute is present:
1610
1610
 
@@ -1617,7 +1617,7 @@ class Type
1617
1617
  This is one of the four relationship metaparameters, along with
1618
1618
  `before`, `require`, and `subscribe`. For more context, including the
1619
1619
  alternate chaining arrow (`->` and `~>`) syntax, see
1620
- [the language page on relationships](http://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1620
+ [the language page on relationships](https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html)."
1621
1621
  end
1622
1622
 
1623
1623
  newmetaparam(:stage) do
@@ -1630,7 +1630,7 @@ class Type
1630
1630
  By default, all classes are declared in the `main` stage. To assign a class
1631
1631
  to a different stage, you must:
1632
1632
 
1633
- * Declare the new stage as a [`stage` resource](http://docs.puppetlabs.com/references/latest/type.html#stage).
1633
+ * Declare the new stage as a [`stage` resource](https://docs.puppetlabs.com/references/latest/type.html#stage).
1634
1634
  * Declare an order relationship between the new stage and the `main` stage.
1635
1635
  * Use the resource-like syntax to declare the class, and set the `stage`
1636
1636
  metaparameter to the name of the desired stage.
@@ -5,7 +5,7 @@
5
5
  # you may not use this file except in compliance with the License.
6
6
  # You may obtain a copy of the License at
7
7
  #
8
- # http://www.apache.org/licenses/LICENSE-2.0
8
+ # https://www.apache.org/licenses/LICENSE-2.0
9
9
  #
10
10
  # Unless required by applicable law or agreed to in writing, software
11
11
  # distributed under the License is distributed on an "AS IS" BASIS,
@@ -18,29 +18,29 @@ Puppet::Type.newtype(:cron) do
18
18
 
19
19
  Example:
20
20
 
21
- cron { logrotate:
22
- command => "/usr/sbin/logrotate",
23
- user => root,
21
+ cron { 'logrotate':
22
+ command => '/usr/sbin/logrotate',
23
+ user => 'root',
24
24
  hour => 2,
25
- minute => 0
25
+ minute => 0,
26
26
  }
27
27
 
28
28
  Note that all periodic attributes can be specified as an array of values:
29
29
 
30
- cron { logrotate:
31
- command => "/usr/sbin/logrotate",
32
- user => root,
33
- hour => [2, 4]
30
+ cron { 'logrotate':
31
+ command => '/usr/sbin/logrotate',
32
+ user => 'root',
33
+ hour => [2, 4],
34
34
  }
35
35
 
36
36
  ...or using ranges or the step syntax `*/2` (although there's no guarantee
37
37
  that your `cron` daemon supports these):
38
38
 
39
- cron { logrotate:
40
- command => "/usr/sbin/logrotate",
41
- user => root,
39
+ cron { 'logrotate':
40
+ command => '/usr/sbin/logrotate',
41
+ user => 'root',
42
42
  hour => ['2-4'],
43
- minute => '*/10'
43
+ minute => '*/10',
44
44
  }
45
45
 
46
46
  An important note: _the Cron type will not reset parameters that are
@@ -367,9 +367,10 @@ Puppet::Type.newtype(:file) do
367
367
  creator_count += 1 if self.should(param)
368
368
  end
369
369
  creator_count += 1 if @parameters.include?(:source)
370
+
370
371
  self.fail "You cannot specify more than one of #{CREATORS.collect { |p| p.to_s}.join(", ")}" if creator_count > 1
371
372
 
372
- self.fail "You cannot specify a remote recursion without a source" if !self[:source] and self[:recurse] == :remote
373
+ self.fail "You cannot specify a remote recursion without a source" if !self[:source] && self[:recurse] == :remote
373
374
 
374
375
  self.fail "You cannot specify source when using checksum 'none'" if self[:checksum] == :none && !self[:source].nil?
375
376
 
@@ -377,13 +378,19 @@ Puppet::Type.newtype(:file) do
377
378
  self.fail "You cannot specify content when using checksum '#{checksum_type}'" if self[:checksum] == checksum_type && !self[:content].nil?
378
379
  end
379
380
 
380
- self.warning "Possible error: recurselimit is set but not recurse, no recursion will happen" if !self[:recurse] and self[:recurselimit]
381
+ self.warning "Possible error: recurselimit is set but not recurse, no recursion will happen" if !self[:recurse] && self[:recurselimit]
381
382
 
382
383
  if @parameters[:content] && @parameters[:content].actual_content
383
384
  # Now that we know the checksum, update content (in case it was created before checksum was known).
384
385
  @parameters[:content].value = @parameters[:checksum].sum(@parameters[:content].actual_content)
385
386
  end
386
387
 
388
+ if self[:checksum] && self[:checksum_value] && !send("#{self[:checksum]}?", self[:checksum_value])
389
+ self.fail "Checksum value '#{self[:checksum_value]}' is not a valid checksum type #{self[:checksum]}"
390
+ end
391
+
392
+ self.warning "Checksum value is ignored unless content or source are specified" if self[:checksum_value] && !self[:content] && !self[:source]
393
+
387
394
  provider.validate if provider.respond_to?(:validate)
388
395
  end
389
396
 
@@ -398,7 +405,7 @@ Puppet::Type.newtype(:file) do
398
405
 
399
406
  # Determine the user to write files as.
400
407
  def asuser
401
- if self.should(:owner) and ! self.should(:owner).is_a?(Symbol)
408
+ if self.should(:owner) && ! self.should(:owner).is_a?(Symbol)
402
409
  writeable = Puppet::Util::SUIDManager.asuser(self.should(:owner)) {
403
410
  FileTest.writable?(::File.dirname(self[:path]))
404
411
  }
@@ -571,22 +578,29 @@ Puppet::Type.newtype(:file) do
571
578
  remove_less_specific_files(result)
572
579
  end
573
580
 
581
+ def remove_less_specific_files(files)
582
+ existing_files = catalog.vertices.select { |r| r.is_a?(self.class) }
583
+ self.class.remove_less_specific_files(files, self[:path], existing_files) do |file|
584
+ file[:path]
585
+ end
586
+ end
587
+
574
588
  # This is to fix bug #2296, where two files recurse over the same
575
589
  # set of files. It's a rare case, and when it does happen you're
576
590
  # not likely to have many actual conflicts, which is good, because
577
591
  # this is a pretty inefficient implementation.
578
- def remove_less_specific_files(files)
592
+ def self.remove_less_specific_files(files, parent_path, existing_files, &block)
579
593
  # REVISIT: is this Windows safe? AltSeparator?
580
- mypath = self[:path].split(::File::Separator)
581
- other_paths = catalog.vertices.
582
- select { |r| r.is_a?(self.class) and r[:path] != self[:path] }.
583
- collect { |r| r[:path].split(::File::Separator) }.
594
+ mypath = parent_path.split(::File::Separator)
595
+ other_paths = existing_files.
596
+ select { |r| (yield r) != parent_path}.
597
+ collect { |r| (yield r).split(::File::Separator) }.
584
598
  select { |p| p[0,mypath.length] == mypath }
585
599
 
586
600
  return files if other_paths.empty?
587
601
 
588
602
  files.reject { |file|
589
- path = file[:path].split(::File::Separator)
603
+ path = (yield file).split(::File::Separator)
590
604
  other_paths.any? { |p| path[0,p.length] == p }
591
605
  }
592
606
  end
@@ -629,12 +643,43 @@ Puppet::Type.newtype(:file) do
629
643
 
630
644
  # Recurse against our remote file.
631
645
  def recurse_remote(children)
646
+ recurse_remote_metadata.each do |meta|
647
+ if meta.relative_path == "."
648
+ self[:checksum] = meta.checksum_type
649
+ parameter(:source).metadata = meta
650
+ next
651
+ end
652
+ children[meta.relative_path] ||= newchild(meta.relative_path)
653
+ children[meta.relative_path][:source] = meta.source
654
+ children[meta.relative_path][:checksum] = meta.checksum_type
655
+ children[meta.relative_path].parameter(:source).metadata = meta
656
+ end
657
+
658
+ children
659
+ end
660
+
661
+ def recurse_remote_metadata
632
662
  sourceselect = self[:sourceselect]
633
663
 
634
664
  total = self[:source].collect do |source|
635
- next unless result = perform_recursion(source)
636
- return if top = result.find { |r| r.relative_path == "." } and top.ftype != "directory"
637
- result.each { |data| data.source = "#{source}/#{data.relative_path}" }
665
+ # For each inlined file resource, the catalog contains a hash mapping
666
+ # source path to lists of metadata returned by a server-side search.
667
+ if recursive_metadata = catalog.recursive_metadata[title]
668
+ result = recursive_metadata[source]
669
+ else
670
+ result = perform_recursion(source)
671
+ end
672
+
673
+ next unless result
674
+ return [] if top = result.find { |r| r.relative_path == "." } and top.ftype != "directory"
675
+ result.each do |data|
676
+ if data.relative_path == '.'
677
+ data.source = source
678
+ else
679
+ # REMIND: appending file paths to URL may not be safe, e.g. foo+bar
680
+ data.source = "#{source}/#{data.relative_path}"
681
+ end
682
+ end
638
683
  break result if result and ! result.empty? and sourceselect == :first
639
684
  result
640
685
  end.flatten.compact
@@ -644,22 +689,12 @@ Puppet::Type.newtype(:file) do
644
689
  found = []
645
690
  total.reject! do |data|
646
691
  result = found.include?(data.relative_path)
647
- found << data.relative_path unless found.include?(data.relative_path)
692
+ found << data.relative_path unless result
648
693
  result
649
694
  end
650
695
  end
651
696
 
652
- total.each do |meta|
653
- if meta.relative_path == "."
654
- parameter(:source).metadata = meta
655
- next
656
- end
657
- children[meta.relative_path] ||= newchild(meta.relative_path)
658
- children[meta.relative_path][:source] = meta.source
659
- children[meta.relative_path].parameter(:source).metadata = meta
660
- end
661
-
662
- children
697
+ total
663
698
  end
664
699
 
665
700
  def perform_recursion(path)
@@ -707,7 +742,27 @@ Puppet::Type.newtype(:file) do
707
742
  end
708
743
 
709
744
  def retrieve
710
- if source = parameter(:source)
745
+ # This check is done in retrieve to ensure it happens before we try to use
746
+ # metadata in `copy_source_values`, but so it only fails the resource and not
747
+ # catalog validation (because that would be a breaking change from Puppet 4).
748
+ if Puppet.features.microsoft_windows? && parameter(:source) &&
749
+ [:use, :use_when_creating].include?(self[:source_permissions])
750
+ err_msg = "Copying owner/mode/group from the source file on Windows" <<
751
+ " is not supported; use source_permissions => ignore."
752
+
753
+ if self[:owner] == nil || self[:group] == nil || self[:mode] == nil
754
+ # Fail on Windows if source permissions are being used and the file resource
755
+ # does not have mode owner, group, and mode all set (which would take precedence).
756
+ self.fail err_msg
757
+ else
758
+ # Warn if use source permissions is specified on Windows
759
+ self.warning err_msg
760
+ end
761
+ end
762
+
763
+ # `checksum_value` implies explicit management of all metadata, so skip metadata
764
+ # retrieval. Otherwise, if source is set, retrieve metadata for source.
765
+ if (source = parameter(:source)) && property(:checksum_value).nil?
711
766
  source.copy_source_values
712
767
  end
713
768
  super
@@ -786,9 +841,10 @@ Puppet::Type.newtype(:file) do
786
841
  resource
787
842
  end
788
843
 
789
- # Write out the file. Requires the property name for logging.
790
- # Write will be done by the content property, along with checksum computation
791
- def write(property)
844
+ # Write out the file. To write content, pass the property as an argument
845
+ # to delegate writing to; must implement a #write method that takes the file
846
+ # as an argument.
847
+ def write(property = nil)
792
848
  remove_existing(:file)
793
849
 
794
850
  mode = self.should(:mode) # might be nil
@@ -797,7 +853,8 @@ Puppet::Type.newtype(:file) do
797
853
  if write_temporary_file?
798
854
  Puppet::Util.replace_file(self[:path], mode_int) do |file|
799
855
  file.binmode
800
- content_checksum = write_content(file)
856
+ devfail 'a property should have been provided if write_temporary_file? returned true' if property.nil?
857
+ content_checksum = property.write(file)
801
858
  file.flush
802
859
  fail_if_checksum_is_wrong(file.path, content_checksum) if validate_checksum?
803
860
  if self[:validate_cmd]
@@ -809,7 +866,7 @@ Puppet::Type.newtype(:file) do
809
866
  end
810
867
  else
811
868
  umask = mode ? 000 : 022
812
- Puppet::Util.withumask(umask) { ::File.open(self[:path], 'wb', mode_int ) { |f| write_content(f) } }
869
+ Puppet::Util.withumask(umask) { ::File.open(self[:path], 'wb', mode_int ) { |f| property.write(f) if property } }
813
870
  end
814
871
 
815
872
  # make sure all of the modes are actually correct
@@ -889,16 +946,9 @@ Puppet::Type.newtype(:file) do
889
946
  self.fail "File written to disk did not match checksum; discarding changes (#{content_checksum} vs #{newsum})"
890
947
  end
891
948
 
892
- # write the current content. Note that if there is no content property
893
- # simply opening the file with 'w' as done in write is enough to truncate
894
- # or write an empty length file.
895
- def write_content(file)
896
- (content = property(:content)) && content.write(file)
897
- end
898
-
899
949
  def write_temporary_file?
900
- # unfortunately we don't know the source file size before fetching it
901
- # so let's assume the file won't be empty
950
+ # Unfortunately we don't know the source file size before fetching it so
951
+ # let's assume the file won't be empty. Why isn't it part of the metadata?
902
952
  (c = property(:content) and c.length) || @parameters[:source]
903
953
  end
904
954
 
@@ -914,6 +964,7 @@ Puppet::Type.newtype(:file) do
914
964
  thing.sync unless thing.safe_insync?(currentvalue)
915
965
  end
916
966
  end
967
+
917
968
  end
918
969
 
919
970
  # We put all of the properties in separate files, because there are so many
@@ -922,6 +973,7 @@ end
922
973
  require 'puppet/type/file/checksum'
923
974
  require 'puppet/type/file/content' # can create the file
924
975
  require 'puppet/type/file/source' # can create the file
976
+ require 'puppet/type/file/checksum_value' # can create the file, in place of content
925
977
  require 'puppet/type/file/target' # creates a different type of file
926
978
  require 'puppet/type/file/ensure' # can create the file
927
979
  require 'puppet/type/file/owner'