puppet 4.8.2-universal-darwin → 4.9.0-universal-darwin

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 (348) hide show
  1. checksums.yaml +15 -0
  2. data/CONTRIBUTING.md +25 -1
  3. data/Gemfile +6 -0
  4. data/Rakefile +1 -0
  5. data/ext/project_data.yaml +5 -1
  6. data/ext/windows/service/daemon.rb +2 -1
  7. data/install.rb +43 -6
  8. data/lib/hiera/puppet_function.rb +15 -17
  9. data/lib/hiera/scope.rb +12 -14
  10. data/lib/puppet/application/face_base.rb +4 -0
  11. data/lib/puppet/application/lookup.rb +4 -2
  12. data/lib/puppet/application/resource.rb +1 -1
  13. data/lib/puppet/data_providers/data_adapter.rb +6 -0
  14. data/lib/puppet/data_providers/data_function_support.rb +7 -0
  15. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -0
  16. data/lib/puppet/data_providers/function_module_data_provider.rb +6 -0
  17. data/lib/puppet/data_providers/hiera_config.rb +31 -10
  18. data/lib/puppet/data_providers/hiera_env_data_provider.rb +6 -0
  19. data/lib/puppet/data_providers/hiera_interpolate.rb +2 -1
  20. data/lib/puppet/data_providers/hiera_module_data_provider.rb +6 -0
  21. data/lib/puppet/data_providers/hiera_support.rb +6 -0
  22. data/lib/puppet/data_providers/json_data_provider_factory.rb +12 -0
  23. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +12 -0
  24. data/lib/puppet/data_providers.rb +6 -3
  25. data/lib/puppet/defaults.rb +25 -4
  26. data/lib/puppet/face/ca.rb +2 -0
  27. data/lib/puppet/face/certificate_request.rb +2 -0
  28. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  29. data/lib/puppet/face/file.rb +3 -0
  30. data/lib/puppet/face/help/face.erb +3 -0
  31. data/lib/puppet/face/help.rb +19 -17
  32. data/lib/puppet/face/key.rb +1 -0
  33. data/lib/puppet/face/man.rb +4 -2
  34. data/lib/puppet/face/module/generate.rb +1 -1
  35. data/lib/puppet/face/status.rb +2 -0
  36. data/lib/puppet/feature/base.rb +9 -2
  37. data/lib/puppet/feature/hocon.rb +3 -0
  38. data/lib/puppet/file_system/windows.rb +8 -0
  39. data/lib/puppet/file_system.rb +15 -3
  40. data/lib/puppet/forge/repository.rb +1 -2
  41. data/lib/puppet/forge.rb +6 -6
  42. data/lib/puppet/functions/binary_file.rb +4 -10
  43. data/lib/puppet/functions/hiera_array.rb +1 -1
  44. data/lib/puppet/functions/hiera_include.rb +1 -1
  45. data/lib/puppet/functions/hocon_data.rb +24 -0
  46. data/lib/puppet/functions/json_data.rb +18 -0
  47. data/lib/puppet/functions/yaml_data.rb +21 -0
  48. data/lib/puppet/generate/type.rb +1 -1
  49. data/lib/puppet/graph/simple_graph.rb +4 -2
  50. data/lib/puppet/indirector/file_bucket_file/file.rb +10 -2
  51. data/lib/puppet/indirector/request.rb +5 -1
  52. data/lib/puppet/interface/face_collection.rb +1 -1
  53. data/lib/puppet/interface.rb +14 -2
  54. data/lib/puppet/module.rb +14 -2
  55. data/lib/puppet/module_tool/applications/builder.rb +3 -2
  56. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  57. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  58. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  59. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  60. data/lib/puppet/module_tool/metadata.rb +1 -1
  61. data/lib/puppet/module_tool.rb +4 -4
  62. data/lib/puppet/network/http/connection.rb +2 -0
  63. data/lib/puppet/network/http/webrick.rb +2 -1
  64. data/lib/puppet/parser/functions/hiera.rb +14 -0
  65. data/lib/puppet/parser/functions/hiera_array.rb +14 -0
  66. data/lib/puppet/parser/functions/hiera_hash.rb +14 -0
  67. data/lib/puppet/parser/functions/hiera_include.rb +14 -0
  68. data/lib/puppet/parser/scope.rb +14 -20
  69. data/lib/puppet/plugins/data_providers/data_provider.rb +108 -17
  70. data/lib/puppet/plugins/data_providers/registry.rb +2 -36
  71. data/lib/puppet/plugins/data_providers.rb +2 -0
  72. data/lib/puppet/pops/adaptable.rb +0 -3
  73. data/lib/puppet/pops/binder/producers.rb +3 -3
  74. data/lib/puppet/pops/evaluator/access_operator.rb +4 -4
  75. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  76. data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
  77. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  78. data/lib/puppet/pops/issues.rb +4 -0
  79. data/lib/puppet/pops/label_provider.rb +14 -0
  80. data/lib/puppet/pops/loader/loader_paths.rb +3 -1
  81. data/lib/puppet/pops/loader/module_loaders.rb +21 -7
  82. data/lib/puppet/pops/loader/typed_name.rb +0 -2
  83. data/lib/puppet/pops/loaders.rb +31 -12
  84. data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
  85. data/lib/puppet/pops/lookup/context.rb +121 -71
  86. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  87. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
  88. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
  89. data/lib/puppet/pops/lookup/data_provider.rb +102 -0
  90. data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
  91. data/lib/puppet/pops/lookup/explainer.rb +122 -82
  92. data/lib/puppet/pops/lookup/function_provider.rb +82 -0
  93. data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
  94. data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
  95. data/lib/puppet/pops/lookup/interpolation.rb +56 -35
  96. data/lib/puppet/pops/lookup/invocation.rb +179 -101
  97. data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
  98. data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
  99. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  100. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
  101. data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
  102. data/lib/puppet/pops/lookup/sub_lookup.rb +8 -4
  103. data/lib/puppet/pops/lookup.rb +4 -3
  104. data/lib/puppet/pops/merge_strategy.rb +120 -39
  105. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  106. data/lib/puppet/pops/parser/eparser.rb +816 -808
  107. data/lib/puppet/pops/parser/locator.rb +3 -3
  108. data/lib/puppet/pops/parser/slurp_support.rb +4 -3
  109. data/lib/puppet/pops/pcore.rb +21 -12
  110. data/lib/puppet/pops/serialization/abstract_reader.rb +17 -7
  111. data/lib/puppet/pops/serialization/abstract_writer.rb +27 -12
  112. data/lib/puppet/pops/serialization/deserializer.rb +17 -4
  113. data/lib/puppet/pops/serialization/extension.rb +37 -8
  114. data/lib/puppet/pops/serialization/object.rb +14 -6
  115. data/lib/puppet/pops/serialization/rgen.rb +2 -1
  116. data/lib/puppet/pops/serialization/serializer.rb +30 -7
  117. data/lib/puppet/pops/types/implementation_registry.rb +1 -1
  118. data/lib/puppet/pops/types/p_object_type.rb +55 -12
  119. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +27 -27
  120. data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -12
  121. data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
  122. data/lib/puppet/pops/types/p_timestamp_type.rb +2 -2
  123. data/lib/puppet/pops/types/p_type_set_type.rb +7 -16
  124. data/lib/puppet/pops/types/recursion_guard.rb +64 -20
  125. data/lib/puppet/pops/types/ruby_generator.rb +10 -0
  126. data/lib/puppet/pops/types/type_calculator.rb +23 -13
  127. data/lib/puppet/pops/types/type_factory.rb +20 -9
  128. data/lib/puppet/pops/types/type_formatter.rb +37 -17
  129. data/lib/puppet/pops/types/type_mismatch_describer.rb +7 -6
  130. data/lib/puppet/pops/types/type_parser.rb +6 -0
  131. data/lib/puppet/pops/types/types.rb +225 -132
  132. data/lib/puppet/pops/validation/checker4_0.rb +12 -2
  133. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  134. data/lib/puppet/pops/validation.rb +1 -1
  135. data/lib/puppet/pops/visitor.rb +4 -3
  136. data/lib/puppet/pops.rb +6 -9
  137. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -1
  138. data/lib/puppet/provider/nameservice.rb +15 -0
  139. data/lib/puppet/provider/package/appdmg.rb +1 -1
  140. data/lib/puppet/provider/package/dnf.rb +1 -1
  141. data/lib/puppet/provider/package/pkg.rb +1 -1
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +1 -1
  144. data/lib/puppet/provider/package/rpm.rb +2 -2
  145. data/lib/puppet/provider/service/smf.rb +3 -3
  146. data/lib/puppet/provider/service/systemd.rb +5 -1
  147. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  148. data/lib/puppet/provider/user/user_role_add.rb +15 -0
  149. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  150. data/lib/puppet/provider/zone/solaris.rb +4 -1
  151. data/lib/puppet/reference/indirection.rb +1 -1
  152. data/lib/puppet/resource/catalog.rb +12 -4
  153. data/lib/puppet/resource/type.rb +3 -3
  154. data/lib/puppet/resource.rb +2 -3
  155. data/lib/puppet/settings/config_file.rb +2 -1
  156. data/lib/puppet/settings/directory_setting.rb +6 -0
  157. data/lib/puppet/settings/environment_conf.rb +6 -2
  158. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  159. data/lib/puppet/settings/file_setting.rb +10 -0
  160. data/lib/puppet/settings.rb +1 -1
  161. data/lib/puppet/ssl/certificate_authority.rb +13 -2
  162. data/lib/puppet/ssl/host.rb +23 -1
  163. data/lib/puppet/transaction/additional_resource_generator.rb +7 -0
  164. data/lib/puppet/type/user.rb +16 -3
  165. data/lib/puppet/util/execution.rb +3 -3
  166. data/lib/puppet/util/filetype.rb +11 -5
  167. data/lib/puppet/util/logging.rb +2 -1
  168. data/lib/puppet/util/network_device/config.rb +1 -1
  169. data/lib/puppet/util/plist.rb +6 -0
  170. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  171. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  172. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  173. data/lib/puppet/util/windows/adsi.rb +15 -12
  174. data/lib/puppet/util.rb +1 -0
  175. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  176. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  177. data/lib/puppet/vendor/require_vendored.rb +0 -1
  178. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  179. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  180. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +58 -0
  181. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  182. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  183. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  184. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  185. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  186. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  187. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  188. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  189. data/lib/puppet/version.rb +1 -1
  190. data/lib/puppet.rb +52 -0
  191. data/lib/semver.rb +19 -12
  192. data/locales/config.yaml +29 -0
  193. data/locales/puppet.pot +79 -0
  194. data/man/man5/puppet.conf.5 +1 -1
  195. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/{data.pp → environment/data.pp} +0 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +2 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +1 -1
  198. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
  201. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
  202. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
  203. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  204. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
  205. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  206. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  207. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  208. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  209. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
  210. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  211. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  212. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
  213. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +0 -0
  214. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/manifests/init.pp +0 -0
  215. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
  216. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  217. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  218. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/data/empty.json +0 -0
  219. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/hiera.yaml +0 -0
  220. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/manifests/init.pp +0 -0
  221. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/metadata.json +0 -0
  222. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/data/empty_key.json +0 -0
  223. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/hiera.yaml +0 -0
  224. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/manifests/init.pp +0 -0
  225. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/metadata.json +0 -0
  226. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/data/empty_key.yaml +0 -0
  227. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/hiera.yaml +0 -0
  228. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/manifests/init.pp +0 -0
  229. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/metadata.json +0 -0
  230. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/data/empty.yaml +0 -0
  231. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/hiera.yaml +0 -0
  232. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/manifests/init.pp +0 -0
  233. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/metadata.json +0 -0
  234. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/data/first.json +0 -0
  235. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/hiera.yaml +0 -0
  236. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/manifests/init.pp +0 -0
  237. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/metadata.json +0 -0
  238. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +0 -0
  239. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/manifests/init.pp +0 -0
  240. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/metadata.json +0 -0
  241. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +0 -0
  242. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +0 -0
  243. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/manifests/init.pp +0 -0
  244. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/metadata.json +0 -0
  245. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  246. data/spec/integration/application/apply_spec.rb +88 -2
  247. data/spec/integration/application/lookup_spec.rb +155 -0
  248. data/spec/integration/data_binding_spec.rb +5 -5
  249. data/spec/integration/defaults_spec.rb +13 -0
  250. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  251. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  252. data/spec/integration/test/test_helper_spec.rb +6 -2
  253. data/spec/integration/transaction_spec.rb +74 -0
  254. data/spec/integration/util/execution_spec.rb +8 -0
  255. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  256. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  257. data/spec/lib/puppet_spec/unindent.rb +2 -2
  258. data/spec/unit/application/face_base_spec.rb +16 -0
  259. data/spec/unit/application/lookup_spec.rb +262 -227
  260. data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
  261. data/spec/unit/data_providers/function_data_provider_spec.rb +2 -2
  262. data/spec/unit/data_providers/hiera_data_provider_spec.rb +60 -97
  263. data/spec/unit/defaults_spec.rb +1 -1
  264. data/spec/unit/face/ca_spec.rb +10 -0
  265. data/spec/unit/face/certificate_request_spec.rb +10 -0
  266. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  267. data/spec/unit/face/file_spec.rb +4 -0
  268. data/spec/unit/face/help_spec.rb +17 -0
  269. data/spec/unit/face/key_spec.rb +10 -0
  270. data/spec/unit/face/status_spec.rb +10 -0
  271. data/spec/unit/file_system_spec.rb +143 -6
  272. data/spec/unit/functions/binary_file_spec.rb +1 -1
  273. data/spec/unit/functions/hiera_spec.rb +257 -47
  274. data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
  275. data/spec/unit/functions/lookup_spec.rb +1319 -608
  276. data/spec/unit/functions/new_spec.rb +3 -3
  277. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  278. data/spec/unit/graph/simple_graph_spec.rb +1 -1
  279. data/spec/unit/hiera/scope_spec.rb +4 -4
  280. data/spec/unit/indirector/request_spec.rb +9 -0
  281. data/spec/unit/interface_spec.rb +27 -0
  282. data/spec/unit/man_spec.rb +1 -1
  283. data/spec/unit/module_spec.rb +1 -1
  284. data/spec/unit/module_tool/applications/builder_spec.rb +16 -1
  285. data/spec/unit/module_tool/applications/installer_spec.rb +1 -1
  286. data/spec/unit/module_tool/applications/upgrader_spec.rb +1 -1
  287. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  288. data/spec/unit/module_tool_spec.rb +3 -3
  289. data/spec/unit/network/http/connection_spec.rb +10 -0
  290. data/spec/unit/network/http/webrick_spec.rb +1 -1
  291. data/spec/unit/pops/evaluator/access_ops_spec.rb +2 -2
  292. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +9 -9
  293. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  294. data/spec/unit/pops/lookup/context_spec.rb +45 -16
  295. data/spec/unit/pops/lookup/interpolation_spec.rb +28 -20
  296. data/spec/unit/pops/lookup/lookup_spec.rb +197 -0
  297. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  298. data/spec/unit/pops/parser/lexer2_spec.rb +16 -1
  299. data/spec/unit/pops/parser/parse_site_spec.rb +4 -0
  300. data/spec/unit/pops/serialization/packer_spec.rb +4 -23
  301. data/spec/unit/pops/serialization/serialization_spec.rb +32 -8
  302. data/spec/unit/pops/types/p_object_type_spec.rb +68 -3
  303. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +4 -4
  304. data/spec/unit/pops/types/p_type_set_type_spec.rb +31 -2
  305. data/spec/unit/pops/types/type_acceptor_spec.rb +18 -17
  306. data/spec/unit/pops/types/type_calculator_spec.rb +39 -40
  307. data/spec/unit/pops/types/type_factory_spec.rb +3 -3
  308. data/spec/unit/pops/types/type_formatter_spec.rb +7 -3
  309. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +13 -2
  310. data/spec/unit/pops/types/types_spec.rb +25 -2
  311. data/spec/unit/pops/validator/validator_spec.rb +60 -4
  312. data/spec/unit/provider/nameservice_spec.rb +42 -0
  313. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  314. data/spec/unit/provider/package/pkg_spec.rb +22 -0
  315. data/spec/unit/provider/package/pkgng_spec.rb +12 -0
  316. data/spec/unit/provider/package/rpm_spec.rb +8 -8
  317. data/spec/unit/provider/service/smf_spec.rb +13 -11
  318. data/spec/unit/provider/service/systemd_spec.rb +8 -1
  319. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  320. data/spec/unit/puppet_spec.rb +14 -0
  321. data/spec/unit/resource/catalog_spec.rb +15 -9
  322. data/spec/unit/resource_spec.rb +20 -17
  323. data/spec/unit/semver_spec.rb +14 -0
  324. data/spec/unit/ssl/certificate_authority_spec.rb +12 -1
  325. data/spec/unit/transaction/additional_resource_generator_spec.rb +11 -0
  326. data/spec/unit/type/user_spec.rb +32 -6
  327. data/spec/unit/util/filetype_spec.rb +3 -3
  328. data/spec/unit/util/yaml_spec.rb +1 -1
  329. data/spec/unit/util_spec.rb +10 -2
  330. data/tasks/i18n.rake +20 -0
  331. metadata +2661 -2595
  332. data/lib/puppet/data_providers/lookup_adapter.rb +0 -254
  333. data/lib/puppet/vendor/load_semantic.rb +0 -1
  334. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  335. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  336. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  337. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +0 -60
  338. data/lib/puppet/vendor/semantic/lib/semantic.rb +0 -7
  339. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  340. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  341. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  342. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  343. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  344. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  345. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  346. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  347. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  348. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
@@ -295,8 +295,12 @@ class Checker4_0 < Evaluator::LiteralEvaluator
295
295
 
296
296
  def check_CaseExpression(o)
297
297
  rvalue(o.test)
298
- # There should only be one LiteralDefault case option value
299
- # TODO: Implement this check
298
+ # There can only be one LiteralDefault case option value
299
+ defaults = o.options.values.select {|v| v.is_a?(Model::LiteralDefault) }
300
+ unless defaults.size <= 1
301
+ # Flag the second default as 'unreachable'
302
+ acceptor.accept(Issues::DUPLICATE_DEFAULT, defaults[1], :container => o)
303
+ end
300
304
  end
301
305
 
302
306
  def check_CaseOption(o)
@@ -659,6 +663,12 @@ class Checker4_0 < Evaluator::LiteralEvaluator
659
663
 
660
664
  def check_SelectorExpression(o)
661
665
  rvalue(o.left_expr)
666
+ # There can only be one LiteralDefault case option value
667
+ defaults = o.selectors.select {|v| v.matching_expr.is_a?(Model::LiteralDefault) }
668
+ unless defaults.size <= 1
669
+ # Flag the second default as 'unreachable'
670
+ acceptor.accept(Issues::DUPLICATE_DEFAULT, defaults[1].matching_expr, :container => o)
671
+ end
662
672
  end
663
673
 
664
674
  def check_SelectorEntry(o)
@@ -28,6 +28,7 @@ class ValidatorFactory_4_0 < Factory
28
28
  p[Issues::FUTURE_RESERVED_WORD] = :deprecation
29
29
 
30
30
  p[Issues::DUPLICATE_KEY] = Puppet[:strict] == :off ? :ignore : Puppet[:strict]
31
+ p[Issues::DUPLICATE_DEFAULT] = Puppet[:strict] == :off ? :ignore : Puppet[:strict]
31
32
  p[Issues::NAME_WITH_HYPHEN] = :error
32
33
  p[Issues::EMPTY_RESOURCE_SPECIALIZATION] = :ignore
33
34
  p
@@ -273,7 +273,7 @@ module Validation
273
273
  #
274
274
  class DiagnosticFormatter
275
275
  def format diagnostic
276
- "#{loc(diagnostic)} #{format_severity(diagnostic)}#{format_message(diagnostic)}"
276
+ "#{format_location(diagnostic)} #{format_severity(diagnostic)}#{format_message(diagnostic)}"
277
277
  end
278
278
 
279
279
  def format_message diagnostic
@@ -1,3 +1,4 @@
1
+ module Puppet::Pops
1
2
  # A Visitor performs delegation to a given receiver based on the configuration of the Visitor.
2
3
  # A new visitor is created with a given receiver, a method prefix, min, and max argument counts.
3
4
  # e.g.
@@ -9,7 +10,7 @@
9
10
  # Raises RuntimeError if there are too few or too many arguments, or if the receiver is not
10
11
  # configured to handle a given visiting object.
11
12
  #
12
- class Puppet::Pops::Visitor
13
+ class Visitor
13
14
  attr_reader :receiver, :message, :min_args, :max_args, :cache
14
15
  def initialize(receiver, message, min_args=0, max_args=nil)
15
16
  raise ArgumentError.new("min_args must be >= 0") if min_args < 0
@@ -27,8 +28,7 @@ class Puppet::Pops::Visitor
27
28
  visit_this(@receiver, thing, args)
28
29
  end
29
30
 
30
- DOUBLE_COLON = '::'
31
- NO_ARGS = [].freeze
31
+ NO_ARGS = EMPTY_ARRAY
32
32
 
33
33
  # Visit an explicit receiver
34
34
  def visit_this(receiver, thing, args)
@@ -92,3 +92,4 @@ class Puppet::Pops::Visitor
92
92
  end
93
93
 
94
94
  end
95
+ end
data/lib/puppet/pops.rb CHANGED
@@ -10,11 +10,14 @@ module Puppet
10
10
  #
11
11
  # @api public
12
12
  module Pops
13
- EMPTY_HASH = {}.freeze
13
+ EMPTY_HASH = {}.freeze
14
14
  EMPTY_ARRAY = [].freeze
15
15
  EMPTY_STRING = ''.freeze
16
16
 
17
- require 'semantic'
17
+ DOUBLE_COLON = '::'.freeze
18
+ USCORE = '_'.freeze
19
+
20
+ require 'semantic_puppet'
18
21
 
19
22
  require 'puppet/pops/patterns'
20
23
  require 'puppet/pops/utils'
@@ -33,12 +36,6 @@ module Puppet
33
36
  require 'puppet/pops/label_provider'
34
37
  require 'puppet/pops/validation'
35
38
  require 'puppet/pops/issue_reporter'
36
- require 'puppet/pops/lookup'
37
- require 'puppet/pops/lookup/interpolation'
38
- require 'puppet/pops/lookup/invocation'
39
- require 'puppet/pops/lookup/sub_lookup'
40
- require 'puppet/pops/lookup/explainer'
41
-
42
39
  require 'puppet/pops/model/model'
43
40
 
44
41
  require 'puppet/pops/time/timespan'
@@ -47,7 +44,7 @@ module Puppet
47
44
  # (the Types module initializes itself)
48
45
  require 'puppet/pops/types/types'
49
46
  require 'puppet/pops/types/string_converter'
50
- require 'puppet/pops/lookup/context'
47
+ require 'puppet/pops/lookup'
51
48
 
52
49
  require 'puppet/pops/merge_strategy'
53
50
 
@@ -116,7 +116,8 @@ Puppet::Type.type(:mcx).provide :mcxcontent, :parent => Puppet::Provider do
116
116
  dscl 'localhost', '-mcxdelete', ds_path
117
117
  end
118
118
 
119
- tmp = Tempfile.new('puppet_mcx')
119
+ # val being passed in is resource[:content] which should be UTF-8
120
+ tmp = Tempfile.new('puppet_mcx', :encoding => Encoding::UTF_8)
120
121
  begin
121
122
  tmp << val
122
123
  tmp.flush
@@ -288,5 +288,20 @@ class Puppet::Provider::NameService < Puppet::Provider
288
288
  raise Puppet::Error, "Could not set #{param} on #{@resource.class.name}[#{@resource.name}]: #{detail}", detail.backtrace
289
289
  end
290
290
  end
291
+
292
+ # From overriding Puppet::Property#insync? Ruby Etc::getpwnam < 2.1.0 always
293
+ # returns a struct with binary encoded string values, and >= 2.1.0 will return
294
+ # binary encoded strings for values incompatible with current locale charset,
295
+ # or Encoding.default_external if compatible. Compare a "should" value with
296
+ # encoding of "current" value, to avoid unnecessary property syncs and
297
+ # comparison of strings with different encodings. (PUP-6777)
298
+ #
299
+ # return basic string comparison after re-encoding (same as
300
+ # Puppet::Property#property_matches)
301
+ def comments_insync?(current, should)
302
+ # we're only doing comparison here so don't mutate the string
303
+ desired = should[0].to_s.dup
304
+ current == desired.force_encoding(current.encoding)
305
+ end
291
306
  end
292
307
 
@@ -44,7 +44,7 @@ Puppet::Type.type(:package).provide(:appdmg, :parent => Puppet::Provider::Packag
44
44
  def self.installapp(source, name, orig_source)
45
45
  appname = File.basename(source);
46
46
  ditto "--rsrc", source, "/Applications/#{appname}"
47
- File.open("/var/db/.puppet_appdmg_installed_#{name}", "w") do |t|
47
+ Puppet::FileSystem.open("/var/db/.puppet_appdmg_installed_#{name}", nil, "w:UTF-8") do |t|
48
48
  t.print "name: '#{name}'\n"
49
49
  t.print "source: '#{orig_source}'\n"
50
50
  end
@@ -28,7 +28,7 @@ Puppet::Type.type(:package).provide :dnf, :parent => :yum do
28
28
  end
29
29
  end
30
30
 
31
- defaultfor :operatingsystem => :fedora, :operatingsystemmajrelease => ['22', '23', '24']
31
+ defaultfor :operatingsystem => :fedora, :operatingsystemmajrelease => ['22', '23', '24', '25']
32
32
 
33
33
  def self.update_command
34
34
  # In DNF, update is deprecated for upgrade
@@ -23,7 +23,7 @@ Puppet::Type.type(:package).provide :pkg, :parent => Puppet::Provider::Package d
23
23
 
24
24
  confine :osfamily => :solaris
25
25
 
26
- defaultfor :osfamily => :solaris, :kernelrelease => '5.11'
26
+ defaultfor :osfamily => :solaris, :kernelrelease => ['5.11', '5.12']
27
27
 
28
28
  def self.instances
29
29
  pkg(:list, '-Hv').split("\n").map{|l| new(parse_line(l))}
@@ -62,7 +62,7 @@ Puppet::Type.type(:package).provide :pkgdmg, :parent => Puppet::Provider::Packag
62
62
  def self.installpkg(source, name, orig_source)
63
63
  installer "-pkg", source, "-target", "/"
64
64
  # Non-zero exit status will throw an exception.
65
- File.open("/var/db/.puppet_pkgdmg_installed_#{name}", "w") do |t|
65
+ Puppet::FileSystem.open("/var/db/.puppet_pkgdmg_installed_#{name}", nil, "w:UTF-8") do |t|
66
66
  t.print "name: '#{name}'\n"
67
67
  t.print "source: '#{orig_source}'\n"
68
68
  end
@@ -56,7 +56,7 @@ Puppet::Type.type(:package).provide :pkgng, :parent => Puppet::Provider::Package
56
56
 
57
57
  return packages
58
58
  rescue Puppet::ExecutionFailure
59
- nil
59
+ return []
60
60
  end
61
61
  end
62
62
 
@@ -101,7 +101,7 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
101
101
  #NOTE: Prior to a fix for issue 1243, this method potentially returned a cached value
102
102
  #IF YOU CALL THIS METHOD, IT WILL CALL RPM
103
103
  #Use get(:property) to check if cached values are available
104
- cmd = ["-q", @resource[:name], "#{self.class.nosignature}", "#{self.class.nodigest}", "--qf", self.class::NEVRA_FORMAT]
104
+ cmd = ["-q", @resource[:name], "#{self.class.nosignature}", "#{self.class.nodigest}", "--qf", "'#{self.class::NEVRA_FORMAT}'"]
105
105
 
106
106
  begin
107
107
  output = rpm(*cmd)
@@ -131,7 +131,7 @@ Puppet::Type.type(:package).provide :rpm, :source => :rpm, :parent => Puppet::Pr
131
131
  @resource.fail "RPMs must specify a package source"
132
132
  end
133
133
 
134
- cmd = [command(:rpm), "-q", "--qf", self.class::NEVRA_FORMAT, "-p", source]
134
+ cmd = [command(:rpm), "-q", "--qf", "'#{self.class::NEVRA_FORMAT}'", "-p", source]
135
135
  h = self.class.nevra_to_hash(execfail(cmd, Puppet::Error))
136
136
  h[:ensure]
137
137
  end
@@ -80,7 +80,7 @@ Puppet::Type.type(:service).provide :smf, :parent => :base do
80
80
  when :maintenance, :degraded
81
81
  [command(:adm), :clear, @resource[:name]]
82
82
  else
83
- [command(:adm), :enable, "-s", @resource[:name]]
83
+ [command(:adm), :enable, "-rs", @resource[:name]]
84
84
  end
85
85
  end
86
86
 
@@ -135,8 +135,8 @@ Puppet::Type.type(:service).provide :smf, :parent => :base do
135
135
  states = service_states
136
136
  state = states[1] == "-" ? states[0] : states[1]
137
137
  rescue Puppet::ExecutionFailure
138
- info "Could not get status on service #{self.name}"
139
- return :stopped
138
+ debug "Could not get status on service #{self.name} #{$!}"
139
+ return :absent
140
140
  end
141
141
 
142
142
  case state
@@ -22,6 +22,7 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
22
22
  defaultfor :osfamily => :redhat, :operatingsystemmajrelease => "7"
23
23
  defaultfor :osfamily => :redhat, :operatingsystem => :fedora
24
24
  defaultfor :osfamily => :suse
25
+ defaultfor :osfamily => :coreos
25
26
  defaultfor :operatingsystem => :debian, :operatingsystemmajrelease => "8"
26
27
  defaultfor :operatingsystem => :ubuntu, :operatingsystemmajrelease => ["15.04","15.10","16.04","16.10"]
27
28
  defaultfor :operatingsystem => :cumuluslinux, :operatingsystemmajrelease => ["3"]
@@ -29,7 +30,7 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
29
30
  def self.instances
30
31
  i = []
31
32
  output = systemctl('list-unit-files', '--type', 'service', '--full', '--all', '--no-pager')
32
- output.scan(/^(\S+)\s+(disabled|enabled|masked)\s*$/i).each do |m|
33
+ output.scan(/^(\S+)\s+(disabled|enabled|masked|indirect)\s*$/i).each do |m|
33
34
  i << new(:name => m[0])
34
35
  end
35
36
  return i
@@ -82,6 +83,9 @@ Puppet::Type.type(:service).provide :systemd, :parent => :base do
82
83
  # We only return :mask if we're trying to mask the service. This prevents
83
84
  # flapping when simply trying to disable a masked service.
84
85
  return :mask if (@resource[:enable] == :mask) && (output == 'masked')
86
+
87
+ # The indirect state indicates that the unit is not enabled.
88
+ return :false if output == 'indirect'
85
89
  return :true if (code == 0)
86
90
  if (output.empty?) && (code > 0) && (Facter.value(:osfamily).downcase == 'debian')
87
91
  ret = debian_enabled?
@@ -622,6 +622,7 @@ Puppet::Type.type(:user).provide :directoryservice do
622
622
 
623
623
  # This is a simple wrapper method for writing values to a file.
624
624
  def write_to_file(filename, value)
625
+ Puppet.deprecation_warning("Puppet::Type.type(:user).provider(:directoryservice).write_to_file is deprecated and will be removed in Puppet 5.")
625
626
  begin
626
627
  File.open(filename, 'w') { |f| f.write(value)}
627
628
  rescue Errno::EACCES => detail
@@ -12,6 +12,7 @@ Puppet::Type.type(:user).provide :user_role_add, :parent => :useradd, :source =>
12
12
  options :home, :flag => "-d", :method => :dir
13
13
  options :comment, :method => :gecos
14
14
  options :groups, :flag => "-G"
15
+ options :shell, :flag => "-s"
15
16
  options :roles, :flag => "-R"
16
17
  options :auths, :flag => "-A"
17
18
  options :profiles, :flag => "-P"
@@ -26,8 +27,22 @@ Puppet::Type.type(:user).provide :user_role_add, :parent => :useradd, :source =>
26
27
  value !~ /\s/
27
28
  end
28
29
 
30
+ def shell=(value)
31
+ check_valid_shell
32
+ set("shell", value)
33
+ end
34
+
29
35
  has_features :manages_homedir, :allows_duplicates, :manages_solaris_rbac, :manages_passwords, :manages_password_age, :manages_shell
30
36
 
37
+ def check_valid_shell
38
+ unless File.exists?(@resource.should(:shell))
39
+ raise(Puppet::Error, "Shell #{@resource.should(:shell)} must exist")
40
+ end
41
+ unless File.executable?(@resource.should(:shell).to_s)
42
+ raise(Puppet::Error, "Shell #{@resource.should(:shell)} must be executable")
43
+ end
44
+ end
45
+
31
46
  #must override this to hand the keyvalue pairs
32
47
  def add_properties
33
48
  cmd = []
@@ -4,7 +4,7 @@ Puppet::Type.type(:yumrepo).provide(:inifile) do
4
4
  desc <<-EOD
5
5
  Manage yum repo configurations by parsing yum INI configuration files.
6
6
 
7
- ## Fetching instances
7
+ ### Fetching instances
8
8
 
9
9
  When fetching repo instances, directory entries in '/etc/yum/repos.d',
10
10
  '/etc/yum.repos.d', and the directory optionally specified by the reposdir
@@ -12,7 +12,7 @@ Puppet::Type.type(:yumrepo).provide(:inifile) do
12
12
  will be ignored. In addition, all sections in '/etc/yum.conf' aside from
13
13
  'main' will be created as sections.
14
14
 
15
- ## Storing instances
15
+ ### Storing instances
16
16
 
17
17
  When creating a new repository, a new section will be added in the first
18
18
  yum repo directory that exists. The custom directory specified by the
@@ -263,7 +263,10 @@ Puppet::Type.type(:zone).provide(:solaris) do
263
263
 
264
264
  unless Puppet::FileSystem.exist?(sysidcfg)
265
265
  begin
266
- File.open(sysidcfg, "w", 0600) do |f|
266
+ # For compatibility reasons use System encoding for this OS file
267
+ # the manifest string is UTF-8 so this could result in conversion errors
268
+ # which should propagate to users
269
+ Puppet::FileSystem.open(sysidcfg, 0600, "w:#{Encoding.default_external.name}") do |f|
267
270
  f.puts cfg
268
271
  end
269
272
  rescue => detail
@@ -41,7 +41,7 @@ An indirector has five methods, which are mapped into HTTP verbs for the REST in
41
41
  * `find(key)` - get a single value (mapped to GET or POST with a singular endpoint)
42
42
  * `search(key)` - get a list of matching values (mapped to GET with a plural endpoint)
43
43
  * `head(key)` - return true if the key exists (mapped to HEAD)
44
- * `destroy(key)` - remove the key van value (mapped to DELETE)
44
+ * `destroy(key)` - remove the key and value (mapped to DELETE)
45
45
  * `save(instance)` - write the instance to the store, using the instance's name as the key (mapped to PUT)
46
46
 
47
47
  These methods are available via the `indirection` class method on the indirected classes. For example:
@@ -426,8 +426,10 @@ class Puppet::Resource::Catalog < Puppet::Graph::SimpleGraph
426
426
  if resources = data['resources']
427
427
  # TODO: The deserializer needs a loader in order to deserialize types defined using the puppet language.
428
428
  json_deserializer = nil
429
- if Puppet[:rich_data] || result.environment_instance && result.environment_instance.rich_data?
430
- json_deserializer = Puppet::Pops::Serialization::Deserializer.new(Puppet::Pops::Serialization::JSON::Reader.new([]), nil)
429
+ if resources.any? { |res| res.has_key?('ext_parameters') }
430
+ json_deserializer = Puppet::Pops::Serialization::Deserializer.new(
431
+ Puppet::Pops::Serialization::JSON::Reader.new([]),
432
+ Puppet::Pops::Loaders.catalog_loader)
431
433
  end
432
434
  result.add_resource(*resources.collect do |res|
433
435
  Puppet::Resource.from_data_hash(res, json_deserializer)
@@ -536,7 +538,10 @@ class Puppet::Resource::Catalog < Puppet::Graph::SimpleGraph
536
538
 
537
539
  # Store the classes in the classfile.
538
540
  def write_class_file
539
- ::File.open(Puppet[:classfile], "w") do |f|
541
+ # classfile paths may contain UTF-8
542
+ # https://docs.puppet.com/puppet/latest/reference/configuration.html#classfile
543
+ classfile = Puppet.settings.setting(:classfile)
544
+ Puppet::FileSystem.open(classfile.value, classfile.mode.to_i(8), "w:UTF-8") do |f|
540
545
  f.puts classes.join("\n")
541
546
  end
542
547
  rescue => detail
@@ -545,7 +550,10 @@ class Puppet::Resource::Catalog < Puppet::Graph::SimpleGraph
545
550
 
546
551
  # Store the list of resources we manage
547
552
  def write_resource_file
548
- ::File.open(Puppet[:resourcefile], "w") do |f|
553
+ # resourcefile contains resources that may be UTF-8 names
554
+ # https://docs.puppet.com/puppet/latest/reference/configuration.html#resourcefile
555
+ resourcefile = Puppet.settings.setting(:resourcefile)
556
+ Puppet::FileSystem.open(resourcefile.value, resourcefile.mode.to_i(8), "w:UTF-8") do |f|
549
557
  to_print = resources.map do |resource|
550
558
  next unless resource.managed?
551
559
  if resource.name_var
@@ -545,11 +545,11 @@ class Puppet::Resource::Type
545
545
  def create_params_struct
546
546
  arg_types = argument_types
547
547
  type_factory = Puppet::Pops::Types::TypeFactory
548
- members = { type_factory.optional(type_factory.string(nil, NAME)) => type_factory.any }
548
+ members = { type_factory.optional(type_factory.string(NAME)) => type_factory.any }
549
549
 
550
550
  if application?
551
551
  resource_type = type_factory.type_type(type_factory.resource)
552
- members[type_factory.optional(type_factory.string(nil, NODES))] = type_factory.hash_of(type_factory.variant(
552
+ members[type_factory.optional(type_factory.string(NODES))] = type_factory.hash_of(type_factory.variant(
553
553
  resource_type, type_factory.array_of(resource_type)), type_factory.type_type(type_factory.resource('node')))
554
554
  end
555
555
 
@@ -559,7 +559,7 @@ class Puppet::Resource::Type
559
559
  end
560
560
 
561
561
  arguments.each_pair do |name, default|
562
- key_type = type_factory.string(nil, name.to_s)
562
+ key_type = type_factory.string(name.to_s)
563
563
  key_type = type_factory.optional(key_type) unless default.nil?
564
564
 
565
565
  arg_type = arg_types[name]
@@ -1,7 +1,6 @@
1
1
  require 'puppet'
2
2
  require 'puppet/util/tagging'
3
3
  require 'puppet/parameter'
4
- require 'puppet/data_providers'
5
4
 
6
5
  # The simplest resource class. Eventually it will function as the
7
6
  # base class for all resource-like behaviour.
@@ -45,7 +44,7 @@ class Puppet::Resource
45
44
  raise Puppet::Error, 'Unable to deserialize non-Data type parameters unless a deserializer is provided' unless json_deserializer
46
45
  reader = json_deserializer.reader
47
46
  ext_params.each do |param, value|
48
- reader.re_initialize([value])
47
+ reader.re_initialize(value)
49
48
  resource[param] = json_deserializer.read
50
49
  end
51
50
  end
@@ -104,7 +103,7 @@ class Puppet::Resource
104
103
  writer.clear_io
105
104
  json_serializer.write(ext_params[key])
106
105
  writer.finish
107
- ext_params[key] = writer.to_a[0]
106
+ ext_params[key] = writer.to_a
108
107
  end
109
108
  data['ext_parameters'] = ext_params
110
109
  end
@@ -25,7 +25,8 @@ class Puppet::Settings::ConfigFile
25
25
  allowed_section_names << 'main' unless allowed_section_names.include?('main')
26
26
  end
27
27
 
28
- ini = Puppet::Settings::IniFile.parse(StringIO.new(text))
28
+ # in Ruby 1.9.3 strings are not UTF-8 by default, so ensure text is treated properly
29
+ ini = Puppet::Settings::IniFile.parse(StringIO.new(text).set_encoding(Encoding::UTF_8))
29
30
  unique_sections_in(ini, file, allowed_section_names).each do |section_name|
30
31
  section = Section.new(section_name.to_sym)
31
32
  result.with_section(section)
@@ -4,6 +4,12 @@ class Puppet::Settings::DirectorySetting < Puppet::Settings::FileSetting
4
4
  end
5
5
 
6
6
  # @api private
7
+ #
8
+ # @param option [String] Extra file operation mode information to use
9
+ # (defaults to read-only mode 'r')
10
+ # This is the standard mechanism Ruby uses in the IO class, and therefore
11
+ # encoding may be explicitly like fmode : encoding or fmode : "BOM|UTF-*"
12
+ # for example, a:ASCII or w+:UTF-8
7
13
  def open_file(filename, option = 'r', &block)
8
14
  controlled_access do |mode|
9
15
  Puppet::FileSystem.open(filename, mode, option, &block)
@@ -40,7 +40,7 @@ class Puppet::Settings::EnvironmentConf
40
40
  # without interpolation. This is a special case for the default configured
41
41
  # environment returned by the Puppet::Environments::StaticPrivate loader.
42
42
  def self.static_for(environment, environment_timeout = 0, static_catalogs = false, rich_data = false)
43
- Static.new(environment, environment_timeout, static_catalogs, 'none', rich_data)
43
+ Static.new(environment, environment_timeout, static_catalogs, nil, rich_data)
44
44
  end
45
45
 
46
46
  attr_reader :section, :path_to_env, :global_modulepath
@@ -176,7 +176,7 @@ class Puppet::Settings::EnvironmentConf
176
176
  attr_reader :rich_data
177
177
  attr_reader :static_catalogs
178
178
 
179
- def initialize(environment, environment_timeout, static_catalogs, environment_data_provider = 'none', rich_data = false)
179
+ def initialize(environment, environment_timeout, static_catalogs, environment_data_provider = nil, rich_data = false)
180
180
  @environment = environment
181
181
  @environment_timeout = environment_timeout
182
182
  @static_catalogs = static_catalogs
@@ -184,6 +184,10 @@ class Puppet::Settings::EnvironmentConf
184
184
  @rich_data = rich_data
185
185
  end
186
186
 
187
+ def path_to_env
188
+ nil
189
+ end
190
+
187
191
  def manifest
188
192
  @environment.manifest
189
193
  end
@@ -22,6 +22,12 @@ class Puppet::Settings::FileOrDirectorySetting < Puppet::Settings::FileSetting
22
22
  end
23
23
 
24
24
  # @api private
25
+ #
26
+ # @param option [String] Extra file operation mode information to use
27
+ # (defaults to read-only mode 'r')
28
+ # This is the standard mechanism Ruby uses in the IO class, and therefore
29
+ # encoding may be explicitly like fmode : encoding or fmode : "BOM|UTF-*"
30
+ # for example, a:ASCII or w+:UTF-8
25
31
  def open_file(filename, option = 'r', &block)
26
32
  if type == :file
27
33
  super
@@ -185,6 +185,11 @@ class Puppet::Settings::FileSetting < Puppet::Settings::StringSetting
185
185
  end
186
186
 
187
187
  # @api private
188
+ # @param option [String] Extra file operation mode information to use
189
+ # (defaults to read-only mode 'r')
190
+ # This is the standard mechanism Ruby uses in the IO class, and therefore
191
+ # encoding may be explicitly like fmode : encoding or fmode : "BOM|UTF-*"
192
+ # for example, a:ASCII or w+:UTF-8
188
193
  def exclusive_open(option = 'r', &block)
189
194
  controlled_access do |mode|
190
195
  Puppet::FileSystem.exclusive_open(file(), mode, option, &block)
@@ -192,6 +197,11 @@ class Puppet::Settings::FileSetting < Puppet::Settings::StringSetting
192
197
  end
193
198
 
194
199
  # @api private
200
+ # @param option [String] Extra file operation mode information to use
201
+ # (defaults to read-only mode 'r')
202
+ # This is the standard mechanism Ruby uses in the IO class, and therefore
203
+ # encoding may be explicitly like fmode : encoding or fmode : "BOM|UTF-*"
204
+ # for example, a:ASCII or w+:UTF-8
195
205
  def open(option = 'r', &block)
196
206
  controlled_access do |mode|
197
207
  Puppet::FileSystem.open(file, mode, option, &block)
@@ -636,7 +636,7 @@ class Puppet::Settings
636
636
  # because multiple sections could set the same value
637
637
  # and I'm too lazy to only set the metadata once.
638
638
  if @configuration_file
639
- searchpath(nil, preferred_run_mode).reverse.each do |source|
639
+ searchpath(nil, preferred_run_mode).reverse_each do |source|
640
640
  if source.type == :section && section = @configuration_file.sections[source.name]
641
641
  apply_metadata_from_section(section)
642
642
  end
@@ -189,7 +189,7 @@ class Puppet::SSL::CertificateAuthority
189
189
  #
190
190
  # @return [Array<String>]
191
191
  def list(name='*')
192
- list_certificates(name).collect { |c| c.name }
192
+ Puppet::SSL::Certificate.indirection.search(name).collect { |c| c.name }
193
193
  end
194
194
 
195
195
  # Return all the certificate objects as found by the indirector
@@ -205,7 +205,10 @@ class Puppet::SSL::CertificateAuthority
205
205
  # @param name [Array<string>] filter to cerificate names
206
206
  #
207
207
  # @return [Array<Puppet::SSL::Certificate>]
208
+ #
209
+ # @deprecated Use Puppet::SSL::CertificateAuthority#list or Puppet Server Certificate status API
208
210
  def list_certificates(name='*')
211
+ Puppet.deprecation_warning("Puppet::SSL::CertificateAuthority#list_certificates is deprecated. Please use Puppet::SSL::CertificateAuthority#list or the certificate status API to query certificate information. See https://docs.puppet.com/puppet/latest/http_api/http_certificate_status.html")
209
212
  Puppet::SSL::Certificate.indirection.search(name)
210
213
  end
211
214
 
@@ -417,6 +420,11 @@ class Puppet::SSL::CertificateAuthority
417
420
  # of the X509 Store
418
421
  #
419
422
  # @return [OpenSSL::X509::Store]
423
+ #
424
+ # @deprecated Strictly speaking, #x509_store is marked API private, so we
425
+ # don't need to publicly deprecate it. But it marked as deprecated here to
426
+ # avoid the exceedingly small chance that someone comes in and uses it from
427
+ # within this class before it is removed.
420
428
  def x509_store(options = {})
421
429
  if (options[:cache])
422
430
  return @x509store unless @x509store.nil?
@@ -464,7 +472,10 @@ class Puppet::SSL::CertificateAuthority
464
472
  # @param cert [Puppet::SSL::Certificate] the certificate to check validity of
465
473
  #
466
474
  # @return [Boolean] true if signed, false if unsigned or revoked
475
+ #
476
+ # @deprecated use Puppet::SSL::CertificateAuthority#verify or Puppet Server certificate status API
467
477
  def certificate_is_alive?(cert)
478
+ Puppet.deprecation_warning("Puppet::SSL::CertificateAuthority#certificate_is_alive? is deprecated. Please use Puppet::SSL::CertificateAuthority#verify or the certificate status API to query certificate information. See https://docs.puppet.com/puppet/latest/http_api/http_certificate_status.html")
468
479
  x509_store(:cache => true).verify(cert.content)
469
480
  end
470
481
 
@@ -483,7 +494,7 @@ class Puppet::SSL::CertificateAuthority
483
494
  unless cert = Puppet::SSL::Certificate.indirection.find(name)
484
495
  raise ArgumentError, "Could not find a certificate for #{name}"
485
496
  end
486
- store = x509_store
497
+ store = create_x509_store
487
498
 
488
499
  raise CertificateVerificationError.new(store.error), store.error_string unless store.verify(cert.content)
489
500
  end
@@ -227,7 +227,29 @@ ERROR_STRING
227
227
  # Generate all necessary parts of our ssl host.
228
228
  def generate
229
229
  generate_key unless key
230
- generate_certificate_request unless certificate_request
230
+ # ask indirector to find any existing requests and download them
231
+ existing_request = certificate_request
232
+
233
+ # if CSR downloaded from master, but the local keypair was just generated and
234
+ # does not match the public key in the CSR, fail hard
235
+ if !existing_request.nil? &&
236
+ (key.content.public_key.to_s != existing_request.content.public_key.to_s)
237
+
238
+ raise Puppet::Error, <<ERROR_STRING
239
+ The CSR retrieved from the master does not match the agent's public key.
240
+ CSR fingerprint: #{existing_request.fingerprint}
241
+ CSR public key: #{existing_request.content.public_key.to_text}
242
+ Agent public key: #{key.content.public_key.to_text}
243
+ To fix this, remove the CSR from both the master and the agent and then start a puppet run, which will automatically regenerate a CSR.
244
+ On the master:
245
+ puppet cert clean #{Puppet[:certname]}
246
+ On the agent:
247
+ 1a. On most platforms: find #{Puppet[:ssldir]} -name #{Puppet[:certname]}.pem -delete
248
+ 1b. On Windows: del "#{Puppet[:certdir].gsub('/', '\\')}\\#{Puppet[:certname]}.pem" /f
249
+ 2. puppet agent -t
250
+ ERROR_STRING
251
+ end
252
+ generate_certificate_request unless existing_request
231
253
 
232
254
  # If we can get a CA instance, then we're a valid CA, and we
233
255
  # should use it to sign our request; else, just try to read
@@ -79,6 +79,13 @@ class Puppet::Transaction::AdditionalResourceGenerator
79
79
 
80
80
  def contain_generated_resources_in(resource, made)
81
81
  sentinel = Puppet::Type.type(:whit).new(:name => "completed_#{resource.title}", :catalog => resource.catalog)
82
+ # Tag the completed whit with all of the tags of the generating resource
83
+ # except the type name to allow event propogation to succeed beyond the whit
84
+ # "boundary" when filtering resources with tags. We include auto-generated
85
+ # tags such as the type name to support implicit filtering as well as
86
+ # explicit. Note that resource#tags returns a duplicate of the resource's
87
+ # tags.
88
+ sentinel.tag(*resource.tags)
82
89
  priority = @prioritizer.generate_priority_contained_in(resource, sentinel)
83
90
  @relationship_graph.add_vertex(sentinel, priority)
84
91