puppet 6.17.0-x86-mingw32 → 6.21.0-x86-mingw32

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 (401) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +38 -34
  5. data/README.md +1 -2
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent/locker.rb +0 -7
  8. data/lib/puppet/application.rb +10 -6
  9. data/lib/puppet/application/agent.rb +9 -3
  10. data/lib/puppet/application/apply.rb +20 -21
  11. data/lib/puppet/application/device.rb +1 -0
  12. data/lib/puppet/application/doc.rb +1 -1
  13. data/lib/puppet/application/filebucket.rb +2 -2
  14. data/lib/puppet/application/lookup.rb +16 -4
  15. data/lib/puppet/application/script.rb +1 -0
  16. data/lib/puppet/application_support.rb +7 -0
  17. data/lib/puppet/configurer.rb +50 -8
  18. data/lib/puppet/configurer/downloader.rb +31 -10
  19. data/lib/puppet/confine.rb +1 -1
  20. data/lib/puppet/confine/any.rb +1 -1
  21. data/lib/puppet/defaults.rb +88 -38
  22. data/lib/puppet/environments.rb +84 -59
  23. data/lib/puppet/face/catalog.rb +1 -1
  24. data/lib/puppet/face/config.rb +56 -16
  25. data/lib/puppet/face/epp.rb +12 -2
  26. data/lib/puppet/face/facts.rb +60 -0
  27. data/lib/puppet/face/node.rb +3 -3
  28. data/lib/puppet/face/node/clean.rb +2 -2
  29. data/lib/puppet/face/status.rb +1 -1
  30. data/lib/puppet/feature/base.rb +1 -1
  31. data/lib/puppet/ffi/posix.rb +10 -0
  32. data/lib/puppet/ffi/posix/constants.rb +14 -0
  33. data/lib/puppet/ffi/posix/functions.rb +24 -0
  34. data/lib/puppet/file_bucket/dipper.rb +1 -1
  35. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  36. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  37. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  38. data/lib/puppet/file_system/file_impl.rb +3 -3
  39. data/lib/puppet/functions/epp.rb +1 -0
  40. data/lib/puppet/functions/inline_epp.rb +1 -0
  41. data/lib/puppet/functions/lstrip.rb +4 -4
  42. data/lib/puppet/functions/new.rb +8 -3
  43. data/lib/puppet/functions/reverse_each.rb +1 -1
  44. data/lib/puppet/functions/rstrip.rb +4 -4
  45. data/lib/puppet/functions/step.rb +1 -1
  46. data/lib/puppet/functions/strip.rb +4 -4
  47. data/lib/puppet/gettext/config.rb +5 -5
  48. data/lib/puppet/gettext/module_translations.rb +4 -4
  49. data/lib/puppet/http.rb +1 -0
  50. data/lib/puppet/http/client.rb +1 -1
  51. data/lib/puppet/http/resolver.rb +5 -8
  52. data/lib/puppet/http/resolver/server_list.rb +18 -36
  53. data/lib/puppet/http/resolver/settings.rb +4 -4
  54. data/lib/puppet/http/resolver/srv.rb +5 -5
  55. data/lib/puppet/http/service.rb +3 -1
  56. data/lib/puppet/http/service/compiler.rb +1 -1
  57. data/lib/puppet/http/service/file_server.rb +1 -1
  58. data/lib/puppet/http/service/puppetserver.rb +39 -0
  59. data/lib/puppet/http/session.rb +5 -4
  60. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  61. data/lib/puppet/indirector/exec.rb +1 -1
  62. data/lib/puppet/indirector/fact_search.rb +60 -0
  63. data/lib/puppet/indirector/facts/facter.rb +3 -3
  64. data/lib/puppet/indirector/facts/json.rb +27 -0
  65. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  66. data/lib/puppet/indirector/file_metadata/http.rb +1 -0
  67. data/lib/puppet/indirector/hiera.rb +4 -0
  68. data/lib/puppet/indirector/indirection.rb +1 -1
  69. data/lib/puppet/indirector/json.rb +5 -1
  70. data/lib/puppet/indirector/msgpack.rb +1 -1
  71. data/lib/puppet/indirector/node/json.rb +8 -0
  72. data/lib/puppet/indirector/report/json.rb +34 -0
  73. data/lib/puppet/indirector/report/processor.rb +2 -2
  74. data/lib/puppet/indirector/request.rb +4 -4
  75. data/lib/puppet/indirector/yaml.rb +1 -1
  76. data/lib/puppet/module.rb +1 -2
  77. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  78. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  79. data/lib/puppet/network/format_support.rb +2 -2
  80. data/lib/puppet/network/formats.rb +2 -1
  81. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  82. data/lib/puppet/network/http/route.rb +2 -2
  83. data/lib/puppet/node/environment.rb +12 -5
  84. data/lib/puppet/node/facts.rb +17 -0
  85. data/lib/puppet/pal/pal_impl.rb +90 -13
  86. data/lib/puppet/parameter.rb +1 -1
  87. data/lib/puppet/parser/ast/leaf.rb +3 -2
  88. data/lib/puppet/parser/functions.rb +21 -17
  89. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  90. data/lib/puppet/parser/templatewrapper.rb +1 -1
  91. data/lib/puppet/parser/type_loader.rb +2 -2
  92. data/lib/puppet/pops/adaptable.rb +7 -13
  93. data/lib/puppet/pops/adapters.rb +8 -4
  94. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  95. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  96. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  97. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  98. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  99. data/lib/puppet/pops/loaders.rb +18 -11
  100. data/lib/puppet/pops/lookup/context.rb +1 -1
  101. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  102. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  103. data/lib/puppet/pops/types/iterable.rb +34 -8
  104. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  105. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  106. data/lib/puppet/pops/validation/checker4_0.rb +19 -15
  107. data/lib/puppet/property/list.rb +1 -1
  108. data/lib/puppet/provider/file/windows.rb +1 -1
  109. data/lib/puppet/provider/group/groupadd.rb +13 -8
  110. data/lib/puppet/provider/package/apt.rb +67 -1
  111. data/lib/puppet/provider/package/aptitude.rb +6 -0
  112. data/lib/puppet/provider/package/dpkg.rb +1 -1
  113. data/lib/puppet/provider/package/gem.rb +4 -2
  114. data/lib/puppet/provider/package/pip2.rb +17 -0
  115. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  116. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  117. data/lib/puppet/provider/package/yum.rb +1 -0
  118. data/lib/puppet/provider/package/zypper.rb +3 -0
  119. data/lib/puppet/provider/service/debian.rb +2 -0
  120. data/lib/puppet/provider/user/aix.rb +3 -3
  121. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  122. data/lib/puppet/provider/user/useradd.rb +55 -8
  123. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  124. data/lib/puppet/reference/configuration.rb +6 -5
  125. data/lib/puppet/resource/type.rb +2 -1
  126. data/lib/puppet/rest/route.rb +2 -2
  127. data/lib/puppet/settings.rb +63 -21
  128. data/lib/puppet/settings/alias_setting.rb +37 -0
  129. data/lib/puppet/settings/base_setting.rb +26 -2
  130. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  131. data/lib/puppet/test/test_helper.rb +10 -3
  132. data/lib/puppet/transaction.rb +2 -2
  133. data/lib/puppet/transaction/persistence.rb +1 -1
  134. data/lib/puppet/transaction/report.rb +12 -8
  135. data/lib/puppet/trusted_external.rb +2 -2
  136. data/lib/puppet/type.rb +4 -3
  137. data/lib/puppet/type/file.rb +2 -2
  138. data/lib/puppet/type/file/source.rb +28 -8
  139. data/lib/puppet/type/filebucket.rb +1 -1
  140. data/lib/puppet/type/notify.rb +2 -2
  141. data/lib/puppet/type/package.rb +3 -3
  142. data/lib/puppet/type/service.rb +4 -0
  143. data/lib/puppet/type/user.rb +18 -3
  144. data/lib/puppet/util.rb +26 -12
  145. data/lib/puppet/util/autoload.rb +10 -15
  146. data/lib/puppet/util/character_encoding.rb +9 -5
  147. data/lib/puppet/util/connection.rb +8 -8
  148. data/lib/puppet/util/execution.rb +2 -2
  149. data/lib/puppet/util/fact_dif.rb +62 -0
  150. data/lib/puppet/util/posix.rb +54 -5
  151. data/lib/puppet/util/rubygems.rb +5 -1
  152. data/lib/puppet/util/run_mode.rb +5 -1
  153. data/lib/puppet/util/windows.rb +1 -0
  154. data/lib/puppet/util/windows/api_types.rb +15 -1
  155. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  156. data/lib/puppet/util/windows/security.rb +4 -4
  157. data/lib/puppet/util/windows/service.rb +1 -1
  158. data/lib/puppet/util/windows/user.rb +219 -0
  159. data/lib/puppet/version.rb +1 -1
  160. data/locales/puppet.pot +342 -312
  161. data/man/man5/puppet.conf.5 +53 -18
  162. data/man/man8/puppet-agent.8 +7 -4
  163. data/man/man8/puppet-apply.8 +2 -2
  164. data/man/man8/puppet-catalog.8 +1 -1
  165. data/man/man8/puppet-config.8 +6 -6
  166. data/man/man8/puppet-describe.8 +1 -1
  167. data/man/man8/puppet-device.8 +2 -2
  168. data/man/man8/puppet-doc.8 +1 -1
  169. data/man/man8/puppet-epp.8 +1 -1
  170. data/man/man8/puppet-facts.8 +32 -1
  171. data/man/man8/puppet-filebucket.8 +3 -3
  172. data/man/man8/puppet-generate.8 +1 -1
  173. data/man/man8/puppet-help.8 +1 -1
  174. data/man/man8/puppet-key.8 +1 -1
  175. data/man/man8/puppet-lookup.8 +2 -2
  176. data/man/man8/puppet-man.8 +1 -1
  177. data/man/man8/puppet-module.8 +1 -1
  178. data/man/man8/puppet-node.8 +7 -4
  179. data/man/man8/puppet-parser.8 +1 -1
  180. data/man/man8/puppet-plugin.8 +1 -1
  181. data/man/man8/puppet-report.8 +4 -1
  182. data/man/man8/puppet-resource.8 +1 -1
  183. data/man/man8/puppet-script.8 +2 -2
  184. data/man/man8/puppet-ssl.8 +1 -1
  185. data/man/man8/puppet-status.8 +2 -2
  186. data/man/man8/puppet.8 +2 -2
  187. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  188. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  189. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  190. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  191. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  192. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  193. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  194. data/spec/integration/application/agent_spec.rb +208 -55
  195. data/spec/integration/application/apply_spec.rb +168 -149
  196. data/spec/integration/application/doc_spec.rb +16 -6
  197. data/spec/integration/application/filebucket_spec.rb +70 -21
  198. data/spec/integration/application/help_spec.rb +42 -0
  199. data/spec/integration/application/lookup_spec.rb +13 -0
  200. data/spec/integration/application/module_spec.rb +68 -0
  201. data/spec/integration/application/plugin_spec.rb +53 -3
  202. data/spec/integration/configurer_spec.rb +14 -0
  203. data/spec/integration/data_binding_spec.rb +82 -0
  204. data/spec/integration/defaults_spec.rb +19 -1
  205. data/spec/integration/directory_environments_spec.rb +17 -17
  206. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  207. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  208. data/spec/integration/node/environment_spec.rb +1 -1
  209. data/spec/integration/resource/type_collection_spec.rb +2 -6
  210. data/spec/integration/transaction_spec.rb +4 -9
  211. data/spec/integration/util/execution_spec.rb +22 -0
  212. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  213. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  214. data/spec/integration/util/windows/process_spec.rb +26 -32
  215. data/spec/integration/util/windows/registry_spec.rb +0 -10
  216. data/spec/integration/util/windows/user_spec.rb +7 -0
  217. data/spec/integration/util_spec.rb +7 -33
  218. data/spec/lib/puppet_spec/matchers.rb +0 -80
  219. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  220. data/spec/lib/puppet_spec/settings.rb +6 -1
  221. data/spec/shared_contexts/types_setup.rb +2 -0
  222. data/spec/spec_helper.rb +1 -4
  223. data/spec/unit/agent_spec.rb +8 -6
  224. data/spec/unit/application/agent_spec.rb +3 -5
  225. data/spec/unit/application/config_spec.rb +224 -4
  226. data/spec/unit/application/doc_spec.rb +2 -2
  227. data/spec/unit/application/face_base_spec.rb +6 -4
  228. data/spec/unit/application/facts_spec.rb +41 -10
  229. data/spec/unit/application/filebucket_spec.rb +0 -2
  230. data/spec/unit/application/man_spec.rb +52 -0
  231. data/spec/unit/application/resource_spec.rb +3 -1
  232. data/spec/unit/application/ssl_spec.rb +15 -2
  233. data/spec/unit/application_spec.rb +60 -13
  234. data/spec/unit/configurer/downloader_spec.rb +10 -0
  235. data/spec/unit/configurer_spec.rb +86 -37
  236. data/spec/unit/confine/feature_spec.rb +1 -1
  237. data/spec/unit/confine_spec.rb +10 -3
  238. data/spec/unit/defaults_spec.rb +20 -1
  239. data/spec/unit/environments_spec.rb +176 -32
  240. data/spec/unit/face/config_spec.rb +65 -12
  241. data/spec/unit/face/node_spec.rb +2 -13
  242. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  243. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  244. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  245. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  246. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  247. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  248. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  249. data/spec/unit/file_system_spec.rb +1 -2
  250. data/spec/unit/forge/module_release_spec.rb +2 -7
  251. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  252. data/spec/unit/http/client_spec.rb +0 -1
  253. data/spec/unit/http/resolver_spec.rb +24 -5
  254. data/spec/unit/http/service/ca_spec.rb +2 -3
  255. data/spec/unit/http/service/compiler_spec.rb +51 -3
  256. data/spec/unit/http/service/file_server_spec.rb +2 -3
  257. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  258. data/spec/unit/http/service/report_spec.rb +2 -3
  259. data/spec/unit/http/service_spec.rb +1 -2
  260. data/spec/unit/http/session_spec.rb +8 -21
  261. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  262. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  263. data/spec/unit/indirector/face_spec.rb +0 -1
  264. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  265. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  266. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  267. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  268. data/spec/unit/indirector/indirection_spec.rb +8 -12
  269. data/spec/unit/indirector/json_spec.rb +8 -8
  270. data/spec/unit/indirector/key/file_spec.rb +0 -1
  271. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  272. data/spec/unit/indirector/node/json_spec.rb +33 -0
  273. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  274. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  275. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  276. data/spec/unit/indirector/request_spec.rb +4 -4
  277. data/spec/unit/indirector/rest_spec.rb +1 -1
  278. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  279. data/spec/unit/indirector/yaml_spec.rb +7 -7
  280. data/spec/unit/indirector_spec.rb +2 -2
  281. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  282. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  283. data/spec/unit/network/authconfig_spec.rb +0 -3
  284. data/spec/unit/network/format_support_spec.rb +3 -2
  285. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  286. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  287. data/spec/unit/network/http/handler_spec.rb +0 -5
  288. data/spec/unit/node/environment_spec.rb +18 -1
  289. data/spec/unit/parser/compiler_spec.rb +3 -19
  290. data/spec/unit/parser/resource_spec.rb +14 -8
  291. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  292. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  293. data/spec/unit/pops/loaders/loaders_spec.rb +70 -0
  294. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  295. data/spec/unit/property_spec.rb +1 -0
  296. data/spec/unit/provider/exec_spec.rb +4 -3
  297. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  298. data/spec/unit/provider/nameservice_spec.rb +66 -65
  299. data/spec/unit/provider/package/apt_spec.rb +85 -3
  300. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  301. data/spec/unit/provider/package/base_spec.rb +6 -5
  302. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  303. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  304. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  305. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  306. data/spec/unit/provider/package/pip_spec.rb +6 -11
  307. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  308. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  309. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  310. data/spec/unit/provider/package/yum_spec.rb +31 -0
  311. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  312. data/spec/unit/provider/service/base_spec.rb +2 -4
  313. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  314. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  315. data/spec/unit/provider/service/debian_spec.rb +3 -5
  316. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  317. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  318. data/spec/unit/provider/service/init_spec.rb +45 -5
  319. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  320. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  321. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  322. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  323. data/spec/unit/provider/service/runit_spec.rb +2 -1
  324. data/spec/unit/provider/service/smf_spec.rb +1 -1
  325. data/spec/unit/provider/service/src_spec.rb +3 -5
  326. data/spec/unit/provider/service/systemd_spec.rb +3 -6
  327. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  328. data/spec/unit/provider/service/windows_spec.rb +28 -0
  329. data/spec/unit/provider/user/aix_spec.rb +5 -0
  330. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  331. data/spec/unit/provider/user/pw_spec.rb +2 -0
  332. data/spec/unit/provider/user/useradd_spec.rb +56 -3
  333. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  334. data/spec/unit/provider_spec.rb +8 -10
  335. data/spec/unit/puppet_pal_2pec.rb +40 -0
  336. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  337. data/spec/unit/reports/store_spec.rb +17 -13
  338. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  339. data/spec/unit/resource/type_spec.rb +1 -1
  340. data/spec/unit/resource_spec.rb +11 -10
  341. data/spec/unit/rest/route_spec.rb +4 -4
  342. data/spec/unit/settings_spec.rb +576 -239
  343. data/spec/unit/ssl/base_spec.rb +0 -1
  344. data/spec/unit/ssl/host_spec.rb +0 -5
  345. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  346. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  347. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  348. data/spec/unit/transaction/persistence_spec.rb +15 -0
  349. data/spec/unit/transaction/report_spec.rb +2 -0
  350. data/spec/unit/transaction_spec.rb +13 -4
  351. data/spec/unit/type/file/content_spec.rb +0 -1
  352. data/spec/unit/type/file/selinux_spec.rb +0 -2
  353. data/spec/unit/type/file/source_spec.rb +1 -1
  354. data/spec/unit/type/file_spec.rb +0 -6
  355. data/spec/unit/type/filebucket_spec.rb +1 -1
  356. data/spec/unit/type/group_spec.rb +13 -6
  357. data/spec/unit/type/resources_spec.rb +7 -7
  358. data/spec/unit/type/service_spec.rb +36 -3
  359. data/spec/unit/type/tidy_spec.rb +0 -1
  360. data/spec/unit/type/user_spec.rb +31 -2
  361. data/spec/unit/type_spec.rb +2 -2
  362. data/spec/unit/util/at_fork_spec.rb +2 -2
  363. data/spec/unit/util/autoload_spec.rb +5 -1
  364. data/spec/unit/util/backups_spec.rb +1 -2
  365. data/spec/unit/util/character_encoding_spec.rb +4 -4
  366. data/spec/unit/util/command_line_spec.rb +11 -6
  367. data/spec/unit/util/execution_spec.rb +15 -11
  368. data/spec/unit/util/inifile_spec.rb +6 -14
  369. data/spec/unit/util/log_spec.rb +8 -7
  370. data/spec/unit/util/logging_spec.rb +3 -3
  371. data/spec/unit/util/posix_spec.rb +363 -15
  372. data/spec/unit/util/rubygems_spec.rb +2 -2
  373. data/spec/unit/util/run_mode_spec.rb +6 -6
  374. data/spec/unit/util/selinux_spec.rb +76 -52
  375. data/spec/unit/util/storage_spec.rb +3 -1
  376. data/spec/unit/util/suidmanager_spec.rb +44 -41
  377. data/spec/unit/util_spec.rb +13 -6
  378. metadata +49 -50
  379. data/spec/integration/faces/config_spec.rb +0 -91
  380. data/spec/integration/faces/documentation_spec.rb +0 -57
  381. data/spec/integration/file_bucket/file_spec.rb +0 -50
  382. data/spec/integration/file_serving/content_spec.rb +0 -7
  383. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  384. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  385. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  386. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  387. data/spec/integration/module_tool/forge_spec.rb +0 -51
  388. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  389. data/spec/integration/provider/service/init_spec.rb +0 -48
  390. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  391. data/spec/integration/provider/service/windows_spec.rb +0 -50
  392. data/spec/integration/reference/providers_spec.rb +0 -21
  393. data/spec/integration/reports_spec.rb +0 -13
  394. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  395. data/spec/integration/ssl/host_spec.rb +0 -72
  396. data/spec/integration/ssl/key_spec.rb +0 -99
  397. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  398. data/spec/unit/face/catalog_spec.rb +0 -6
  399. data/spec/unit/face/man_spec.rb +0 -25
  400. data/spec/unit/face/module_spec.rb +0 -3
  401. data/spec/unit/man_spec.rb +0 -31
@@ -22,7 +22,7 @@ class PMetaType < PAnyType
22
22
  end
23
23
 
24
24
  def instance?(o, guard = nil)
25
- assignable?(TypeCalculator.infer(o), guard)
25
+ raise NotImplementedError, "Subclass of PMetaType should implement 'instance?'"
26
26
  end
27
27
 
28
28
  # Called from the TypeParser once it has found a type using the Loader. The TypeParser will
@@ -349,6 +349,10 @@ class PTypeSetType < PMetaType
349
349
  self.class == o.class && @name_authority == o.name_authority && @name == o.name && @version == o.version
350
350
  end
351
351
 
352
+ def instance?(o, guard = nil)
353
+ o.is_a?(PTypeSetType)
354
+ end
355
+
352
356
  DEFAULT = self.new({
353
357
  KEY_NAME => 'DefaultTypeSet',
354
358
  KEY_NAME_AUTHORITY => Pcore::RUNTIME_NAME_AUTHORITY,
@@ -595,36 +595,40 @@ class Checker4_0 < Evaluator::LiteralEvaluator
595
595
  # @api private
596
596
  class Puppet::Util::FileNamespaceAdapter < Puppet::Pops::Adaptable::Adapter
597
597
  attr_accessor :file_to_namespace
598
+
599
+ def self.create_adapter(env)
600
+ adapter = super(env)
601
+ adapter.file_to_namespace = {}
602
+ adapter
603
+ end
598
604
  end
599
605
 
600
606
  def namespace_for_file(file)
601
607
  env = Puppet.lookup(:current_environment)
602
608
  return NO_NAMESPACE if env.nil?
603
609
 
604
- Puppet::Util::FileNamespaceAdapter.adapt(env) do |adapter|
605
- adapter.file_to_namespace ||= {}
610
+ adapter = Puppet::Util::FileNamespaceAdapter.adapt(env)
606
611
 
607
- file_namespace = adapter.file_to_namespace[file]
608
- return file_namespace unless file_namespace.nil? # No cache entry, so we do the calculation
612
+ file_namespace = adapter.file_to_namespace[file]
613
+ return file_namespace unless file_namespace.nil? # No cache entry, so we do the calculation
609
614
 
610
- path = Pathname.new(file)
615
+ path = Pathname.new(file)
611
616
 
612
- return adapter.file_to_namespace[file] = NO_NAMESPACE if path.extname != ".pp"
617
+ return adapter.file_to_namespace[file] = NO_NAMESPACE if path.extname != ".pp"
613
618
 
614
- path = path.expand_path
619
+ path = path.expand_path
615
620
 
616
- return adapter.file_to_namespace[file] = NO_NAMESPACE if initial_manifest?(path, env.manifest)
621
+ return adapter.file_to_namespace[file] = NO_NAMESPACE if initial_manifest?(path, env.manifest)
617
622
 
618
- #All auto-loaded files from modules come from a module search path dir
619
- relative_path = get_module_relative_path(path, env.full_modulepath)
623
+ #All auto-loaded files from modules come from a module search path dir
624
+ relative_path = get_module_relative_path(path, env.full_modulepath)
620
625
 
621
- return adapter.file_to_namespace[file] = NO_NAMESPACE if relative_path == NO_PATH
626
+ return adapter.file_to_namespace[file] = NO_NAMESPACE if relative_path == NO_PATH
622
627
 
623
- #If a file comes from a module, but isn't in the right place, always error
624
- names = dir_to_names(relative_path)
628
+ #If a file comes from a module, but isn't in the right place, always error
629
+ names = dir_to_names(relative_path)
625
630
 
626
- return adapter.file_to_namespace[file] = (names == BAD_MODULE_FILE ? BAD_MODULE_FILE : names.join("::").freeze)
627
- end
631
+ return adapter.file_to_namespace[file] = (names == BAD_MODULE_FILE ? BAD_MODULE_FILE : names.join("::").freeze)
628
632
  end
629
633
 
630
634
  def initial_manifest?(path, manifest_setting)
@@ -47,7 +47,7 @@ module Puppet
47
47
  #ok, some 'convention' if the list property is named groups, provider should implement a groups method
48
48
  tmp = provider.send(name) if provider
49
49
  if tmp && tmp != :absent
50
- return tmp.split(delimiter)
50
+ return tmp.instance_of?(Array) ? tmp : tmp.split(delimiter)
51
51
  else
52
52
  return :absent
53
53
  end
@@ -126,7 +126,7 @@ Puppet::Type.type(:file).provide :windows do
126
126
  # If the SYSTEM account does _not_ have FullControl in this scenario, we should
127
127
  # force the resource out of sync no matter what.
128
128
  #TRANSLATORS 'SYSTEM' is a Windows name and should not be translated
129
- Puppet.debug _("%{resource_name}: %{mode_part_type} set to SYSTEM. SYSTEM permissions cannot be set below FullControl ('7')") % { resource_name: resource[:name], mode_part_type: mode_part['type']}
129
+ Puppet.debug { _("%{resource_name}: %{mode_part_type} set to SYSTEM. SYSTEM permissions cannot be set below FullControl ('7')") % { resource_name: resource[:name], mode_part_type: mode_part['type']} }
130
130
  return nil
131
131
  end
132
132
  end
@@ -130,16 +130,21 @@ Puppet::Type.type(:group).provide :groupadd, :parent => Puppet::Provider::NameSe
130
130
  private
131
131
 
132
132
  def findgroup(key, value)
133
- group_file = "/etc/group"
133
+ group_file = '/etc/group'
134
134
  group_keys = [:group_name, :password, :gid, :user_list]
135
- index = group_keys.index(key)
136
- @group_content ||= File.read(group_file)
137
- @group_content.each_line do |line|
138
- group = line.split(":")
139
- if group[index] == value
140
- return Hash[group_keys.zip(group)]
135
+
136
+ unless @groups
137
+ unless Puppet::FileSystem.exist?(group_file)
138
+ raise Puppet::Error.new("Forcelocal set for group resource '#{resource[:name]}', but #{group_file} does not exist")
139
+ end
140
+
141
+ @groups = []
142
+ Puppet::FileSystem.each_line(group_file) do |line|
143
+ group = line.chomp.split(':')
144
+ @groups << Hash[group_keys.zip(group)]
141
145
  end
142
146
  end
143
- false
147
+
148
+ @groups.find { |param| param[key] == value } || false
144
149
  end
145
150
  end
@@ -16,6 +16,7 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
16
16
 
17
17
  commands :aptget => "/usr/bin/apt-get"
18
18
  commands :aptcache => "/usr/bin/apt-cache"
19
+ commands :aptmark => "/usr/bin/apt-mark"
19
20
  commands :preseed => "/usr/bin/debconf-set-selections"
20
21
 
21
22
  defaultfor :osfamily => :debian
@@ -30,6 +31,47 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
30
31
  false
31
32
  end
32
33
 
34
+ def self.instances
35
+ packages = super
36
+ manual_marks = aptmark('showmanual').split("\n")
37
+ packages.each do |package|
38
+ package.mark = :manual if manual_marks.include?(package.name)
39
+ end
40
+ packages
41
+ end
42
+
43
+ def query
44
+ hash = super
45
+
46
+ if !%i(absent purged).include?(hash[:ensure]) && aptmark('showmanual', @resource[:name]).strip == @resource[:name]
47
+ hash[:mark] = :manual
48
+ end
49
+
50
+ hash
51
+ end
52
+
53
+ def initialize(value={})
54
+ super(value)
55
+ @property_flush = {}
56
+ end
57
+
58
+ def mark
59
+ @property_flush[:mark]
60
+ end
61
+
62
+ def mark=(value)
63
+ @property_flush[:mark] = value
64
+ end
65
+
66
+ def flush
67
+ # unless we are removing the package mark it if it hasn't already been marked
68
+ if @property_flush
69
+ unless @property_flush[:mark] || [:purge, :absent].include?(resource[:ensure])
70
+ aptmark('manual', resource[:name])
71
+ end
72
+ end
73
+ end
74
+
33
75
  # A derivative of DPKG; this is how most people actually manage
34
76
  # Debian boxes, and the only thing that differs is that it can
35
77
  # install packages from remote sites.
@@ -109,7 +151,13 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
109
151
  end
110
152
 
111
153
  cmd += install_options if @resource[:install_options]
112
- cmd << :install << str
154
+ cmd << :install
155
+
156
+ if source
157
+ cmd << source
158
+ else
159
+ cmd << str
160
+ end
113
161
 
114
162
  self.unhold if self.properties[:mark] == :hold
115
163
  begin
@@ -117,6 +165,18 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
117
165
  ensure
118
166
  self.hold if @resource[:mark] == :hold
119
167
  end
168
+
169
+ # If a source file was specified, we must make sure the expected version was installed from specified file
170
+ if source && !%i(present installed).include?(should)
171
+ is = self.query
172
+ raise Puppet::Error, _("Could not find package %{name}") % { name: self.name } unless is
173
+
174
+ version = is[:ensure]
175
+
176
+ raise Puppet::Error, _("Failed to update to version %{should}, got version %{version} instead") % { should: should, version: version } unless
177
+ insync?(version)
178
+ end
179
+
120
180
  end
121
181
 
122
182
  # What's the latest package version available?
@@ -193,4 +253,10 @@ Puppet::Type.type(:package).provide :apt, :parent => :dpkg, :source => :dpkg do
193
253
  end
194
254
  should_range.include?(is_version)
195
255
  end
256
+
257
+ private
258
+
259
+ def source
260
+ @source ||= @resource[:source]
261
+ end
196
262
  end
@@ -26,4 +26,10 @@ Puppet::Type.type(:package).provide :aptitude, :parent => :apt, :source => :dpkg
26
26
  def purge
27
27
  aptitude '-y', 'purge', @resource[:name]
28
28
  end
29
+
30
+ private
31
+
32
+ def source
33
+ nil
34
+ end
29
35
  end
@@ -74,7 +74,7 @@ Puppet::Type.type(:package).provide :dpkg, :parent => Puppet::Provider::Package
74
74
  elsif ['config-files', 'half-installed', 'unpacked', 'half-configured'].include?(hash[:status])
75
75
  hash[:ensure] = :absent
76
76
  end
77
- hash[:mark] = :hold if hash[:desired] == 'hold'
77
+ hash[:mark] = hash[:desired] == 'hold' ? :hold : :none
78
78
  else
79
79
  Puppet.debug("Failed to match dpkg-query line #{line.inspect}")
80
80
  end
@@ -53,11 +53,13 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package::
53
53
  #
54
54
  # In this case, causing the puppet_gem provider to inherit the parent gem provider's convenience gemcmd() methods, with the wrong path.
55
55
 
56
- def self.execute_gem_command(command, command_options)
56
+ def self.execute_gem_command(command, command_options, custom_environment = {})
57
57
  validate_command(command)
58
58
  cmd = [command] << command_options
59
59
 
60
- execute(cmd, {:failonfail => true, :combine => true, :custom_environment => {"HOME"=>ENV["HOME"]}})
60
+ custom_environment = {'HOME'=>Puppet::Util.get_env('HOME')}.merge(custom_environment)
61
+
62
+ execute(cmd, {:failonfail => true, :combine => true, :custom_environment => custom_environment})
61
63
  end
62
64
 
63
65
  def self.instances(target_command = nil)
@@ -0,0 +1,17 @@
1
+ # Puppet package provider for Python's `pip2` package management frontend.
2
+ # <http://pip.pypa.io/>
3
+
4
+ Puppet::Type.type(:package).provide :pip2,
5
+ :parent => :pip do
6
+
7
+ desc "Python packages via `pip2`.
8
+
9
+ This provider supports the `install_options` attribute, which allows command-line flags to be passed to pip2.
10
+ These options should be specified as an array where each element is either a string or a hash."
11
+
12
+ has_feature :installable, :uninstallable, :upgradeable, :versionable, :install_options, :targetable
13
+
14
+ def self.cmd
15
+ ["pip2"]
16
+ end
17
+ end
@@ -18,4 +18,9 @@ Puppet::Type.type(:package).provide :puppet_gem, :parent => :gem do
18
18
  Puppet.debug("Invalidating rubygems cache after uninstalling gem '#{resource[:name]}'")
19
19
  Puppet::Util::Autoload.gem_source.clear_paths
20
20
  end
21
+
22
+ def self.execute_gem_command(command, command_options, custom_environment = {})
23
+ custom_environment['PKG_CONFIG_PATH'] = '/opt/puppetlabs/puppet/lib/pkgconfig' unless Puppet::Util::Platform.windows?
24
+ super(command, command_options, custom_environment)
25
+ end
21
26
  end
@@ -0,0 +1,180 @@
1
+ unless Puppet::Util::Platform.jruby_fips?
2
+ require 'rubygems/commands/list_command'
3
+ end
4
+ require 'stringio'
5
+ require 'uri'
6
+
7
+ # Ruby gems support.
8
+ Puppet::Type.type(:package).provide :puppetserver_gem, :parent => :gem do
9
+ desc "Puppet Server Ruby Gem support. If a URL is passed via `source`, then
10
+ that URL is appended to the list of remote gem repositories which by default
11
+ contains rubygems.org; To ensure that only the specified source is used also
12
+ pass `--clear-sources` in via `install_options`; if a source is present but
13
+ is not a valid URL, it will be interpreted as the path to a local gem file.
14
+ If source is not present at all, the gem will be installed from the default
15
+ gem repositories."
16
+
17
+ has_feature :versionable, :install_options, :uninstall_options
18
+
19
+ confine :feature => :hocon
20
+ # see SERVER-2578
21
+ confine :fips_enabled => false
22
+
23
+ # Define the default provider package command name, as the parent 'gem' provider is targetable.
24
+ # Required by Puppet::Provider::Package::Targetable::resource_or_provider_command
25
+
26
+ def self.provider_command
27
+ command(:puppetservercmd)
28
+ end
29
+
30
+ # The gem command uses HOME to locate a gemrc file.
31
+ # CommandDefiner in provider.rb will set failonfail, combine, and environment.
32
+
33
+ has_command(:puppetservercmd, '/opt/puppetlabs/bin/puppetserver') do
34
+ environment(HOME: ENV['HOME'])
35
+ end
36
+
37
+ def self.gemlist(options)
38
+ command_options = ['gem', 'list']
39
+
40
+ if options[:local]
41
+ command_options << '--local'
42
+ else
43
+ command_options << '--remote'
44
+ end
45
+
46
+ if options[:source]
47
+ command_options << '--source' << options[:source]
48
+ end
49
+
50
+ if options[:justme]
51
+ gem_regex = '\A' + options[:justme] + '\z'
52
+ command_options << gem_regex
53
+ end
54
+
55
+ if options[:local]
56
+ list = execute_rubygems_list_command(gem_regex)
57
+ else
58
+ begin
59
+ list = puppetservercmd(command_options)
60
+ rescue Puppet::ExecutionFailure => detail
61
+ raise Puppet::Error, _("Could not list gems: %{detail}") % { detail: detail }, detail.backtrace
62
+ end
63
+ end
64
+
65
+ # When `/tmp` is mounted `noexec`, `puppetserver gem list` will output:
66
+ # *** LOCAL GEMS ***
67
+ # causing gemsplit to output:
68
+ # Warning: Could not match *** LOCAL GEMS ***
69
+ gem_list = list
70
+ .lines
71
+ .select { |x| x =~ /^(\S+)\s+\((.+)\)/ }
72
+ .map { |set| gemsplit(set) }
73
+
74
+ if options[:justme]
75
+ return gem_list.shift
76
+ else
77
+ return gem_list
78
+ end
79
+ end
80
+
81
+ def install(useversion = true)
82
+ command_options = ['gem', 'install']
83
+ command_options += install_options if resource[:install_options]
84
+
85
+ command_options << '-v' << resource[:ensure] if (!resource[:ensure].is_a? Symbol) && useversion
86
+
87
+ command_options << '--no-document'
88
+
89
+ if resource[:source]
90
+ begin
91
+ uri = URI.parse(resource[:source])
92
+ rescue => detail
93
+ self.fail Puppet::Error, _("Invalid source '%{uri}': %{detail}") % { uri: uri, detail: detail }, detail
94
+ end
95
+
96
+ case uri.scheme
97
+ when nil
98
+ # no URI scheme => interpret the source as a local file
99
+ command_options << resource[:source]
100
+ when /file/i
101
+ command_options << uri.path
102
+ when 'puppet'
103
+ # we don't support puppet:// URLs (yet)
104
+ raise Puppet::Error.new(_('puppet:// URLs are not supported as gem sources'))
105
+ else
106
+ # interpret it as a gem repository
107
+ command_options << '--source' << "#{resource[:source]}" << resource[:name]
108
+ end
109
+ else
110
+ command_options << resource[:name]
111
+ end
112
+
113
+ output = puppetservercmd(command_options)
114
+ # Apparently, some gem versions don't exit non-0 on failure.
115
+ self.fail _("Could not install: %{output}") % { output: output.chomp } if output.include?('ERROR')
116
+ end
117
+
118
+ def uninstall
119
+ command_options = ['gem', 'uninstall']
120
+ command_options << '--executables' << '--all' << resource[:name]
121
+ command_options += uninstall_options if resource[:uninstall_options]
122
+
123
+ output = puppetservercmd(command_options)
124
+ # Apparently, some gem versions don't exit non-0 on failure.
125
+ self.fail _("Could not uninstall: %{output}") % { output: output.chomp } if output.include?('ERROR')
126
+ end
127
+
128
+ private
129
+
130
+ # The puppetserver gem cli command is very slow, since it starts a JVM.
131
+ #
132
+ # Instead, for the list subcommand (which is executed with every puppet run),
133
+ # use the rubygems library from puppet ruby: setting GEM_HOME and GEM_PATH
134
+ # to the default values, or the values in the puppetserver configuration file.
135
+ #
136
+ # The rubygems library cannot access java platform gems,
137
+ # for example: json (1.8.3 java)
138
+ # but java platform gems should not be managed by this (or any) provider.
139
+
140
+ def self.execute_rubygems_list_command(gem_regex)
141
+ puppetserver_default_gem_home = '/opt/puppetlabs/server/data/puppetserver/jruby-gems'
142
+ puppetserver_default_vendored_jruby_gems = '/opt/puppetlabs/server/data/puppetserver/vendored-jruby-gems'
143
+ puppet_default_vendor_gems = '/opt/puppetlabs/puppet/lib/ruby/vendor_gems'
144
+ puppetserver_default_gem_path = [puppetserver_default_gem_home, puppetserver_default_vendored_jruby_gems, puppet_default_vendor_gems].join(':')
145
+
146
+ pe_puppetserver_conf_file = '/etc/puppetlabs/puppetserver/conf.d/pe-puppet-server.conf'
147
+ os_puppetserver_conf_file = '/etc/puppetlabs/puppetserver/puppetserver.conf'
148
+ puppetserver_conf_file = Facter.value(:pe_server_version) ? pe_puppetserver_conf_file : os_puppetserver_conf_file
149
+ puppetserver_conf = Hocon.load(puppetserver_conf_file)
150
+
151
+ gem_env = {}
152
+ if puppetserver_conf.empty? || puppetserver_conf.key?('jruby-puppet') == false
153
+ gem_env['GEM_HOME'] = puppetserver_default_gem_home
154
+ gem_env['GEM_PATH'] = puppetserver_default_gem_path
155
+ else
156
+ gem_env['GEM_HOME'] = puppetserver_conf['jruby-puppet'].key?('gem-home') ? puppetserver_conf['jruby-puppet']['gem-home'] : puppetserver_default_gem_home
157
+ gem_env['GEM_PATH'] = puppetserver_conf['jruby-puppet'].key?('gem-path') ? puppetserver_conf['jruby-puppet']['gem-path'].join(':') : puppetserver_default_gem_path
158
+ end
159
+ gem_env['GEM_SPEC_CACHE'] = "/tmp/#{$$}"
160
+ Gem.paths = gem_env
161
+
162
+ sio_inn = StringIO.new
163
+ sio_out = StringIO.new
164
+ sio_err = StringIO.new
165
+ stream_ui = Gem::StreamUI.new(sio_inn, sio_out, sio_err, false)
166
+ gem_list_cmd = Gem::Commands::ListCommand.new
167
+ gem_list_cmd.options[:domain] = :local
168
+ gem_list_cmd.options[:args] = [gem_regex] if gem_regex
169
+ gem_list_cmd.ui = stream_ui
170
+ gem_list_cmd.execute
171
+
172
+ # There is no method exclude default gems from the local gem list,
173
+ # for example: psych (default: 2.2.2)
174
+ # but default gems should not be managed by this (or any) provider.
175
+ gem_list = sio_out.string.lines.reject { |gem| gem =~ / \(default\: / }
176
+ gem_list.join("\n")
177
+ ensure
178
+ Gem.clear_paths
179
+ end
180
+ end