puppet 6.20.0-x64-mingw32 → 7.0.0-x64-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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +16 -2
  3. data/Gemfile +0 -2
  4. data/Gemfile.lock +18 -24
  5. data/README.md +1 -1
  6. data/conf/fileserver.conf +5 -10
  7. data/ext/build_defaults.yaml +1 -1
  8. data/ext/osx/file_mapping.yaml +0 -5
  9. data/ext/project_data.yaml +1 -14
  10. data/ext/redhat/puppet.spec.erb +0 -1
  11. data/ext/windows/service/daemon.rb +6 -5
  12. data/install.rb +21 -17
  13. data/lib/puppet.rb +11 -20
  14. data/lib/puppet/application.rb +178 -108
  15. data/lib/puppet/application/agent.rb +0 -1
  16. data/lib/puppet/application/apply.rb +2 -3
  17. data/lib/puppet/application/device.rb +100 -105
  18. data/lib/puppet/application/filebucket.rb +13 -9
  19. data/lib/puppet/application/script.rb +0 -1
  20. data/lib/puppet/application/ssl.rb +1 -1
  21. data/lib/puppet/application_support.rb +0 -7
  22. data/lib/puppet/configurer.rb +30 -45
  23. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  24. data/lib/puppet/defaults.rb +97 -167
  25. data/lib/puppet/environments.rb +59 -58
  26. data/lib/puppet/face/facts.rb +51 -51
  27. data/lib/puppet/face/help.rb +1 -1
  28. data/lib/puppet/face/plugin.rb +5 -8
  29. data/lib/puppet/ffi/windows.rb +12 -0
  30. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  31. data/lib/puppet/ffi/windows/constants.rb +404 -0
  32. data/lib/puppet/ffi/windows/functions.rb +628 -0
  33. data/lib/puppet/ffi/windows/structs.rb +338 -0
  34. data/lib/puppet/file_serving/configuration.rb +0 -5
  35. data/lib/puppet/file_serving/configuration/parser.rb +3 -32
  36. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  37. data/lib/puppet/file_serving/mount.rb +1 -2
  38. data/lib/puppet/forge/repository.rb +0 -1
  39. data/lib/puppet/generate/models/type/type.rb +4 -1
  40. data/lib/puppet/http.rb +22 -13
  41. data/lib/puppet/http/client.rb +164 -114
  42. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  43. data/lib/puppet/http/errors.rb +16 -0
  44. data/lib/puppet/http/external_client.rb +5 -7
  45. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  46. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  47. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  48. data/lib/puppet/http/proxy.rb +137 -0
  49. data/lib/puppet/http/redirector.rb +4 -12
  50. data/lib/puppet/http/resolver.rb +5 -15
  51. data/lib/puppet/http/resolver/server_list.rb +6 -10
  52. data/lib/puppet/http/resolver/settings.rb +4 -7
  53. data/lib/puppet/http/resolver/srv.rb +7 -11
  54. data/lib/puppet/http/response.rb +36 -54
  55. data/lib/puppet/http/response_converter.rb +24 -0
  56. data/lib/puppet/http/response_net_http.rb +42 -0
  57. data/lib/puppet/http/retry_after_handler.rb +4 -13
  58. data/lib/puppet/http/service.rb +12 -26
  59. data/lib/puppet/http/service/ca.rb +11 -22
  60. data/lib/puppet/http/service/compiler.rb +22 -69
  61. data/lib/puppet/http/service/file_server.rb +18 -27
  62. data/lib/puppet/http/service/puppetserver.rb +26 -12
  63. data/lib/puppet/http/service/report.rb +8 -10
  64. data/lib/puppet/http/session.rb +11 -20
  65. data/lib/puppet/{network/http → http}/site.rb +1 -2
  66. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  67. data/lib/puppet/indirector/facts/facter.rb +24 -3
  68. data/lib/puppet/indirector/facts/rest.rb +3 -22
  69. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  70. data/lib/puppet/indirector/file_content/rest.rb +2 -6
  71. data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
  72. data/lib/puppet/indirector/file_server.rb +1 -8
  73. data/lib/puppet/indirector/generic_http.rb +0 -11
  74. data/lib/puppet/indirector/node/rest.rb +2 -4
  75. data/lib/puppet/indirector/report/rest.rb +3 -8
  76. data/lib/puppet/indirector/request.rb +0 -101
  77. data/lib/puppet/indirector/rest.rb +12 -263
  78. data/lib/puppet/module_tool/applications.rb +0 -1
  79. data/lib/puppet/module_tool/applications/installer.rb +2 -48
  80. data/lib/puppet/module_tool/errors/shared.rb +2 -17
  81. data/lib/puppet/network/authconfig.rb +2 -96
  82. data/lib/puppet/network/authorization.rb +13 -35
  83. data/lib/puppet/network/http.rb +3 -3
  84. data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
  85. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  86. data/lib/puppet/network/http/connection.rb +247 -316
  87. data/lib/puppet/network/http/handler.rb +0 -1
  88. data/lib/puppet/network/http_pool.rb +16 -34
  89. data/lib/puppet/node.rb +1 -30
  90. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  91. data/lib/puppet/pal/pal_impl.rb +3 -1
  92. data/lib/puppet/parser/ast/leaf.rb +2 -3
  93. data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
  94. data/lib/puppet/parser/compiler.rb +0 -198
  95. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  96. data/lib/puppet/parser/resource.rb +0 -69
  97. data/lib/puppet/parser/templatewrapper.rb +1 -1
  98. data/lib/puppet/pops/evaluator/deferred_resolver.rb +3 -5
  99. data/lib/puppet/pops/evaluator/evaluator_impl.rb +0 -5
  100. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  101. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  102. data/lib/puppet/pops/issues.rb +0 -5
  103. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  104. data/lib/puppet/pops/model/ast.pp +0 -42
  105. data/lib/puppet/pops/model/ast.rb +0 -290
  106. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  107. data/lib/puppet/pops/model/factory.rb +0 -45
  108. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  109. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  110. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  111. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  112. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  113. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  114. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  115. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
  116. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  117. data/lib/puppet/pops/types/type_parser.rb +0 -4
  118. data/lib/puppet/pops/types/types.rb +0 -1
  119. data/lib/puppet/pops/validation/checker4_0.rb +9 -37
  120. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  121. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
  122. data/lib/puppet/provider.rb +0 -13
  123. data/lib/puppet/provider/nameservice.rb +0 -18
  124. data/lib/puppet/provider/package/apt.rb +0 -4
  125. data/lib/puppet/provider/package/dpkg.rb +0 -10
  126. data/lib/puppet/provider/package/gem.rb +23 -3
  127. data/lib/puppet/provider/package/pip.rb +0 -1
  128. data/lib/puppet/provider/package/pkg.rb +0 -4
  129. data/lib/puppet/provider/package/portage.rb +1 -1
  130. data/lib/puppet/provider/package/puppet_gem.rb +1 -4
  131. data/lib/puppet/provider/service/smf.rb +191 -73
  132. data/lib/puppet/provider/user/aix.rb +2 -2
  133. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  134. data/lib/puppet/reference/configuration.rb +7 -6
  135. data/lib/puppet/reference/indirection.rb +1 -1
  136. data/lib/puppet/resource.rb +1 -89
  137. data/lib/puppet/resource/catalog.rb +1 -14
  138. data/lib/puppet/resource/type.rb +3 -119
  139. data/lib/puppet/resource/type_collection.rb +3 -48
  140. data/lib/puppet/runtime.rb +1 -2
  141. data/lib/puppet/settings.rb +73 -66
  142. data/lib/puppet/settings/integer_setting.rb +17 -0
  143. data/lib/puppet/settings/port_setting.rb +15 -0
  144. data/lib/puppet/settings/priority_setting.rb +5 -4
  145. data/lib/puppet/ssl.rb +10 -6
  146. data/lib/puppet/ssl/base.rb +3 -5
  147. data/lib/puppet/ssl/certificate.rb +0 -6
  148. data/lib/puppet/ssl/certificate_request.rb +1 -12
  149. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  150. data/lib/puppet/ssl/oids.rb +3 -1
  151. data/lib/puppet/ssl/ssl_provider.rb +17 -0
  152. data/lib/puppet/ssl/state_machine.rb +3 -1
  153. data/lib/puppet/ssl/verifier.rb +2 -0
  154. data/lib/puppet/test/test_helper.rb +1 -3
  155. data/lib/puppet/transaction.rb +1 -7
  156. data/lib/puppet/transaction/report.rb +2 -4
  157. data/lib/puppet/type.rb +0 -76
  158. data/lib/puppet/type/file.rb +5 -7
  159. data/lib/puppet/type/file/checksum.rb +1 -1
  160. data/lib/puppet/type/file/source.rb +1 -1
  161. data/lib/puppet/type/filebucket.rb +3 -3
  162. data/lib/puppet/type/package.rb +5 -13
  163. data/lib/puppet/util/autoload.rb +8 -1
  164. data/lib/puppet/util/execution.rb +0 -11
  165. data/lib/puppet/util/http_proxy.rb +2 -215
  166. data/lib/puppet/util/monkey_patches.rb +0 -46
  167. data/lib/puppet/util/posix.rb +5 -54
  168. data/lib/puppet/util/rdoc.rb +0 -7
  169. data/lib/puppet/util/retry_action.rb +1 -1
  170. data/lib/puppet/util/run_mode.rb +9 -1
  171. data/lib/puppet/util/windows.rb +3 -8
  172. data/lib/puppet/util/windows/daemon.rb +360 -0
  173. data/lib/puppet/util/windows/error.rb +1 -0
  174. data/lib/puppet/util/windows/eventlog.rb +4 -9
  175. data/lib/puppet/util/windows/file.rb +8 -242
  176. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  177. data/lib/puppet/util/windows/process.rb +4 -226
  178. data/lib/puppet/util/windows/service.rb +9 -460
  179. data/lib/puppet/util/windows/string.rb +12 -13
  180. data/lib/puppet/util/yaml.rb +0 -22
  181. data/lib/puppet/vendor/require_vendored.rb +0 -1
  182. data/lib/puppet/version.rb +1 -1
  183. data/lib/puppet/x509.rb +5 -1
  184. data/lib/puppet/x509/cert_provider.rb +29 -1
  185. data/locales/puppet.pot +587 -1312
  186. data/man/man5/puppet.conf.5 +39 -99
  187. data/man/man8/puppet-agent.8 +2 -2
  188. data/man/man8/puppet-apply.8 +2 -2
  189. data/man/man8/puppet-catalog.8 +1 -1
  190. data/man/man8/puppet-config.8 +1 -1
  191. data/man/man8/puppet-describe.8 +1 -1
  192. data/man/man8/puppet-device.8 +2 -2
  193. data/man/man8/puppet-doc.8 +1 -1
  194. data/man/man8/puppet-epp.8 +1 -1
  195. data/man/man8/puppet-facts.8 +51 -36
  196. data/man/man8/puppet-filebucket.8 +4 -4
  197. data/man/man8/puppet-generate.8 +1 -1
  198. data/man/man8/puppet-help.8 +1 -1
  199. data/man/man8/puppet-lookup.8 +1 -1
  200. data/man/man8/puppet-module.8 +1 -58
  201. data/man/man8/puppet-node.8 +1 -1
  202. data/man/man8/puppet-parser.8 +1 -1
  203. data/man/man8/puppet-plugin.8 +1 -1
  204. data/man/man8/puppet-report.8 +1 -1
  205. data/man/man8/puppet-resource.8 +1 -1
  206. data/man/man8/puppet-script.8 +2 -2
  207. data/man/man8/puppet-ssl.8 +1 -1
  208. data/man/man8/puppet.8 +2 -2
  209. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  210. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +0 -4
  211. data/spec/integration/application/agent_spec.rb +27 -138
  212. data/spec/integration/application/apply_spec.rb +1 -20
  213. data/spec/integration/application/filebucket_spec.rb +16 -16
  214. data/spec/integration/application/help_spec.rb +2 -0
  215. data/spec/integration/application/plugin_spec.rb +23 -1
  216. data/spec/integration/defaults_spec.rb +14 -3
  217. data/spec/integration/network/http_pool_spec.rb +3 -21
  218. data/spec/integration/parser/catalog_spec.rb +0 -38
  219. data/spec/integration/parser/node_spec.rb +0 -9
  220. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  221. data/spec/integration/resource/type_collection_spec.rb +6 -2
  222. data/spec/integration/transaction_spec.rb +9 -4
  223. data/spec/integration/type/file_spec.rb +5 -4
  224. data/spec/integration/util/windows/adsi_spec.rb +1 -3
  225. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  226. data/spec/integration/util/windows/registry_spec.rb +10 -0
  227. data/spec/integration/util/windows/security_spec.rb +1 -1
  228. data/spec/lib/puppet_spec/puppetserver.rb +1 -1
  229. data/spec/lib/puppet_spec/settings.rb +1 -0
  230. data/spec/spec_helper.rb +6 -1
  231. data/spec/unit/agent_spec.rb +6 -10
  232. data/spec/unit/application/agent_spec.rb +1 -0
  233. data/spec/unit/application/facts_spec.rb +35 -0
  234. data/spec/unit/application/filebucket_spec.rb +43 -39
  235. data/spec/unit/application/ssl_spec.rb +2 -2
  236. data/spec/unit/application_spec.rb +9 -51
  237. data/spec/unit/certificate_factory_spec.rb +1 -1
  238. data/spec/unit/configurer/downloader_spec.rb +6 -2
  239. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  240. data/spec/unit/configurer_spec.rb +12 -9
  241. data/spec/unit/confine/feature_spec.rb +1 -1
  242. data/spec/unit/confine_spec.rb +2 -8
  243. data/spec/unit/context/trusted_information_spec.rb +2 -6
  244. data/spec/unit/defaults_spec.rb +72 -42
  245. data/spec/unit/environments_spec.rb +19 -99
  246. data/spec/unit/face/facts_spec.rb +4 -0
  247. data/spec/unit/face/node_spec.rb +11 -0
  248. data/spec/unit/face/plugin_spec.rb +73 -33
  249. data/spec/unit/file_bucket/file_spec.rb +1 -1
  250. data/spec/unit/file_serving/configuration/parser_spec.rb +15 -18
  251. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  252. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  253. data/spec/unit/file_serving/terminus_helper_spec.rb +4 -11
  254. data/spec/unit/forge/module_release_spec.rb +7 -2
  255. data/spec/unit/functions/camelcase_spec.rb +1 -1
  256. data/spec/unit/functions/capitalize_spec.rb +1 -1
  257. data/spec/unit/functions/downcase_spec.rb +1 -1
  258. data/spec/unit/functions/upcase_spec.rb +1 -1
  259. data/spec/unit/http/client_spec.rb +7 -8
  260. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  261. data/spec/unit/http/external_client_spec.rb +4 -4
  262. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  263. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  264. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  265. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  266. data/spec/unit/http/resolver_spec.rb +13 -13
  267. data/spec/unit/http/service/compiler_spec.rb +0 -62
  268. data/spec/unit/http/service/file_server_spec.rb +3 -3
  269. data/spec/unit/http/service/puppetserver_spec.rb +34 -4
  270. data/spec/unit/http/service_spec.rb +0 -1
  271. data/spec/unit/http/session_spec.rb +16 -14
  272. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  273. data/spec/unit/indirector/face_spec.rb +1 -0
  274. data/spec/unit/indirector/facts/facter_spec.rb +98 -0
  275. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  276. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +8 -26
  277. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  278. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  279. data/spec/unit/indirector/file_server_spec.rb +1 -15
  280. data/spec/unit/indirector/indirection_spec.rb +12 -8
  281. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  282. data/spec/unit/indirector/request_spec.rb +0 -264
  283. data/spec/unit/indirector/rest_spec.rb +98 -752
  284. data/spec/unit/indirector_spec.rb +2 -2
  285. data/spec/unit/module_tool/applications/installer_spec.rb +0 -66
  286. data/spec/unit/network/authconfig_spec.rb +2 -129
  287. data/spec/unit/network/authorization_spec.rb +2 -55
  288. data/spec/unit/network/formats_spec.rb +4 -4
  289. data/spec/unit/network/http/api/indirected_routes_spec.rb +5 -92
  290. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  291. data/spec/unit/network/http/api_spec.rb +10 -0
  292. data/spec/unit/network/http/connection_spec.rb +19 -41
  293. data/spec/unit/network/http/handler_spec.rb +0 -1
  294. data/spec/unit/network/http_pool_spec.rb +0 -4
  295. data/spec/unit/node/environment_spec.rb +33 -21
  296. data/spec/unit/node_spec.rb +2 -54
  297. data/spec/unit/parser/compiler_spec.rb +19 -3
  298. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  299. data/spec/unit/parser/resource_spec.rb +8 -14
  300. data/spec/unit/parser/templatewrapper_spec.rb +3 -4
  301. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
  302. data/spec/unit/pops/loaders/loaders_spec.rb +6 -21
  303. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  304. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  305. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  306. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  307. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  308. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  309. data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
  310. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  311. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  312. data/spec/unit/pops/visitor_spec.rb +1 -1
  313. data/spec/unit/property_spec.rb +0 -1
  314. data/spec/unit/provider/nameservice_spec.rb +64 -122
  315. data/spec/unit/provider/package/apt_spec.rb +8 -4
  316. data/spec/unit/provider/package/base_spec.rb +5 -6
  317. data/spec/unit/provider/package/dpkg_spec.rb +0 -48
  318. data/spec/unit/provider/package/gem_spec.rb +32 -0
  319. data/spec/unit/provider/package/pacman_spec.rb +12 -18
  320. data/spec/unit/provider/package/pip_spec.rb +11 -6
  321. data/spec/unit/provider/package/pkgdmg_spec.rb +4 -0
  322. data/spec/unit/provider/package/puppet_gem_spec.rb +3 -2
  323. data/spec/unit/provider/service/smf_spec.rb +401 -165
  324. data/spec/unit/provider/service/windows_spec.rb +0 -1
  325. data/spec/unit/provider/user/aix_spec.rb +0 -5
  326. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  327. data/spec/unit/provider/user/pw_spec.rb +0 -2
  328. data/spec/unit/provider/user/useradd_spec.rb +0 -1
  329. data/spec/unit/provider_spec.rb +8 -18
  330. data/spec/unit/resource/type_collection_spec.rb +2 -22
  331. data/spec/unit/resource/type_spec.rb +1 -1
  332. data/spec/unit/resource_spec.rb +10 -67
  333. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  334. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  335. data/spec/unit/settings/port_setting_spec.rb +31 -0
  336. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  337. data/spec/unit/settings_spec.rb +23 -13
  338. data/spec/unit/ssl/base_spec.rb +37 -3
  339. data/spec/unit/ssl/certificate_request_spec.rb +15 -45
  340. data/spec/unit/ssl/certificate_spec.rb +2 -11
  341. data/spec/unit/ssl/ssl_provider_spec.rb +2 -5
  342. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  343. data/spec/unit/ssl/verifier_spec.rb +0 -21
  344. data/spec/unit/transaction/additional_resource_generator_spec.rb +7 -3
  345. data/spec/unit/transaction/event_manager_spec.rb +11 -14
  346. data/spec/unit/transaction/report_spec.rb +0 -2
  347. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  348. data/spec/unit/transaction_spec.rb +48 -91
  349. data/spec/unit/type/file/checksum_spec.rb +6 -6
  350. data/spec/unit/type/file/content_spec.rb +2 -1
  351. data/spec/unit/type/file/ensure_spec.rb +1 -1
  352. data/spec/unit/type/file/mode_spec.rb +1 -1
  353. data/spec/unit/type/file/selinux_spec.rb +2 -0
  354. data/spec/unit/type/file/source_spec.rb +0 -1
  355. data/spec/unit/type/file_spec.rb +18 -6
  356. data/spec/unit/type/group_spec.rb +6 -13
  357. data/spec/unit/type/package_spec.rb +1 -1
  358. data/spec/unit/type/resources_spec.rb +7 -7
  359. data/spec/unit/type/service_spec.rb +1 -1
  360. data/spec/unit/type/tidy_spec.rb +1 -0
  361. data/spec/unit/type_spec.rb +22 -2
  362. data/spec/unit/util/at_fork_spec.rb +2 -2
  363. data/spec/unit/util/autoload_spec.rb +1 -5
  364. data/spec/unit/util/backups_spec.rb +2 -3
  365. data/spec/unit/util/execution_spec.rb +11 -44
  366. data/spec/unit/util/inifile_spec.rb +14 -6
  367. data/spec/unit/util/log_spec.rb +7 -8
  368. data/spec/unit/util/logging_spec.rb +3 -3
  369. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  370. data/spec/unit/util/posix_spec.rb +15 -363
  371. data/spec/unit/util/run_mode_spec.rb +21 -121
  372. data/spec/unit/util/selinux_spec.rb +52 -76
  373. data/spec/unit/util/storage_spec.rb +1 -3
  374. data/spec/unit/util/suidmanager_spec.rb +41 -44
  375. data/spec/unit/util/windows/string_spec.rb +1 -3
  376. data/spec/unit/util/yaml_spec.rb +0 -54
  377. data/spec/unit/util_spec.rb +6 -31
  378. metadata +40 -233
  379. data/conf/auth.conf +0 -150
  380. data/lib/puppet/application/cert.rb +0 -76
  381. data/lib/puppet/application/key.rb +0 -4
  382. data/lib/puppet/application/man.rb +0 -4
  383. data/lib/puppet/application/status.rb +0 -4
  384. data/lib/puppet/face/key.rb +0 -16
  385. data/lib/puppet/face/man.rb +0 -145
  386. data/lib/puppet/face/module/build.rb +0 -14
  387. data/lib/puppet/face/module/generate.rb +0 -14
  388. data/lib/puppet/face/module/search.rb +0 -103
  389. data/lib/puppet/face/status.rb +0 -51
  390. data/lib/puppet/ffi/posix.rb +0 -10
  391. data/lib/puppet/ffi/posix/constants.rb +0 -14
  392. data/lib/puppet/ffi/posix/functions.rb +0 -24
  393. data/lib/puppet/indirector/certificate/file.rb +0 -9
  394. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  395. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  396. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  397. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  398. data/lib/puppet/indirector/file_content/http.rb +0 -22
  399. data/lib/puppet/indirector/key/file.rb +0 -46
  400. data/lib/puppet/indirector/key/memory.rb +0 -7
  401. data/lib/puppet/indirector/ssl_file.rb +0 -162
  402. data/lib/puppet/indirector/status.rb +0 -3
  403. data/lib/puppet/indirector/status/local.rb +0 -12
  404. data/lib/puppet/indirector/status/rest.rb +0 -27
  405. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  406. data/lib/puppet/network/auth_config_parser.rb +0 -90
  407. data/lib/puppet/network/authstore.rb +0 -283
  408. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  409. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
  410. data/lib/puppet/network/http/base_pool.rb +0 -36
  411. data/lib/puppet/network/http/compression.rb +0 -127
  412. data/lib/puppet/network/http/connection_adapter.rb +0 -184
  413. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  414. data/lib/puppet/network/rest_controller.rb +0 -2
  415. data/lib/puppet/network/rights.rb +0 -210
  416. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
  417. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
  418. data/lib/puppet/parser/environment_compiler.rb +0 -202
  419. data/lib/puppet/pops/types/enumeration.rb +0 -16
  420. data/lib/puppet/resource/capability_finder.rb +0 -154
  421. data/lib/puppet/rest/errors.rb +0 -15
  422. data/lib/puppet/rest/response.rb +0 -35
  423. data/lib/puppet/rest/route.rb +0 -85
  424. data/lib/puppet/rest/routes.rb +0 -135
  425. data/lib/puppet/settings/alias_setting.rb +0 -37
  426. data/lib/puppet/ssl/host.rb +0 -505
  427. data/lib/puppet/ssl/key.rb +0 -61
  428. data/lib/puppet/ssl/validator.rb +0 -61
  429. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  430. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  431. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  432. data/lib/puppet/status.rb +0 -40
  433. data/lib/puppet/util/connection.rb +0 -88
  434. data/lib/puppet/util/fact_dif.rb +0 -62
  435. data/lib/puppet/util/ssl.rb +0 -83
  436. data/lib/puppet/util/windows/api_types.rb +0 -309
  437. data/lib/puppet/util/windows/monkey_patches/dir.rb +0 -40
  438. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  439. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  440. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  441. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  442. data/lib/puppet/vendor/pathspec/README.md +0 -53
  443. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  444. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  445. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  446. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  447. data/man/man8/puppet-key.8 +0 -126
  448. data/man/man8/puppet-man.8 +0 -76
  449. data/man/man8/puppet-status.8 +0 -108
  450. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +0 -91
  451. data/spec/integration/network/authconfig_spec.rb +0 -256
  452. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +0 -11
  453. data/spec/unit/application/man_spec.rb +0 -52
  454. data/spec/unit/capability_spec.rb +0 -414
  455. data/spec/unit/face/key_spec.rb +0 -9
  456. data/spec/unit/face/module/search_spec.rb +0 -231
  457. data/spec/unit/face/status_spec.rb +0 -9
  458. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  459. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  460. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  461. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  462. data/spec/unit/indirector/key/file_spec.rb +0 -78
  463. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  464. data/spec/unit/indirector/status/local_spec.rb +0 -10
  465. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  466. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  467. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  468. data/spec/unit/network/authstore_spec.rb +0 -422
  469. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  470. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  471. data/spec/unit/network/http/compression_spec.rb +0 -240
  472. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  473. data/spec/unit/network/http_spec.rb +0 -9
  474. data/spec/unit/network/rights_spec.rb +0 -439
  475. data/spec/unit/parser/environment_compiler_spec.rb +0 -730
  476. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +0 -20
  477. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  478. data/spec/unit/resource/capability_finder_spec.rb +0 -148
  479. data/spec/unit/rest/route_spec.rb +0 -132
  480. data/spec/unit/ssl/host_spec.rb +0 -645
  481. data/spec/unit/ssl/key_spec.rb +0 -173
  482. data/spec/unit/ssl/validator_spec.rb +0 -278
  483. data/spec/unit/status_spec.rb +0 -45
  484. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -346,6 +346,12 @@ module Puppet::Environments
346
346
  @loader = loader
347
347
  @cache_expiration_service = Puppet::Environments::Cached.cache_expiration_service
348
348
  @cache = {}
349
+
350
+ # Holds expiration times in sorted order - next to expire is first
351
+ @expirations = SortedSet.new
352
+
353
+ # Infinity since it there are no entries, this is a cache of the first to expire time
354
+ @next_expiration = END_OF_TIME
349
355
  end
350
356
 
351
357
  # @!macro loader_list
@@ -373,6 +379,7 @@ module Puppet::Environments
373
379
  elsif (result = @loader.get(name))
374
380
  # environment loaded, cache it
375
381
  cache_entry = entry(result)
382
+ @cache_expiration_service.created(result)
376
383
  add_entry(name, cache_entry)
377
384
  result
378
385
  end
@@ -382,36 +389,28 @@ module Puppet::Environments
382
389
  def add_entry(name, cache_entry)
383
390
  Puppet.debug {"Caching environment '#{name}' #{cache_entry.label}"}
384
391
  @cache[name] = cache_entry
385
- @cache_expiration_service.created(cache_entry.value)
392
+ expires = cache_entry.expires
393
+ @expirations.add(expires)
394
+ if @next_expiration > expires
395
+ @next_expiration = expires
396
+ end
386
397
  end
387
398
  private :add_entry
388
399
 
389
- def clear_entry(name, entry)
390
- @cache.delete(name)
391
- Puppet.debug {"Evicting cache entry for environment '#{name}'"}
392
- @cache_expiration_service.evicted(name.to_sym)
393
- Puppet::GettextConfig.delete_text_domain(name)
394
- Puppet.settings.clear_environment_settings(name)
395
- end
396
- private :clear_entry
397
-
398
400
  # Clears the cache of the environment with the given name.
399
401
  # (The intention is that this could be used from a MANUAL cache eviction command (TBD)
400
402
  def clear(name)
401
- entry = @cache[name]
402
- clear_entry(name, entry) if entry
403
+ @cache.delete(name)
404
+ Puppet::GettextConfig.delete_text_domain(name)
403
405
  end
404
406
 
405
407
  # Clears all cached environments.
406
408
  # (The intention is that this could be used from a MANUAL cache eviction command (TBD)
407
- def clear_all
409
+ def clear_all()
408
410
  super
409
-
410
- @cache.each_pair do |name, entry|
411
- clear_entry(name, entry)
412
- end
413
-
414
411
  @cache = {}
412
+ @expirations.clear
413
+ @next_expiration = END_OF_TIME
415
414
  Puppet::GettextConfig.delete_environment_text_domains
416
415
  end
417
416
 
@@ -420,24 +419,18 @@ module Puppet::Environments
420
419
  #
421
420
  def clear_all_expired()
422
421
  t = Time.now
423
-
424
- @cache.each_pair do |name, entry|
425
- clear_if_expired(name, entry, t)
422
+ return if t < @next_expiration && ! @cache.any? {|name, _| @cache_expiration_service.expired?(name.to_sym) }
423
+ to_expire = @cache.select { |name, entry| entry.expires < t || @cache_expiration_service.expired?(name.to_sym) }
424
+ to_expire.each do |name, entry|
425
+ Puppet.debug {"Evicting cache entry for environment '#{name}'"}
426
+ @cache_expiration_service.evicted(name.to_sym)
427
+ clear(name)
428
+ @expirations.delete(entry.expires)
429
+ Puppet.settings.clear_environment_settings(name)
426
430
  end
431
+ @next_expiration = @expirations.first || END_OF_TIME
427
432
  end
428
433
 
429
- # Clear an environment if it is expired, either by exceeding its time to live, or
430
- # through an explicit eviction determined by the cache expiration service.
431
- #
432
- def clear_if_expired(name, entry, t = Time.now)
433
- return unless entry
434
-
435
- if entry.expired?(t) || @cache_expiration_service.expired?(name.to_sym)
436
- clear_entry(name, entry)
437
- end
438
- end
439
- private :clear_if_expired
440
-
441
434
  # This implementation evicts the cache, and always gets the current
442
435
  # configuration of the environment
443
436
  #
@@ -447,7 +440,7 @@ module Puppet::Environments
447
440
  #
448
441
  # @!macro loader_get_conf
449
442
  def get_conf(name)
450
- clear_if_expired(name, @cache[name])
443
+ evict_if_expired(name)
451
444
  @loader.get_conf(name)
452
445
  end
453
446
 
@@ -466,11 +459,18 @@ module Puppet::Environments
466
459
  when Float::INFINITY
467
460
  Entry.new(env) # Entry that never expires (avoids syscall to get time)
468
461
  else
469
- if Puppet[:environment_timeout_mode] == :from_last_used
470
- MRUEntry.new(env, ttl) # Entry that expires in ttl from when it was last touched
471
- else
472
- TTLEntry.new(env, ttl) # Entry that expires in ttl from when it was created
473
- end
462
+ MRUEntry.new(env, ttl) # Entry that expires in ttl from when it was last touched
463
+ end
464
+ end
465
+
466
+ # Evicts the entry if it has expired
467
+ # Also clears caches in Settings that may prevent the entry from being updated
468
+ def evict_if_expired(name)
469
+ if (result = @cache[name]) && (result.expired? || @cache_expiration_service.expired?(name.to_sym))
470
+ Puppet.debug {"Evicting cache entry for environment '#{name}'"}
471
+ @cache_expiration_service.evicted(name.to_sym)
472
+ clear(name)
473
+ Puppet.settings.clear_environment_settings(name)
474
474
  end
475
475
  end
476
476
 
@@ -485,57 +485,58 @@ module Puppet::Environments
485
485
  def touch
486
486
  end
487
487
 
488
- def expired?(now)
488
+ def expired?
489
489
  false
490
490
  end
491
491
 
492
492
  def label
493
493
  ""
494
494
  end
495
+
496
+ def expires
497
+ END_OF_TIME
498
+ end
495
499
  end
496
500
 
497
501
  # Always evicting entry
498
502
  class NotCachedEntry < Entry
499
- def expired?(now)
503
+ def expired?
500
504
  true
501
505
  end
502
506
 
503
507
  def label
504
508
  "(ttl = 0 sec)"
505
509
  end
510
+
511
+ def expires
512
+ START_OF_TIME
513
+ end
506
514
  end
507
515
 
508
- # Policy that expires in ttl_seconds from when it was created
509
- class TTLEntry < Entry
516
+ # Policy that expires if it hasn't been touched within ttl_seconds
517
+ class MRUEntry < Entry
510
518
  def initialize(value, ttl_seconds)
511
519
  super(value)
512
520
  @ttl = Time.now + ttl_seconds
513
521
  @ttl_seconds = ttl_seconds
514
- end
515
522
 
516
- def expired?(now)
517
- now > @ttl
523
+ touch
518
524
  end
519
525
 
520
- def label
521
- "(ttl = #{@ttl_seconds} sec)"
526
+ def touch
527
+ @ttl = Time.now + @ttl_seconds
522
528
  end
523
- end
524
-
525
- # Policy that expires if it hasn't been touched within ttl_seconds
526
- class MRUEntry < TTLEntry
527
- def initialize(value, ttl_seconds)
528
- super(value, ttl_seconds)
529
529
 
530
- touch
530
+ def expired?
531
+ Time.now > @ttl
531
532
  end
532
533
 
533
- def touch
534
- @ttl = Time.now + @ttl_seconds
534
+ def expires
535
+ @ttl
535
536
  end
536
537
 
537
538
  def label
538
- "(mru = #{@ttl_seconds} sec)"
539
+ "(ttl = #{@ttl_seconds} sec)"
539
540
  end
540
541
  end
541
542
  end
@@ -1,29 +1,5 @@
1
1
  require 'puppet/indirector/face'
2
2
  require 'puppet/node/facts'
3
- require 'puppet/util/fact_dif'
4
-
5
- EXCLUDE_LIST = %w[facterversion
6
- swapfree_mb swapsize_mb
7
- load_averages\.*
8
- memory\.swap\.available_bytes memory\.swap\.capacity memory\.swap\.total_bytes
9
- memory\.swap\.used_bytes memory\.swap\.available
10
- memory\.system\.available memory\.system\.available_bytes memory\.system\.capacity memory\.swap\.used
11
- memory\.system\.total_bytes memory\.system\.used memory\.system\.used_bytes
12
- memoryfree memoryfree_mb memorysize_mb
13
- mountpoints\..* mtu_.* mountpoints\..*\.capacity
14
- networking\.interfaces\..*\.mtu networking\.mtu partitions\..*\.filesystem
15
- partitions\..*\.size_bytes partitions\..*\.mount partitions\..*\.uuid
16
- disks\..*\.size_bytes
17
- hypervisors\.lpar\.partition_number hypervisors\.xen\.privileged hypervisors\.zone\..* hypervisors\.ldom\..*
18
- processors\.speed
19
- ldom_.*
20
- boardassettag dmi\.board\.asset_tag
21
- blockdevice_.*_vendor blockdevice_.*_size
22
- system_uptime\.days system_uptime\.hours system_uptime\.seconds system_uptime\.uptime
23
- uptime_days uptime_hours uptime_seconds
24
- system_profiler\.uptime
25
- sp_uptime
26
- uptime]
27
3
 
28
4
  Puppet::Indirector::Face.define(:facts, '0.0.1') do
29
5
  copyright "Puppet Inc.", 2011
@@ -55,7 +31,6 @@ Puppet::Indirector::Face.define(:facts, '0.0.1') do
55
31
 
56
32
  $ puppet facts find
57
33
  EOT
58
- find.default = true
59
34
 
60
35
  deactivate_action(:destroy)
61
36
  deactivate_action(:search)
@@ -68,16 +43,12 @@ Puppet::Indirector::Face.define(:facts, '0.0.1') do
68
43
  EOT
69
44
  returns "Nothing."
70
45
  notes <<-'EOT'
71
- This action requires that the puppet master's `auth.conf` file
46
+ This action requires that the Puppet Server's `auth.conf` file
72
47
  allow `PUT` or `save` access to the `/puppet/v3/facts` API endpoint.
73
48
 
74
49
  For details on configuring Puppet Server's `auth.conf`, see:
75
50
 
76
51
  <https://puppet.com/docs/puppetserver/latest/config_file_auth.html>
77
-
78
- For legacy Rack-based Puppet Masters, see:
79
-
80
- <https://puppet.com/docs/puppet/latest/config_file_auth.html>
81
52
  EOT
82
53
  examples <<-'EOT'
83
54
  Upload facts:
@@ -112,39 +83,68 @@ Puppet::Indirector::Face.define(:facts, '0.0.1') do
112
83
  end
113
84
  end
114
85
 
115
- action(:diff) do
116
- summary _("Compare Facter 3 output with Facter 4 output")
86
+ action(:show) do
87
+ summary _("Retrieve current node's facts.")
88
+ arguments _("[<facts>]")
117
89
  description <<-'EOT'
118
- Compares output from facter 3 with Facter 4 and prints the differences
90
+ Reads facts from the local system using `facter` terminus.
91
+ A query can be provided to retrieve just a specific fact or a set of facts.
119
92
  EOT
120
- returns "Differences between Facter 3 and Facter 4 output as an array."
93
+ returns "The output of facter with added puppet specific facts."
121
94
  notes <<-'EOT'
95
+
122
96
  EOT
123
97
  examples <<-'EOT'
124
- get differences between facter versions:
125
- $ puppet facts diff
98
+ retrieve facts:
99
+
100
+ $ puppet facts show os
126
101
  EOT
102
+ default true
127
103
 
128
- render_as :json
104
+ option("--config-file " + _("<path>")) do
105
+ default_to { nil }
106
+ summary _("The location of the config file for Facter.")
107
+ end
108
+
109
+ option("--custom-dir " + _("<path>")) do
110
+ default_to { nil }
111
+ summary _("The path to a directory that contains custom facts.")
112
+ end
113
+
114
+ option("--external-dir " + _("<path>")) do
115
+ default_to { nil }
116
+ summary _("The path to a directory that contains external facts.")
117
+ end
118
+
119
+ option("--no-block") do
120
+ summary _("Disable fact blocking mechanism.")
121
+ end
122
+
123
+ option("--no-cache") do
124
+ summary _("Disable fact caching mechanism.")
125
+ end
126
+
127
+ option("--show-legacy") do
128
+ summary _("Show legacy facts when querying all facts.")
129
+ end
129
130
 
130
131
  when_invoked do |*args|
132
+ options = args.pop
133
+
131
134
  Puppet.settings.preferred_run_mode = :agent
132
135
  Puppet::Node::Facts.indirection.terminus_class = :facter
133
136
 
134
- if Puppet::Util::Package.versioncmp(Facter.value('facterversion'), '4.0.0') < 0
135
- facter3_result = Puppet::Node::Facts.indirection.find(Puppet.settings[:certname])
136
- begin
137
- require 'facter-ng'
138
- facter4_result = Puppet::Node::Facts.indirection.find(Puppet.settings[:certname])
139
- rescue LoadError
140
- raise ArgumentError, 'facter-ng could not be loaded'
141
- end
142
- fact_diff = FactDif.new(facter3_result.to_json, facter4_result.to_json, EXCLUDE_LIST)
143
- fact_diff.difs
144
- else
145
- Puppet.warning _("Already using Facter 4. To use `puppet facts diff` remove facterng from the .conf file or run `puppet config set facterng false`.")
146
- exit 0
147
- end
137
+
138
+ options[:user_query] = args
139
+ options[:resolve_options] = true
140
+ result = Puppet::Node::Facts.indirection.find(Puppet.settings[:certname], options)
141
+
142
+ result.values
143
+ end
144
+
145
+ when_rendering :console do |result|
146
+ Puppet::Util::Json.dump(result, :pretty => true)
148
147
  end
149
148
  end
150
149
  end
150
+
@@ -222,7 +222,7 @@ Puppet::Face.define(:help, '0.0.1') do
222
222
  #private :horribly_extract_summary_from
223
223
 
224
224
  def exclude_from_docs?(appname)
225
- %w{face_base indirection_base cert key man report status}.include? appname
225
+ %w{face_base indirection_base report status}.include? appname
226
226
  end
227
227
  # This should absolutely be a private method, but for some reason it appears
228
228
  # that you can't use the 'private' keyword inside of a Face definition.
@@ -41,14 +41,11 @@ Puppet::Face.define(:plugin, '0.0.1') do
41
41
  when_invoked do |options|
42
42
  remote_environment_for_plugins = Puppet::Node::Environment.remote(Puppet[:environment])
43
43
 
44
- pool = Puppet.runtime[:http].pool
45
- Puppet.override(:http_pool => pool) do
46
- begin
47
- handler = Puppet::Configurer::PluginHandler.new
48
- handler.download_plugins(remote_environment_for_plugins)
49
- ensure
50
- pool.close
51
- end
44
+ begin
45
+ handler = Puppet::Configurer::PluginHandler.new
46
+ handler.download_plugins(remote_environment_for_plugins)
47
+ ensure
48
+ Puppet.runtime[:http].close
52
49
  end
53
50
  end
54
51
 
@@ -0,0 +1,12 @@
1
+ require 'ffi'
2
+
3
+ module Puppet
4
+ module FFI
5
+ module Windows
6
+ require 'puppet/ffi/windows/api_types'
7
+ require 'puppet/ffi/windows/constants'
8
+ require 'puppet/ffi/windows/structs'
9
+ require 'puppet/ffi/windows/functions'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,311 @@
1
+ require 'puppet/ffi/windows'
2
+ require 'puppet/util/windows/string'
3
+
4
+ module Puppet::FFI::Windows
5
+ module APITypes
6
+ module ::FFI
7
+ WIN32_FALSE = 0
8
+
9
+ # standard Win32 error codes
10
+ ERROR_SUCCESS = 0
11
+ end
12
+
13
+ module ::FFI::Library
14
+ # Wrapper method for attach_function + private
15
+ def attach_function_private(*args)
16
+ attach_function(*args)
17
+ private args[0]
18
+ end
19
+ end
20
+
21
+ class ::FFI::Pointer
22
+ NULL_HANDLE = 0
23
+ WCHAR_NULL = "\0\0".encode('UTF-16LE').freeze
24
+
25
+ def self.from_string_to_wide_string(str, &block)
26
+ str = Puppet::Util::Windows::String.wide_string(str)
27
+ FFI::MemoryPointer.from_wide_string(str, &block)
28
+
29
+ # ptr has already had free called, so nothing to return
30
+ nil
31
+ end
32
+
33
+ def read_win32_bool
34
+ # BOOL is always a 32-bit integer in Win32
35
+ # some Win32 APIs return 1 for true, while others are non-0
36
+ read_int32 != FFI::WIN32_FALSE
37
+ end
38
+
39
+ alias_method :read_dword, :read_uint32
40
+ alias_method :read_win32_ulong, :read_uint32
41
+ alias_method :read_qword, :read_uint64
42
+
43
+ alias_method :read_hresult, :read_int32
44
+
45
+ def read_handle
46
+ type_size == 4 ? read_uint32 : read_uint64
47
+ end
48
+
49
+ alias_method :read_wchar, :read_uint16
50
+ alias_method :read_word, :read_uint16
51
+ alias_method :read_array_of_wchar, :read_array_of_uint16
52
+
53
+ def read_wide_string(char_length, dst_encoding = Encoding::UTF_8, strip = false, encode_options = {})
54
+ # char_length is number of wide chars (typically excluding NULLs), *not* bytes
55
+ str = get_bytes(0, char_length * 2).force_encoding('UTF-16LE')
56
+
57
+ if strip
58
+ i = str.index(WCHAR_NULL)
59
+ str = str[0, i] if i
60
+ end
61
+
62
+ str.encode(dst_encoding, str.encoding, **encode_options)
63
+ rescue EncodingError => e
64
+ Puppet.debug { "Unable to convert value #{str.nil? ? 'nil' : str.dump} to encoding #{dst_encoding} due to #{e.inspect}" }
65
+ raise
66
+ end
67
+
68
+ # @param max_char_length [Integer] Maximum number of wide chars to return (typically excluding NULLs), *not* bytes
69
+ # @param null_terminator [Symbol] Number of number of null wchar characters, *not* bytes, that determine the end of the string
70
+ # null_terminator = :single_null, then the terminating sequence is two bytes of zero. This is UNIT16 = 0
71
+ # null_terminator = :double_null, then the terminating sequence is four bytes of zero. This is UNIT32 = 0
72
+ # @param encode_options [Hash] Accepts the same option hash that may be passed to String#encode in Ruby
73
+ def read_arbitrary_wide_string_up_to(max_char_length = 512, null_terminator = :single_null, encode_options = {})
74
+ idx = case null_terminator
75
+ when :single_null
76
+ # find index of wide null between 0 and max (exclusive)
77
+ (0...max_char_length).find do |i|
78
+ get_uint16(i * 2) == 0
79
+ end
80
+ when :double_null
81
+ # find index of double-wide null between 0 and max - 1 (exclusive)
82
+ (0...max_char_length - 1).find do |i|
83
+ get_uint32(i * 2) == 0
84
+ end
85
+ else
86
+ raise _("Unable to read wide strings with %{null_terminator} terminal nulls") % { null_terminator: null_terminator }
87
+ end
88
+
89
+ read_wide_string(idx || max_char_length, Encoding::UTF_8, false, encode_options)
90
+ end
91
+
92
+ def read_win32_local_pointer(&block)
93
+ ptr = read_pointer
94
+ begin
95
+ yield ptr
96
+ ensure
97
+ if !ptr.null? && FFI::WIN32::LocalFree(ptr.address) != FFI::Pointer::NULL_HANDLE
98
+ Puppet.debug "LocalFree memory leak"
99
+ end
100
+ end
101
+
102
+ # ptr has already had LocalFree called, so nothing to return
103
+ nil
104
+ end
105
+
106
+ def read_com_memory_pointer(&block)
107
+ ptr = read_pointer
108
+ begin
109
+ yield ptr
110
+ ensure
111
+ FFI::WIN32::CoTaskMemFree(ptr) unless ptr.null?
112
+ end
113
+
114
+ # ptr has already had CoTaskMemFree called, so nothing to return
115
+ nil
116
+ end
117
+
118
+ alias_method :write_dword, :write_uint32
119
+ alias_method :write_word, :write_uint16
120
+ end
121
+
122
+ class FFI::MemoryPointer
123
+ # Return a MemoryPointer that points to wide string. This is analogous to the
124
+ # FFI::MemoryPointer.from_string method.
125
+ def self.from_wide_string(wstr)
126
+ ptr = FFI::MemoryPointer.new(:uchar, wstr.bytesize + 2)
127
+ ptr.put_array_of_uchar(0, wstr.bytes.to_a)
128
+ ptr.put_uint16(wstr.bytesize, 0)
129
+
130
+ yield ptr if block_given?
131
+
132
+ ptr
133
+ end
134
+ end
135
+
136
+ # FFI Types
137
+ # https://github.com/ffi/ffi/wiki/Types
138
+
139
+ # Windows - Common Data Types
140
+ # https://msdn.microsoft.com/en-us/library/cc230309.aspx
141
+
142
+ # Windows Data Types
143
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
144
+
145
+ FFI.typedef :uint16, :word
146
+ FFI.typedef :uint32, :dword
147
+ # uintptr_t is defined in an FFI conf as platform specific, either
148
+ # ulong_long on x64 or just ulong on x86
149
+ FFI.typedef :uintptr_t, :handle
150
+ FFI.typedef :uintptr_t, :hwnd
151
+
152
+ # buffer_inout is similar to pointer (platform specific), but optimized for buffers
153
+ FFI.typedef :buffer_inout, :lpwstr
154
+ # buffer_in is similar to pointer (platform specific), but optimized for CONST read only buffers
155
+ FFI.typedef :buffer_in, :lpcwstr
156
+ FFI.typedef :buffer_in, :lpcolestr
157
+
158
+ # string is also similar to pointer, but should be used for const char *
159
+ # NOTE that this is not wide, useful only for A suffixed functions
160
+ FFI.typedef :string, :lpcstr
161
+
162
+ # pointer in FFI is platform specific
163
+ # NOTE: for API calls with reserved lpvoid parameters, pass a FFI::Pointer::NULL
164
+ FFI.typedef :pointer, :lpcvoid
165
+ FFI.typedef :pointer, :lpvoid
166
+ FFI.typedef :pointer, :lpword
167
+ FFI.typedef :pointer, :lpbyte
168
+ FFI.typedef :pointer, :lpdword
169
+ FFI.typedef :pointer, :pdword
170
+ FFI.typedef :pointer, :phandle
171
+ FFI.typedef :pointer, :ulong_ptr
172
+ FFI.typedef :pointer, :pbool
173
+ FFI.typedef :pointer, :lpunknown
174
+
175
+ # any time LONG / ULONG is in a win32 API definition DO NOT USE platform specific width
176
+ # which is what FFI uses by default
177
+ # instead create new aliases for these very special cases
178
+ # NOTE: not a good idea to redefine FFI :ulong since other typedefs may rely on it
179
+ FFI.typedef :uint32, :win32_ulong
180
+ FFI.typedef :int32, :win32_long
181
+ # FFI bool can be only 1 byte at times,
182
+ # Win32 BOOL is a signed int, and is always 4 bytes, even on x64
183
+ # https://blogs.msdn.com/b/oldnewthing/archive/2011/03/28/10146459.aspx
184
+ FFI.typedef :int32, :win32_bool
185
+
186
+ # BOOLEAN (unlike BOOL) is a BYTE - typedef unsigned char BYTE;
187
+ FFI.typedef :uchar, :boolean
188
+
189
+ # Same as a LONG, a 32-bit signed integer
190
+ FFI.typedef :int32, :hresult
191
+
192
+ # NOTE: FFI already defines (u)short as a 16-bit (un)signed like this:
193
+ # FFI.typedef :uint16, :ushort
194
+ # FFI.typedef :int16, :short
195
+
196
+ # 8 bits per byte
197
+ FFI.typedef :uchar, :byte
198
+ FFI.typedef :uint16, :wchar
199
+
200
+ # Definitions for data types used in LSA structures and functions
201
+ # https://docs.microsoft.com/en-us/windows/win32/api/ntsecapi/
202
+ # https://docs.microsoft.com/sr-latn-rs/windows/win32/secmgmt/management-data-types
203
+ FFI.typedef :pointer, :pwstr
204
+ FFI.typedef :pointer, :pulong
205
+ FFI.typedef :pointer, :lsa_handle
206
+ FFI.typedef :pointer, :plsa_handle
207
+ FFI.typedef :pointer, :psid
208
+ FFI.typedef :pointer, :pvoid
209
+ FFI.typedef :pointer, :plsa_unicode_string
210
+ FFI.typedef :pointer, :plsa_object_attributes
211
+ FFI.typedef :uint32, :ntstatus
212
+ FFI.typedef :dword, :access_mask
213
+
214
+ module ::FFI::WIN32
215
+ extend ::FFI::Library
216
+
217
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa373931(v=vs.85).aspx
218
+ # typedef struct _GUID {
219
+ # DWORD Data1;
220
+ # WORD Data2;
221
+ # WORD Data3;
222
+ # BYTE Data4[8];
223
+ # } GUID;
224
+ class GUID < FFI::Struct
225
+ layout :Data1, :dword,
226
+ :Data2, :word,
227
+ :Data3, :word,
228
+ :Data4, [:byte, 8]
229
+
230
+ def self.[](s)
231
+ raise _('Bad GUID format.') unless s =~ /^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
232
+
233
+ new.tap do |guid|
234
+ guid[:Data1] = s[0, 8].to_i(16)
235
+ guid[:Data2] = s[9, 4].to_i(16)
236
+ guid[:Data3] = s[14, 4].to_i(16)
237
+ guid[:Data4][0] = s[19, 2].to_i(16)
238
+ guid[:Data4][1] = s[21, 2].to_i(16)
239
+ s[24, 12].split('').each_slice(2).with_index do |a, i|
240
+ guid[:Data4][i + 2] = a.join('').to_i(16)
241
+ end
242
+ end
243
+ end
244
+
245
+ def ==(other) Windows.memcmp(other, self, size) == 0 end
246
+ end
247
+
248
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx
249
+ # typedef struct _SYSTEMTIME {
250
+ # WORD wYear;
251
+ # WORD wMonth;
252
+ # WORD wDayOfWeek;
253
+ # WORD wDay;
254
+ # WORD wHour;
255
+ # WORD wMinute;
256
+ # WORD wSecond;
257
+ # WORD wMilliseconds;
258
+ # } SYSTEMTIME, *PSYSTEMTIME;
259
+ class SYSTEMTIME < FFI::Struct
260
+ layout :wYear, :word,
261
+ :wMonth, :word,
262
+ :wDayOfWeek, :word,
263
+ :wDay, :word,
264
+ :wHour, :word,
265
+ :wMinute, :word,
266
+ :wSecond, :word,
267
+ :wMilliseconds, :word
268
+
269
+ def to_local_time
270
+ Time.local(self[:wYear], self[:wMonth], self[:wDay],
271
+ self[:wHour], self[:wMinute], self[:wSecond], self[:wMilliseconds] * 1000)
272
+ end
273
+ end
274
+
275
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284(v=vs.85).aspx
276
+ # Contains a 64-bit value representing the number of 100-nanosecond
277
+ # intervals since January 1, 1601 (UTC).
278
+ # typedef struct _FILETIME {
279
+ # DWORD dwLowDateTime;
280
+ # DWORD dwHighDateTime;
281
+ # } FILETIME, *PFILETIME;
282
+ class FILETIME < FFI::Struct
283
+ layout :dwLowDateTime, :dword,
284
+ :dwHighDateTime, :dword
285
+ end
286
+
287
+ ffi_convention :stdcall
288
+
289
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa366730(v=vs.85).aspx
290
+ # HLOCAL WINAPI LocalFree(
291
+ # _In_ HLOCAL hMem
292
+ # );
293
+ ffi_lib :kernel32
294
+ attach_function :LocalFree, [:handle], :handle
295
+
296
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx
297
+ # BOOL WINAPI CloseHandle(
298
+ # _In_ HANDLE hObject
299
+ # );
300
+ ffi_lib :kernel32
301
+ attach_function_private :CloseHandle, [:handle], :win32_bool
302
+
303
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/ms680722(v=vs.85).aspx
304
+ # void CoTaskMemFree(
305
+ # _In_opt_ LPVOID pv
306
+ # );
307
+ ffi_lib :ole32
308
+ attach_function :CoTaskMemFree, [:lpvoid], :void
309
+ end
310
+ end
311
+ end