puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -1,5 +1,6 @@
1
1
  require 'digest/md5'
2
2
  require 'digest/sha1'
3
+ require 'time'
3
4
 
4
5
  # A stand-alone module for calculating checksums
5
6
  # in a generic way.
@@ -41,8 +42,8 @@ module Puppet::Util::Checksums
41
42
  Digest::SHA256.hexdigest(content)
42
43
  end
43
44
 
44
- def sha256lite(content)
45
- sha256(content[0..511])
45
+ def sha256?(string)
46
+ string =~ /^\h{64}$/
46
47
  end
47
48
 
48
49
  def sha256_file(filename, lite = false)
@@ -52,10 +53,6 @@ module Puppet::Util::Checksums
52
53
  checksum_file(digest, filename, lite)
53
54
  end
54
55
 
55
- def sha256lite_file(filename)
56
- sha256_file(filename, true)
57
- end
58
-
59
56
  def sha256_stream(lite = false, &block)
60
57
  require 'digest/sha2'
61
58
  digest = Digest::SHA256.new
@@ -66,6 +63,18 @@ module Puppet::Util::Checksums
66
63
  64
67
64
  end
68
65
 
66
+ def sha256lite(content)
67
+ sha256(content[0..511])
68
+ end
69
+
70
+ def sha256lite?(string)
71
+ sha256?(string)
72
+ end
73
+
74
+ def sha256lite_file(filename)
75
+ sha256_file(filename, true)
76
+ end
77
+
69
78
  def sha256lite_stream(&block)
70
79
  sha256_stream(true, &block)
71
80
  end
@@ -79,9 +88,8 @@ module Puppet::Util::Checksums
79
88
  Digest::MD5.hexdigest(content)
80
89
  end
81
90
 
82
- # Calculate a checksum of the first 500 chars of the content using Digest::MD5.
83
- def md5lite(content)
84
- md5(content[0..511])
91
+ def md5?(string)
92
+ string =~ /^\h{32}$/
85
93
  end
86
94
 
87
95
  # Calculate a checksum of a file's content using Digest::MD5.
@@ -90,11 +98,6 @@ module Puppet::Util::Checksums
90
98
  checksum_file(digest, filename, lite)
91
99
  end
92
100
 
93
- # Calculate a checksum of the first 500 chars of a file's content using Digest::MD5.
94
- def md5lite_file(filename)
95
- md5_file(filename, true)
96
- end
97
-
98
101
  def md5_stream(lite = false, &block)
99
102
  digest = Digest::MD5.new
100
103
  checksum_stream(digest, block, lite)
@@ -104,6 +107,20 @@ module Puppet::Util::Checksums
104
107
  32
105
108
  end
106
109
 
110
+ # Calculate a checksum of the first 500 chars of the content using Digest::MD5.
111
+ def md5lite(content)
112
+ md5(content[0..511])
113
+ end
114
+
115
+ def md5lite?(string)
116
+ md5?(string)
117
+ end
118
+
119
+ # Calculate a checksum of the first 500 chars of a file's content using Digest::MD5.
120
+ def md5lite_file(filename)
121
+ md5_file(filename, true)
122
+ end
123
+
107
124
  def md5lite_stream(&block)
108
125
  md5_stream(true, &block)
109
126
  end
@@ -112,6 +129,17 @@ module Puppet::Util::Checksums
112
129
  md5_hex_length
113
130
  end
114
131
 
132
+ def mtime(content)
133
+ ""
134
+ end
135
+
136
+ def mtime?(string)
137
+ return true if string.is_a? Time
138
+ !!DateTime.parse(string)
139
+ rescue
140
+ false
141
+ end
142
+
115
143
  # Return the :mtime timestamp of a file.
116
144
  def mtime_file(filename)
117
145
  Puppet::FileSystem.stat(filename).send(:mtime)
@@ -125,18 +153,13 @@ module Puppet::Util::Checksums
125
153
  nil
126
154
  end
127
155
 
128
- def mtime(content)
129
- ""
130
- end
131
-
132
156
  # Calculate a checksum using Digest::SHA1.
133
157
  def sha1(content)
134
158
  Digest::SHA1.hexdigest(content)
135
159
  end
136
160
 
137
- # Calculate a checksum of the first 500 chars of the content using Digest::SHA1.
138
- def sha1lite(content)
139
- sha1(content[0..511])
161
+ def sha1?(string)
162
+ string =~ /^\h{40}$/
140
163
  end
141
164
 
142
165
  # Calculate a checksum of a file's content using Digest::SHA1.
@@ -145,11 +168,6 @@ module Puppet::Util::Checksums
145
168
  checksum_file(digest, filename, lite)
146
169
  end
147
170
 
148
- # Calculate a checksum of the first 500 chars of a file's content using Digest::SHA1.
149
- def sha1lite_file(filename)
150
- sha1_file(filename, true)
151
- end
152
-
153
171
  def sha1_stream(lite = false, &block)
154
172
  digest = Digest::SHA1.new
155
173
  checksum_stream(digest, block, lite)
@@ -159,6 +177,20 @@ module Puppet::Util::Checksums
159
177
  40
160
178
  end
161
179
 
180
+ # Calculate a checksum of the first 500 chars of the content using Digest::SHA1.
181
+ def sha1lite(content)
182
+ sha1(content[0..511])
183
+ end
184
+
185
+ def sha1lite?(string)
186
+ sha1?(string)
187
+ end
188
+
189
+ # Calculate a checksum of the first 500 chars of a file's content using Digest::SHA1.
190
+ def sha1lite_file(filename)
191
+ sha1_file(filename, true)
192
+ end
193
+
162
194
  def sha1lite_stream(&block)
163
195
  sha1_stream(true, &block)
164
196
  end
@@ -167,6 +199,17 @@ module Puppet::Util::Checksums
167
199
  sha1_hex_length
168
200
  end
169
201
 
202
+ def ctime(content)
203
+ ""
204
+ end
205
+
206
+ def ctime?(string)
207
+ return true if string.is_a? Time
208
+ !!DateTime.parse(string)
209
+ rescue
210
+ false
211
+ end
212
+
170
213
  # Return the :ctime of a file.
171
214
  def ctime_file(filename)
172
215
  Puppet::FileSystem.stat(filename).send(:ctime)
@@ -176,10 +219,14 @@ module Puppet::Util::Checksums
176
219
  mtime_stream(&block)
177
220
  end
178
221
 
179
- def ctime(content)
222
+ def none(content)
180
223
  ""
181
224
  end
182
225
 
226
+ def none?(string)
227
+ string.empty?
228
+ end
229
+
183
230
  # Return a "no checksum"
184
231
  def none_file(filename)
185
232
  ""
@@ -191,10 +238,6 @@ module Puppet::Util::Checksums
191
238
  ""
192
239
  end
193
240
 
194
- def none(content)
195
- ""
196
- end
197
-
198
241
  class DigestLite
199
242
  def initialize(digest, lite = false)
200
243
  @digest = digest
@@ -317,7 +317,7 @@ module Puppet::Util::Execution
317
317
  end.join(" ") if command.is_a?(Array)
318
318
 
319
319
  options[:custom_environment] ||= {}
320
- Puppet::Util.withenv(options[:custom_environment]) do
320
+ Puppet::Util.withenv(options[:custom_environment], :windows) do
321
321
  Puppet::Util::Windows::Process.execute(command, options, stdin, stdout, stderr)
322
322
  end
323
323
  end
@@ -1,3 +1,6 @@
1
+ require 'uri'
2
+ require 'openssl'
3
+
1
4
  module Puppet::Util::HttpProxy
2
5
  def self.proxy(uri)
3
6
  if self.no_proxy?(uri)
@@ -122,4 +125,73 @@ module Puppet::Util::HttpProxy
122
125
 
123
126
  return Puppet.settings[:http_proxy_password]
124
127
  end
128
+
129
+ # Return a Net::HTTP::Proxy object.
130
+ #
131
+ # This method optionally configures SSL correctly if the URI scheme is
132
+ # 'https', including setting up the root certificate store so remote server
133
+ # SSL certificates can be validated.
134
+ #
135
+ # @param [URI] uri The URI that is to be accessed.
136
+ # @return [Net::HTTP::Proxy] object constructed tailored for the passed URI
137
+ def self.get_http_object(uri)
138
+ proxy = proxy(uri)
139
+
140
+ if uri.scheme == 'https'
141
+ cert_store = OpenSSL::X509::Store.new
142
+ cert_store.set_default_paths
143
+
144
+ proxy.use_ssl = true
145
+ proxy.verify_mode = OpenSSL::SSL::VERIFY_PEER
146
+ proxy.cert_store = cert_store
147
+ end
148
+
149
+ if Puppet[:http_debug]
150
+ proxy.set_debug_output($stderr)
151
+ end
152
+
153
+ proxy.open_timeout = Puppet[:http_connect_timeout]
154
+ proxy.read_timeout = Puppet[:http_read_timeout]
155
+
156
+ proxy
157
+ end
158
+
159
+ # Retrieve a document through HTTP(s), following redirects if necessary.
160
+ #
161
+ # Based on the the client implementation in the HTTP pool.
162
+ #
163
+ # @see Puppet::Network::HTTP::Connection#request_with_redirects
164
+ #
165
+ # @param [URI] uri The address of the resource to retrieve.
166
+ # @param [symbol] method The name of the Net::HTTP method to use, typically :get, :head, :post etc.
167
+ # @param [FixNum] redirect_limit The number of redirections that can be followed.
168
+ # @return [Net::HTTPResponse] a response object
169
+ def self.request_with_redirects(uri, method, redirect_limit = 10, &block)
170
+ current_uri = uri
171
+ response = nil
172
+
173
+ 0.upto(redirect_limit) do |redirection|
174
+ proxy = get_http_object(current_uri)
175
+ response = proxy.send(:head, current_uri.path)
176
+
177
+ if [301, 302, 307].include?(response.code.to_i)
178
+ # handle the redirection
179
+ current_uri = URI.parse(response['location'])
180
+ next
181
+ end
182
+
183
+ if block_given?
184
+ headers = {'Accept' => 'binary', 'accept-encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3'}
185
+ response = proxy.send("request_#{method}".to_sym, current_uri.path, headers, &block)
186
+ else
187
+ response = proxy.send(method, current_uri.path)
188
+ end
189
+
190
+ Puppet.debug("HTTP #{method.to_s.upcase} request to #{current_uri} returned #{response.code} #{response.message}")
191
+
192
+ return response
193
+ end
194
+
195
+ raise RedirectionLimitExceededException, "Too many HTTP redirections for #{uri}"
196
+ end
125
197
  end
@@ -1,5 +1,6 @@
1
1
  require 'puppet/util/tagging'
2
2
  require 'puppet/util/classgen'
3
+ require 'puppet/util/psych_support'
3
4
  require 'puppet/network/format_support'
4
5
  require 'facter'
5
6
 
@@ -9,6 +10,7 @@ require 'facter'
9
10
  class Puppet::Util::Log
10
11
  include Puppet::Util
11
12
  extend Puppet::Util::ClassGen
13
+ include Puppet::Util::PsychSupport
12
14
  include Puppet::Util::Tagging
13
15
  include Puppet::Network::FormatSupport
14
16
 
@@ -1,9 +1,12 @@
1
1
  # A module to make logging a bit easier.
2
2
  require 'puppet/util/log'
3
3
  require 'puppet/error'
4
+ require 'puppet/util/multi_match.rb'
5
+
4
6
  require 'facter'
5
7
 
6
- module Puppet::Util::Logging
8
+ module Puppet::Util
9
+ module Logging
7
10
 
8
11
  def send_log(level, message)
9
12
  Puppet::Util::Log.create({:level => level, :source => log_source, :message => message}.merge(log_metadata))
@@ -148,6 +151,43 @@ module Puppet::Util::Logging
148
151
  key ||= "#{file}:#{line}"
149
152
  issue_deprecation_warning(message, key, file, line, false)
150
153
  end
154
+ MM = MultiMatch
155
+ FILE_AND_LINE = MM::TUPLE
156
+ FILE_NO_LINE = MM.new(MM::NOT_NIL, nil).freeze
157
+ NO_FILE_LINE = MM.new(nil, MM::NOT_NIL).freeze
158
+
159
+ # Logs a (non deprecation) warning once for a given key.
160
+ #
161
+ # @param kind [String] The kind of warning. The
162
+ # kind must be one of the defined kinds for the Puppet[:disable_warnings] setting.
163
+ # @param message [String] The message to log (logs via warning)
164
+ # @param key [String] Key used to make this warning unique
165
+ # @param file [String,nil] the File related to the warning
166
+ # @param line [Integer,nil] the Line number related to the warning
167
+ # warning as unique
168
+ #
169
+ # Either :file and :line and/or :key must be passed.
170
+ def warn_once(kind, key, message, file = nil, line = nil)
171
+ return if Puppet[:disable_warnings].include?(kind)
172
+ $unique_warnings ||= {}
173
+ if $unique_warnings.length < 100 then
174
+ if (! $unique_warnings.has_key?(key)) then
175
+ $unique_warnings[key] = message
176
+ call_trace =
177
+ case MM.new(file, line)
178
+ when FILE_AND_LINE
179
+ "\n (at #{file}:#{line})"
180
+ when FILE_NO_LINE
181
+ "\n (in #{file})"
182
+ when NO_FILE_LINE
183
+ "\n (in unknown file, line #{line})"
184
+ else
185
+ "\n (file & line not available)"
186
+ end
187
+ warning("#{message}#{call_trace}")
188
+ end
189
+ end
190
+ end
151
191
 
152
192
  def get_deprecation_offender()
153
193
  # we have to put this in its own method to simplify testing; we need to be able to mock the offender results in
@@ -163,6 +203,7 @@ module Puppet::Util::Logging
163
203
  end
164
204
 
165
205
  def clear_deprecation_warnings
206
+ $unique_warnings.clear if $unique_warnings
166
207
  $deprecation_warnings.clear if $deprecation_warnings
167
208
  end
168
209
 
@@ -266,3 +307,4 @@ module Puppet::Util::Logging
266
307
  to_s
267
308
  end
268
309
  end
310
+ end
@@ -21,7 +21,7 @@ end
21
21
  class Symbol
22
22
  def <=> (other)
23
23
  self.to_s <=> other.to_s
24
- end unless method_defined? '<=>'
24
+ end
25
25
 
26
26
  def intern
27
27
  self
@@ -117,7 +117,7 @@ if Puppet::Util::Platform.windows?
117
117
  alias __original_set_default_paths set_default_paths
118
118
  def set_default_paths
119
119
  # This can be removed once openssl integrates with windows
120
- # cert store, see http://rt.openssl.org/Ticket/Display.html?id=2158
120
+ # cert store, see https://rt.openssl.org/Ticket/Display.html?id=2158
121
121
  Puppet::Util::Windows::RootCerts.instance.to_a.uniq.each do |x509|
122
122
  begin
123
123
  add_cert(x509)
@@ -0,0 +1,51 @@
1
+ # MultiMatch allows multiple values to be tested at once in a case expression.
2
+ # This class is needed since Array does not implement the === operator to mean
3
+ # "each v === other.each v".
4
+ #
5
+ # This class is useful in situations when the Puppet Type System cannot be used
6
+ # (e.g. in Logging, since it needs to be able to log very early i the intialization
7
+ # cycle of puppet)
8
+ #
9
+ # Typically used with the constants
10
+ # NOT_NIL
11
+ # TUPLE
12
+ # TRIPLE
13
+ #
14
+ # which test against single NOT_NIL value, Array with two NOT_NIL, and Array with three NOT_NIL
15
+ #
16
+ module Puppet::Util
17
+ class MultiMatch
18
+ attr_reader :values
19
+
20
+ def initialize(*values)
21
+ @values = values
22
+ end
23
+
24
+ def ===(other)
25
+ lv = @values # local var is faster than instance var
26
+ case other
27
+ when MultiMatch
28
+ return false unless other.values.size == values.size
29
+ other.values.each_with_index {|v, i| return false unless lv[i] === v || v === lv[i]}
30
+ when Array
31
+ return false unless other.size == values.size
32
+ other.each_with_index {|v, i| return false unless lv[i] === v || v === lv[i]}
33
+ else
34
+ false
35
+ end
36
+ true
37
+ end
38
+
39
+ # Matches any value that is not nil using the === operator.
40
+ #
41
+ class MatchNotNil
42
+ def ===(v)
43
+ !v.nil?
44
+ end
45
+ end
46
+
47
+ NOT_NIL = MatchNotNil.new().freeze
48
+ TUPLE = MultiMatch.new(NOT_NIL, NOT_NIL).freeze
49
+ TRIPLE = MultiMatch.new(NOT_NIL, NOT_NIL, NOT_NIL).freeze
50
+ end
51
+ end
@@ -234,20 +234,28 @@ class Puppet::Util::NetworkDevice::Cisco::Device < Puppet::Util::NetworkDevice::
234
234
  trunking[:mode] = :trunk
235
235
  when "static access"
236
236
  trunking[:mode] = :access
237
+ when "dynamic auto"
238
+ trunking[:mode] = 'dynamic auto'
239
+ when "dynamic desirable"
240
+ trunking[:mode] = 'dynamic desirable'
237
241
  else
238
242
  raise "Unknown switchport mode: #{$1} for #{interface}"
239
243
  end
240
244
  when /^Administrative Trunking Encapsulation:\s+(.*)$/
241
245
  case $1
242
246
  when "dot1q","isl"
243
- trunking[:encapsulation] = $1.to_sym if trunking[:mode] == :trunk
247
+ trunking[:encapsulation] = $1.to_sym if trunking[:mode] != :access
248
+ when "negotiate"
249
+ trunking[:encapsulation] = :negotiate
244
250
  else
245
251
  raise "Unknown switchport encapsulation: #{$1} for #{interface}"
246
252
  end
247
253
  when /^Access Mode VLAN:\s+(.*) \(\(Inactive\)\)$/
248
254
  # nothing
249
255
  when /^Access Mode VLAN:\s+(.*) \(.*\)$/
250
- trunking[:native_vlan] = $1 if trunking[:mode] == :access
256
+ trunking[:access_vlan] = $1 if trunking[:mode] != :trunk
257
+ when /^Trunking Native Mode VLAN:\s+(.*) \(.*\)$/
258
+ trunking[:native_vlan] = $1 if trunking[:mode] != :access
251
259
  when /^Trunking VLANs Enabled:\s+(.*)$/
252
260
  next if trunking[:mode] == :access
253
261
  vlans = $1
@@ -19,17 +19,18 @@ class Puppet::Util::NetworkDevice::Cisco::Interface
19
19
  :description => [1, "description %s"],
20
20
  :speed => [2, "speed %s"],
21
21
  :duplex => [3, "duplex %s"],
22
- :native_vlan => [4, "switchport access vlan %s"],
23
- :encapsulation => [5, "switchport trunk encapsulation %s"],
24
- :mode => [6, "switchport mode %s"],
25
- :allowed_trunk_vlans => [7, "switchport trunk allowed vlan %s"],
26
- :etherchannel => [8, ["channel-group %s", "port group %s"]],
27
- :ipaddress => [9,
22
+ :encapsulation => [4, "switchport trunk encapsulation %s"],
23
+ :mode => [5, "switchport mode %s"],
24
+ :access_vlan => [6, "switchport access vlan %s"],
25
+ :native_vlan => [7, "switchport trunk native vlan %s"],
26
+ :allowed_trunk_vlans => [8, "switchport trunk allowed vlan %s"],
27
+ :etherchannel => [9, ["channel-group %s", "port group %s"]],
28
+ :ipaddress => [10,
28
29
  lambda do |prefix,ip,option|
29
30
  ip.ipv6? ? "ipv6 address #{ip.to_s}/#{prefix} #{option}" :
30
31
  "ip address #{ip.to_s} #{netmask(Socket::AF_INET,prefix)}"
31
32
  end],
32
- :ensure => [10, lambda { |value| value == :present ? "no shutdown" : "shutdown" } ]
33
+ :ensure => [11, lambda { |value| value == :present ? "no shutdown" : "shutdown" } ]
33
34
  }
34
35
 
35
36
  def update(is={}, should={})
@@ -37,8 +38,20 @@ class Puppet::Util::NetworkDevice::Cisco::Interface
37
38
  command("conf t")
38
39
  command("interface #{name}")
39
40
 
40
- # apply changes in a defined orders for cisco IOS devices
41
+ # apply changes in a defined order for cisco IOS devices
41
42
  [is.keys, should.keys].flatten.uniq.sort {|a,b| COMMANDS[a][0] <=> COMMANDS[b][0] }.each do |property|
43
+ # Work around for old documentation which shows :native_vlan used for access vlan
44
+ if property == :access_vlan and should[:mode] != :trunk and should[:access_vlan].nil?
45
+ should[:access_vlan] = should[:native_vlan]
46
+ end
47
+
48
+ # Don't change non-operational mode parameters
49
+ next if property == :access_vlan and should[:mode] == :trunk
50
+ next if property == :native_vlan and should[:mode] == :access
51
+ next if property == :encapsulation and should[:mode] == :access
52
+
53
+ Puppet.debug("comparing #{property}: #{is[property]} == #{should[property]}")
54
+
42
55
  # They're equal, so do nothing.
43
56
  next if is[property] == should[property]
44
57
 
@@ -68,9 +68,13 @@ class Puppet::Util::NetworkDevice::Transport::Ssh < Puppet::Util::NetworkDevice:
68
68
  end
69
69
 
70
70
  def close
71
- @channel.close if @channel
72
- @channel = nil
73
- @ssh.close if @ssh
71
+ begin
72
+ @channel.close if @channel
73
+ @channel = nil
74
+ @ssh.close if @ssh
75
+ rescue IOError
76
+ Puppet.debug "device terminated ssh session impolitely"
77
+ end
74
78
  end
75
79
 
76
80
  def expect(prompt)
@@ -1,44 +1,47 @@
1
1
  require 'puppet/util/network_device'
2
2
  require 'puppet/util/network_device/transport'
3
3
  require 'puppet/util/network_device/transport/base'
4
- require 'net/telnet'
5
-
6
- class Puppet::Util::NetworkDevice::Transport::Telnet < Puppet::Util::NetworkDevice::Transport::Base
7
- def initialize(verbose = false)
8
- super()
9
- @verbose = verbose
10
- end
11
-
12
- def handles_login?
13
- false
14
- end
15
-
16
- def connect
17
- @telnet = Net::Telnet::new("Host" => host, "Port" => port || 23,
18
- "Timeout" => 10,
19
- "Prompt" => default_prompt)
20
- end
21
-
22
- def close
23
- @telnet.close if @telnet
24
- @telnet = nil
25
- end
26
-
27
- def expect(prompt)
28
- @telnet.waitfor(prompt) do |out|
29
- yield out if block_given?
4
+
5
+ if Puppet.features.telnet?
6
+ require 'net/telnet'
7
+
8
+ class Puppet::Util::NetworkDevice::Transport::Telnet < Puppet::Util::NetworkDevice::Transport::Base
9
+ def initialize(verbose = false)
10
+ super()
11
+ @verbose = verbose
12
+ end
13
+
14
+ def handles_login?
15
+ false
16
+ end
17
+
18
+ def connect
19
+ @telnet = Net::Telnet::new("Host" => host, "Port" => port || 23,
20
+ "Timeout" => 10,
21
+ "Prompt" => default_prompt)
30
22
  end
31
- end
32
23
 
33
- def command(cmd, options = {})
34
- send(cmd)
35
- expect(options[:prompt] || default_prompt) do |output|
36
- yield output if block_given?
24
+ def close
25
+ @telnet.close if @telnet
26
+ @telnet = nil
37
27
  end
38
- end
39
28
 
40
- def send(line)
41
- Puppet.debug("telnet: send #{line}") if @verbose
42
- @telnet.puts(line)
43
- end
29
+ def expect(prompt)
30
+ @telnet.waitfor(prompt) do |out|
31
+ yield out if block_given?
32
+ end
33
+ end
34
+
35
+ def command(cmd, options = {})
36
+ send(cmd)
37
+ expect(options[:prompt] || default_prompt) do |output|
38
+ yield output if block_given?
39
+ end
40
+ end
41
+
42
+ def send(line)
43
+ Puppet.debug("telnet: send #{line}") if @verbose
44
+ @telnet.puts(line)
45
+ end
46
+ end
44
47
  end