puppet 6.21.1-x64-mingw32 → 7.4.1-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 (402) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -4
  3. data/Gemfile.lock +5 -5
  4. data/README.md +1 -1
  5. data/conf/fileserver.conf +5 -10
  6. data/ext/build_defaults.yaml +1 -2
  7. data/ext/osx/file_mapping.yaml +0 -5
  8. data/ext/project_data.yaml +2 -14
  9. data/ext/redhat/puppet.spec.erb +0 -1
  10. data/ext/windows/service/daemon.rb +6 -5
  11. data/install.rb +21 -17
  12. data/lib/puppet.rb +11 -20
  13. data/lib/puppet/application.rb +172 -98
  14. data/lib/puppet/application/device.rb +100 -104
  15. data/lib/puppet/application/filebucket.rb +13 -9
  16. data/lib/puppet/application/ssl.rb +1 -1
  17. data/lib/puppet/configurer.rb +27 -29
  18. data/lib/puppet/configurer/plugin_handler.rb +21 -19
  19. data/lib/puppet/defaults.rb +57 -162
  20. data/lib/puppet/environments.rb +8 -23
  21. data/lib/puppet/face/facts.rb +73 -49
  22. data/lib/puppet/face/help.rb +1 -1
  23. data/lib/puppet/face/node/clean.rb +8 -0
  24. data/lib/puppet/face/plugin.rb +5 -8
  25. data/lib/puppet/ffi/windows.rb +12 -0
  26. data/lib/puppet/ffi/windows/api_types.rb +311 -0
  27. data/lib/puppet/ffi/windows/constants.rb +404 -0
  28. data/lib/puppet/ffi/windows/functions.rb +628 -0
  29. data/lib/puppet/ffi/windows/structs.rb +338 -0
  30. data/lib/puppet/file_serving/configuration.rb +0 -5
  31. data/lib/puppet/file_serving/configuration/parser.rb +6 -32
  32. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  33. data/lib/puppet/file_serving/mount.rb +1 -2
  34. data/lib/puppet/forge/repository.rb +0 -1
  35. data/lib/puppet/generate/models/type/type.rb +4 -1
  36. data/lib/puppet/http.rb +22 -13
  37. data/lib/puppet/http/client.rb +164 -114
  38. data/lib/puppet/{network/resolver.rb → http/dns.rb} +2 -2
  39. data/lib/puppet/http/errors.rb +16 -0
  40. data/lib/puppet/http/external_client.rb +5 -7
  41. data/lib/puppet/{network/http → http}/factory.rb +8 -11
  42. data/lib/puppet/{network/http → http}/pool.rb +61 -26
  43. data/lib/puppet/{network/http/session.rb → http/pool_entry.rb} +2 -3
  44. data/lib/puppet/http/proxy.rb +137 -0
  45. data/lib/puppet/http/redirector.rb +4 -12
  46. data/lib/puppet/http/resolver.rb +5 -15
  47. data/lib/puppet/http/resolver/server_list.rb +6 -10
  48. data/lib/puppet/http/resolver/settings.rb +4 -7
  49. data/lib/puppet/http/resolver/srv.rb +7 -11
  50. data/lib/puppet/http/response.rb +36 -54
  51. data/lib/puppet/http/response_converter.rb +24 -0
  52. data/lib/puppet/http/response_net_http.rb +42 -0
  53. data/lib/puppet/http/retry_after_handler.rb +4 -13
  54. data/lib/puppet/http/service.rb +12 -26
  55. data/lib/puppet/http/service/ca.rb +11 -22
  56. data/lib/puppet/http/service/compiler.rb +22 -69
  57. data/lib/puppet/http/service/file_server.rb +18 -27
  58. data/lib/puppet/http/service/puppetserver.rb +26 -12
  59. data/lib/puppet/http/service/report.rb +8 -10
  60. data/lib/puppet/http/session.rb +11 -20
  61. data/lib/puppet/{network/http → http}/site.rb +1 -2
  62. data/lib/puppet/indirector/catalog/rest.rb +2 -4
  63. data/lib/puppet/indirector/facts/facter.rb +25 -3
  64. data/lib/puppet/indirector/facts/rest.rb +3 -22
  65. data/lib/puppet/indirector/file_bucket_file/rest.rb +3 -9
  66. data/lib/puppet/indirector/file_content/rest.rb +2 -6
  67. data/lib/puppet/indirector/file_metadata/rest.rb +3 -9
  68. data/lib/puppet/indirector/file_server.rb +1 -8
  69. data/lib/puppet/indirector/generic_http.rb +0 -11
  70. data/lib/puppet/indirector/node/rest.rb +2 -4
  71. data/lib/puppet/indirector/report/rest.rb +3 -8
  72. data/lib/puppet/indirector/request.rb +0 -101
  73. data/lib/puppet/indirector/rest.rb +12 -263
  74. data/lib/puppet/module_tool/applications.rb +0 -1
  75. data/lib/puppet/network/authconfig.rb +2 -96
  76. data/lib/puppet/network/authorization.rb +13 -35
  77. data/lib/puppet/network/formats.rb +67 -0
  78. data/lib/puppet/network/http.rb +3 -3
  79. data/lib/puppet/network/http/api/indirected_routes.rb +2 -20
  80. data/lib/puppet/network/http/api/master/v3.rb +11 -13
  81. data/lib/puppet/network/http/connection.rb +247 -316
  82. data/lib/puppet/network/http/handler.rb +0 -1
  83. data/lib/puppet/network/http_pool.rb +16 -34
  84. data/lib/puppet/node.rb +1 -30
  85. data/lib/puppet/pal/json_catalog_encoder.rb +4 -0
  86. data/lib/puppet/pal/pal_impl.rb +3 -1
  87. data/lib/puppet/parser/ast/pops_bridge.rb +0 -38
  88. data/lib/puppet/parser/compiler.rb +0 -198
  89. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +14 -39
  90. data/lib/puppet/parser/resource.rb +0 -69
  91. data/lib/puppet/pops/evaluator/evaluator_impl.rb +0 -5
  92. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +3 -3
  93. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  94. data/lib/puppet/pops/issues.rb +0 -5
  95. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +6 -8
  96. data/lib/puppet/pops/model/ast.pp +0 -42
  97. data/lib/puppet/pops/model/ast.rb +0 -290
  98. data/lib/puppet/pops/model/factory.rb +0 -45
  99. data/lib/puppet/pops/model/model_label_provider.rb +0 -5
  100. data/lib/puppet/pops/model/model_tree_dumper.rb +0 -22
  101. data/lib/puppet/pops/model/pn_transformer.rb +0 -16
  102. data/lib/puppet/pops/parser/egrammar.ra +0 -56
  103. data/lib/puppet/pops/parser/eparser.rb +1520 -1712
  104. data/lib/puppet/pops/parser/lexer2.rb +4 -4
  105. data/lib/puppet/pops/parser/parser_support.rb +0 -5
  106. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -24
  107. data/lib/puppet/pops/types/type_calculator.rb +0 -7
  108. data/lib/puppet/pops/types/type_parser.rb +0 -4
  109. data/lib/puppet/pops/types/types.rb +0 -1
  110. data/lib/puppet/pops/validation/checker4_0.rb +9 -37
  111. data/lib/puppet/pops/validation/tasks_checker.rb +0 -12
  112. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -2
  113. data/lib/puppet/provider.rb +0 -13
  114. data/lib/puppet/provider/nameservice.rb +0 -18
  115. data/lib/puppet/provider/package/dpkg.rb +0 -10
  116. data/lib/puppet/provider/package/gem.rb +23 -3
  117. data/lib/puppet/provider/package/pip.rb +0 -1
  118. data/lib/puppet/provider/package/pkg.rb +0 -4
  119. data/lib/puppet/provider/package/portage.rb +1 -1
  120. data/lib/puppet/provider/package/puppet_gem.rb +1 -4
  121. data/lib/puppet/provider/service/smf.rb +191 -73
  122. data/lib/puppet/provider/user/directoryservice.rb +0 -10
  123. data/lib/puppet/reference/configuration.rb +7 -5
  124. data/lib/puppet/reference/indirection.rb +1 -1
  125. data/lib/puppet/resource.rb +1 -89
  126. data/lib/puppet/resource/catalog.rb +1 -14
  127. data/lib/puppet/resource/type.rb +3 -119
  128. data/lib/puppet/resource/type_collection.rb +3 -48
  129. data/lib/puppet/runtime.rb +1 -2
  130. data/lib/puppet/settings.rb +45 -33
  131. data/lib/puppet/settings/integer_setting.rb +17 -0
  132. data/lib/puppet/settings/port_setting.rb +15 -0
  133. data/lib/puppet/settings/priority_setting.rb +5 -4
  134. data/lib/puppet/ssl.rb +10 -6
  135. data/lib/puppet/ssl/base.rb +3 -5
  136. data/lib/puppet/ssl/certificate.rb +0 -6
  137. data/lib/puppet/ssl/certificate_request.rb +1 -12
  138. data/lib/puppet/ssl/certificate_signer.rb +6 -0
  139. data/lib/puppet/ssl/oids.rb +3 -1
  140. data/lib/puppet/ssl/ssl_provider.rb +17 -0
  141. data/lib/puppet/ssl/state_machine.rb +3 -1
  142. data/lib/puppet/ssl/verifier.rb +2 -0
  143. data/lib/puppet/test/test_helper.rb +1 -3
  144. data/lib/puppet/transaction.rb +1 -7
  145. data/lib/puppet/transaction/report.rb +2 -4
  146. data/lib/puppet/type.rb +0 -76
  147. data/lib/puppet/type/file.rb +5 -7
  148. data/lib/puppet/type/file/checksum.rb +1 -1
  149. data/lib/puppet/type/file/source.rb +1 -1
  150. data/lib/puppet/type/filebucket.rb +3 -3
  151. data/lib/puppet/type/package.rb +5 -13
  152. data/lib/puppet/type/user.rb +1 -1
  153. data/lib/puppet/util/execution.rb +0 -11
  154. data/lib/puppet/util/http_proxy.rb +2 -215
  155. data/lib/puppet/util/monkey_patches.rb +0 -46
  156. data/lib/puppet/util/rdoc.rb +0 -7
  157. data/lib/puppet/util/retry_action.rb +1 -1
  158. data/lib/puppet/util/run_mode.rb +9 -1
  159. data/lib/puppet/util/windows.rb +3 -8
  160. data/lib/puppet/util/windows/daemon.rb +360 -0
  161. data/lib/puppet/util/windows/error.rb +1 -0
  162. data/lib/puppet/util/windows/eventlog.rb +4 -9
  163. data/lib/puppet/util/windows/file.rb +8 -242
  164. data/lib/puppet/util/windows/monkey_patches/process.rb +414 -0
  165. data/lib/puppet/util/windows/process.rb +4 -226
  166. data/lib/puppet/util/windows/service.rb +9 -460
  167. data/lib/puppet/util/windows/string.rb +12 -13
  168. data/lib/puppet/util/yaml.rb +0 -22
  169. data/lib/puppet/vendor/require_vendored.rb +0 -1
  170. data/lib/puppet/version.rb +1 -1
  171. data/lib/puppet/x509.rb +5 -1
  172. data/lib/puppet/x509/cert_provider.rb +29 -1
  173. data/locales/puppet.pot +521 -1226
  174. data/man/man5/puppet.conf.5 +34 -94
  175. data/man/man8/puppet-facts.8 +56 -35
  176. data/man/man8/puppet-filebucket.8 +3 -3
  177. data/man/man8/puppet-module.8 +0 -57
  178. data/man/man8/puppet.8 +1 -1
  179. data/spec/fixtures/unit/provider/service/smf/{svcs.out → svcs_instances.out} +0 -0
  180. data/spec/integration/application/agent_spec.rb +24 -11
  181. data/spec/integration/application/apply_spec.rb +1 -1
  182. data/spec/integration/application/filebucket_spec.rb +16 -16
  183. data/spec/integration/application/help_spec.rb +2 -0
  184. data/spec/integration/application/plugin_spec.rb +23 -1
  185. data/spec/integration/defaults_spec.rb +7 -3
  186. data/spec/integration/indirector/file_content/file_server_spec.rb +0 -2
  187. data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -2
  188. data/spec/integration/network/http_pool_spec.rb +3 -21
  189. data/spec/integration/parser/catalog_spec.rb +0 -38
  190. data/spec/integration/parser/node_spec.rb +0 -9
  191. data/spec/integration/parser/pcore_resource_spec.rb +0 -37
  192. data/spec/integration/type/file_spec.rb +5 -4
  193. data/spec/integration/util/windows/monkey_patches/process_spec.rb +231 -0
  194. data/spec/integration/util/windows/security_spec.rb +1 -1
  195. data/spec/lib/puppet_spec/puppetserver.rb +1 -1
  196. data/spec/lib/puppet_spec/settings.rb +1 -0
  197. data/spec/spec_helper.rb +2 -0
  198. data/spec/unit/agent_spec.rb +0 -2
  199. data/spec/unit/application/facts_spec.rb +86 -0
  200. data/spec/unit/application/filebucket_spec.rb +41 -39
  201. data/spec/unit/application/ssl_spec.rb +2 -2
  202. data/spec/unit/certificate_factory_spec.rb +1 -1
  203. data/spec/unit/configurer/downloader_spec.rb +6 -2
  204. data/spec/unit/configurer/plugin_handler_spec.rb +56 -18
  205. data/spec/unit/configurer_spec.rb +12 -9
  206. data/spec/unit/context/trusted_information_spec.rb +2 -6
  207. data/spec/unit/defaults_spec.rb +22 -47
  208. data/spec/unit/environments_spec.rb +0 -3
  209. data/spec/unit/face/facts_spec.rb +4 -0
  210. data/spec/unit/face/node_spec.rb +14 -2
  211. data/spec/unit/face/plugin_spec.rb +73 -33
  212. data/spec/unit/file_bucket/file_spec.rb +1 -1
  213. data/spec/unit/file_serving/configuration/parser_spec.rb +22 -18
  214. data/spec/unit/file_serving/configuration_spec.rb +6 -12
  215. data/spec/unit/functions/camelcase_spec.rb +1 -1
  216. data/spec/unit/functions/capitalize_spec.rb +1 -1
  217. data/spec/unit/functions/downcase_spec.rb +1 -1
  218. data/spec/unit/functions/upcase_spec.rb +1 -1
  219. data/spec/unit/http/client_spec.rb +7 -8
  220. data/spec/unit/{network/resolver_spec.rb → http/dns_spec.rb} +3 -3
  221. data/spec/unit/http/external_client_spec.rb +4 -4
  222. data/spec/unit/{network/http → http}/factory_spec.rb +5 -11
  223. data/spec/unit/{network/http/session_spec.rb → http/pool_entry_spec.rb} +3 -3
  224. data/spec/unit/{network/http → http}/pool_spec.rb +12 -17
  225. data/spec/unit/{util/http_proxy_spec.rb → http/proxy_spec.rb} +2 -69
  226. data/spec/unit/http/resolver_spec.rb +13 -13
  227. data/spec/unit/http/service/compiler_spec.rb +0 -62
  228. data/spec/unit/http/service/file_server_spec.rb +3 -3
  229. data/spec/unit/http/service/puppetserver_spec.rb +34 -4
  230. data/spec/unit/http/service_spec.rb +0 -1
  231. data/spec/unit/http/session_spec.rb +16 -14
  232. data/spec/unit/{network/http → http}/site_spec.rb +3 -3
  233. data/spec/unit/indirector/facts/facter_spec.rb +113 -0
  234. data/spec/unit/indirector/file_bucket_file/file_spec.rb +5 -3
  235. data/spec/unit/indirector/file_content/rest_spec.rb +0 -4
  236. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -4
  237. data/spec/unit/indirector/file_server_spec.rb +1 -15
  238. data/spec/unit/indirector/report/rest_spec.rb +2 -17
  239. data/spec/unit/indirector/request_spec.rb +0 -264
  240. data/spec/unit/indirector/rest_spec.rb +98 -752
  241. data/spec/unit/network/authconfig_spec.rb +2 -129
  242. data/spec/unit/network/authorization_spec.rb +2 -55
  243. data/spec/unit/network/formats_spec.rb +45 -4
  244. data/spec/unit/network/http/api/indirected_routes_spec.rb +1 -92
  245. data/spec/unit/network/http/api/master/v3_spec.rb +28 -7
  246. data/spec/unit/network/http/api_spec.rb +10 -0
  247. data/spec/unit/network/http/connection_spec.rb +19 -41
  248. data/spec/unit/network/http/handler_spec.rb +0 -1
  249. data/spec/unit/network/http_pool_spec.rb +0 -4
  250. data/spec/unit/node/environment_spec.rb +33 -21
  251. data/spec/unit/node_spec.rb +2 -54
  252. data/spec/unit/parser/functions/create_resources_spec.rb +2 -20
  253. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +4 -7
  254. data/spec/unit/pops/loaders/loaders_spec.rb +6 -21
  255. data/spec/unit/pops/parser/parse_application_spec.rb +4 -22
  256. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +0 -1
  257. data/spec/unit/pops/parser/parse_capabilities_spec.rb +8 -21
  258. data/spec/unit/pops/parser/parse_site_spec.rb +20 -24
  259. data/spec/unit/pops/resource/resource_type_impl_spec.rb +0 -71
  260. data/spec/unit/pops/serialization/to_from_hr_spec.rb +1 -1
  261. data/spec/unit/pops/types/type_calculator_spec.rb +6 -6
  262. data/spec/unit/pops/types/type_factory_spec.rb +1 -1
  263. data/spec/unit/pops/validator/validator_spec.rb +61 -46
  264. data/spec/unit/pops/visitor_spec.rb +1 -1
  265. data/spec/unit/provider/nameservice_spec.rb +0 -57
  266. data/spec/unit/provider/package/dpkg_spec.rb +0 -48
  267. data/spec/unit/provider/package/gem_spec.rb +32 -0
  268. data/spec/unit/provider/package/puppet_gem_spec.rb +3 -2
  269. data/spec/unit/provider/service/smf_spec.rb +401 -165
  270. data/spec/unit/provider/service/windows_spec.rb +0 -1
  271. data/spec/unit/provider_spec.rb +0 -12
  272. data/spec/unit/resource/type_collection_spec.rb +2 -22
  273. data/spec/unit/resource_spec.rb +0 -56
  274. data/spec/unit/settings/http_extra_headers_spec.rb +2 -4
  275. data/spec/unit/settings/integer_setting_spec.rb +42 -0
  276. data/spec/unit/settings/port_setting_spec.rb +31 -0
  277. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  278. data/spec/unit/settings_spec.rb +17 -0
  279. data/spec/unit/ssl/base_spec.rb +36 -3
  280. data/spec/unit/ssl/certificate_request_spec.rb +19 -55
  281. data/spec/unit/ssl/certificate_spec.rb +2 -11
  282. data/spec/unit/ssl/state_machine_spec.rb +0 -1
  283. data/spec/unit/ssl/verifier_spec.rb +0 -21
  284. data/spec/unit/transaction/report_spec.rb +0 -2
  285. data/spec/unit/transaction/resource_harness_spec.rb +2 -2
  286. data/spec/unit/transaction_spec.rb +45 -79
  287. data/spec/unit/type/file/checksum_spec.rb +6 -6
  288. data/spec/unit/type/file/content_spec.rb +1 -1
  289. data/spec/unit/type/file/ensure_spec.rb +1 -1
  290. data/spec/unit/type/file/mode_spec.rb +1 -1
  291. data/spec/unit/type/file/source_spec.rb +0 -1
  292. data/spec/unit/type/file_spec.rb +12 -6
  293. data/spec/unit/type/package_spec.rb +1 -1
  294. data/spec/unit/type_spec.rb +20 -0
  295. data/spec/unit/util/backups_spec.rb +0 -2
  296. data/spec/unit/util/execution_spec.rb +0 -29
  297. data/spec/unit/util/monkey_patches_spec.rb +0 -6
  298. data/spec/unit/util/run_mode_spec.rb +21 -121
  299. data/spec/unit/util/windows/string_spec.rb +1 -3
  300. data/spec/unit/util/yaml_spec.rb +0 -54
  301. data/spec/unit/util_spec.rb +0 -18
  302. metadata +47 -218
  303. data/conf/auth.conf +0 -150
  304. data/lib/puppet/application/cert.rb +0 -76
  305. data/lib/puppet/application/key.rb +0 -4
  306. data/lib/puppet/application/man.rb +0 -4
  307. data/lib/puppet/application/status.rb +0 -4
  308. data/lib/puppet/face/key.rb +0 -16
  309. data/lib/puppet/face/man.rb +0 -145
  310. data/lib/puppet/face/module/build.rb +0 -14
  311. data/lib/puppet/face/module/generate.rb +0 -14
  312. data/lib/puppet/face/module/search.rb +0 -103
  313. data/lib/puppet/face/status.rb +0 -51
  314. data/lib/puppet/indirector/certificate/file.rb +0 -9
  315. data/lib/puppet/indirector/certificate/rest.rb +0 -18
  316. data/lib/puppet/indirector/certificate_request/file.rb +0 -9
  317. data/lib/puppet/indirector/certificate_request/memory.rb +0 -7
  318. data/lib/puppet/indirector/certificate_request/rest.rb +0 -11
  319. data/lib/puppet/indirector/file_content/http.rb +0 -22
  320. data/lib/puppet/indirector/key/file.rb +0 -46
  321. data/lib/puppet/indirector/key/memory.rb +0 -7
  322. data/lib/puppet/indirector/ssl_file.rb +0 -162
  323. data/lib/puppet/indirector/status.rb +0 -3
  324. data/lib/puppet/indirector/status/local.rb +0 -12
  325. data/lib/puppet/indirector/status/rest.rb +0 -27
  326. data/lib/puppet/module_tool/applications/searcher.rb +0 -29
  327. data/lib/puppet/network/auth_config_parser.rb +0 -90
  328. data/lib/puppet/network/authstore.rb +0 -283
  329. data/lib/puppet/network/http/api/master/v3/authorization.rb +0 -18
  330. data/lib/puppet/network/http/api/master/v3/environment.rb +0 -88
  331. data/lib/puppet/network/http/base_pool.rb +0 -36
  332. data/lib/puppet/network/http/compression.rb +0 -127
  333. data/lib/puppet/network/http/connection_adapter.rb +0 -184
  334. data/lib/puppet/network/http/nocache_pool.rb +0 -28
  335. data/lib/puppet/network/rest_controller.rb +0 -2
  336. data/lib/puppet/network/rights.rb +0 -210
  337. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +0 -66
  338. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +0 -22
  339. data/lib/puppet/parser/environment_compiler.rb +0 -202
  340. data/lib/puppet/pops/types/enumeration.rb +0 -16
  341. data/lib/puppet/resource/capability_finder.rb +0 -154
  342. data/lib/puppet/rest/errors.rb +0 -15
  343. data/lib/puppet/rest/response.rb +0 -35
  344. data/lib/puppet/rest/route.rb +0 -85
  345. data/lib/puppet/rest/routes.rb +0 -135
  346. data/lib/puppet/ssl/host.rb +0 -505
  347. data/lib/puppet/ssl/key.rb +0 -61
  348. data/lib/puppet/ssl/validator.rb +0 -61
  349. data/lib/puppet/ssl/validator/default_validator.rb +0 -209
  350. data/lib/puppet/ssl/validator/no_validator.rb +0 -22
  351. data/lib/puppet/ssl/verifier_adapter.rb +0 -58
  352. data/lib/puppet/status.rb +0 -40
  353. data/lib/puppet/util/connection.rb +0 -88
  354. data/lib/puppet/util/fact_dif.rb +0 -62
  355. data/lib/puppet/util/ssl.rb +0 -83
  356. data/lib/puppet/util/windows/api_types.rb +0 -309
  357. data/lib/puppet/util/windows/monkey_patches/dir.rb +0 -40
  358. data/lib/puppet/vendor/load_pathspec.rb +0 -1
  359. data/lib/puppet/vendor/pathspec/CHANGELOG.md +0 -2
  360. data/lib/puppet/vendor/pathspec/LICENSE +0 -201
  361. data/lib/puppet/vendor/pathspec/PUPPET_README.md +0 -6
  362. data/lib/puppet/vendor/pathspec/README.md +0 -53
  363. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +0 -122
  364. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +0 -275
  365. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +0 -17
  366. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +0 -14
  367. data/man/man8/puppet-key.8 +0 -126
  368. data/man/man8/puppet-man.8 +0 -76
  369. data/man/man8/puppet-status.8 +0 -108
  370. data/spec/integration/network/authconfig_spec.rb +0 -256
  371. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +0 -11
  372. data/spec/unit/application/man_spec.rb +0 -52
  373. data/spec/unit/capability_spec.rb +0 -414
  374. data/spec/unit/face/key_spec.rb +0 -9
  375. data/spec/unit/face/module/search_spec.rb +0 -231
  376. data/spec/unit/face/status_spec.rb +0 -9
  377. data/spec/unit/indirector/certificate/file_spec.rb +0 -14
  378. data/spec/unit/indirector/certificate/rest_spec.rb +0 -61
  379. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -14
  380. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -25
  381. data/spec/unit/indirector/key/file_spec.rb +0 -78
  382. data/spec/unit/indirector/ssl_file_spec.rb +0 -305
  383. data/spec/unit/indirector/status/local_spec.rb +0 -10
  384. data/spec/unit/indirector/status/rest_spec.rb +0 -50
  385. data/spec/unit/module_tool/applications/searcher_spec.rb +0 -38
  386. data/spec/unit/network/auth_config_parser_spec.rb +0 -115
  387. data/spec/unit/network/authstore_spec.rb +0 -422
  388. data/spec/unit/network/http/api/master/v3/authorization_spec.rb +0 -57
  389. data/spec/unit/network/http/api/master/v3/environment_spec.rb +0 -185
  390. data/spec/unit/network/http/compression_spec.rb +0 -240
  391. data/spec/unit/network/http/nocache_pool_spec.rb +0 -64
  392. data/spec/unit/network/http_spec.rb +0 -9
  393. data/spec/unit/network/rights_spec.rb +0 -439
  394. data/spec/unit/parser/environment_compiler_spec.rb +0 -730
  395. data/spec/unit/pops/types/enumeration_spec.rb +0 -51
  396. data/spec/unit/resource/capability_finder_spec.rb +0 -148
  397. data/spec/unit/rest/route_spec.rb +0 -132
  398. data/spec/unit/ssl/host_spec.rb +0 -645
  399. data/spec/unit/ssl/key_spec.rb +0 -173
  400. data/spec/unit/ssl/validator_spec.rb +0 -278
  401. data/spec/unit/status_spec.rb +0 -45
  402. data/spec/unit/util/ssl_spec.rb +0 -91
@@ -1,4 +1,5 @@
1
1
  require 'puppet/util/windows'
2
+ require 'puppet/error'
2
3
 
3
4
  # represents an error resulting from a Win32 error code
4
5
  class Puppet::Util::Windows::Error < Puppet::Error
@@ -46,8 +46,8 @@ class Puppet::Util::Windows::EventLog
46
46
  end
47
47
 
48
48
  # Report an event to this instance's event log handle. Accepts a string to
49
- # report (:data => <string>) and event type (:event_type => FixNum) and id
50
- # (:event_id => FixNum) as returned by #to_native. The additional arguments to
49
+ # report (:data => <string>) and event type (:event_type => Integer) and id
50
+ # (:event_id => Integer) as returned by #to_native. The additional arguments to
51
51
  # ReportEventW seen in this method aren't exposed - though ReportEventW
52
52
  # technically can accept multiple strings as well as raw binary data to log,
53
53
  # we accept a single string from Puppet::Util::Log
@@ -126,13 +126,8 @@ class Puppet::Util::Windows::EventLog
126
126
  def wide_string(str)
127
127
  # if given a nil string, assume caller wants to pass a nil pointer to win32
128
128
  return nil if str.nil?
129
- # ruby (< 2.1) does not respect multibyte terminators, so it is possible
130
- # for a string to contain a single trailing null byte, followed by garbage
131
- # causing buffer overruns.
132
- #
133
- # See http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?revision=41920&view=revision
134
- newstr = str + "\0".encode(str.encoding)
135
- newstr.encode!('UTF-16LE')
129
+
130
+ str.encode('UTF-16LE')
136
131
  end
137
132
 
138
133
  # Private duplicate of Puppet::Util::Windows::ApiTypes::from_string_to_wide_string
@@ -1,74 +1,15 @@
1
- require 'puppet/util/windows'
1
+ require 'puppet/ffi/windows'
2
2
 
3
3
  module Puppet::Util::Windows::File
4
- require 'ffi'
5
- extend FFI::Library
6
4
  extend Puppet::Util::Windows::String
7
5
 
8
- FILE_ATTRIBUTE_READONLY = 0x00000001
9
-
10
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa379607(v=vs.85).aspx
11
- # The right to use the object for synchronization. This enables a thread to
12
- # wait until the object is in the signaled state. Some object types do not
13
- # support this access right.
14
- SYNCHRONIZE = 0x100000
15
- # The right to delete the object.
16
- DELETE = 0x00010000
17
- # The right to read the information in the object's security descriptor, not including the information in the system access control list (SACL).
18
- # READ_CONTROL = 0x00020000
19
- # The right to modify the discretionary access control list (DACL) in the object's security descriptor.
20
- WRITE_DAC = 0x00040000
21
- # The right to change the owner in the object's security descriptor.
22
- WRITE_OWNER = 0x00080000
23
-
24
- # Combines DELETE, READ_CONTROL, WRITE_DAC, and WRITE_OWNER access.
25
- STANDARD_RIGHTS_REQUIRED = 0xf0000
26
- # Currently defined to equal READ_CONTROL.
27
- STANDARD_RIGHTS_READ = 0x20000
28
- # Currently defined to equal READ_CONTROL.
29
- STANDARD_RIGHTS_WRITE = 0x20000
30
- # Currently defined to equal READ_CONTROL.
31
- STANDARD_RIGHTS_EXECUTE = 0x20000
32
- # Combines DELETE, READ_CONTROL, WRITE_DAC, WRITE_OWNER, and SYNCHRONIZE access.
33
- STANDARD_RIGHTS_ALL = 0x1F0000
34
- SPECIFIC_RIGHTS_ALL = 0xFFFF
35
-
36
- FILE_READ_DATA = 1
37
- FILE_WRITE_DATA = 2
38
- FILE_APPEND_DATA = 4
39
- FILE_READ_EA = 8
40
- FILE_WRITE_EA = 16
41
- FILE_EXECUTE = 32
42
- FILE_DELETE_CHILD = 64
43
- FILE_READ_ATTRIBUTES = 128
44
- FILE_WRITE_ATTRIBUTES = 256
45
-
46
- FILE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF
47
-
48
- FILE_GENERIC_READ =
49
- STANDARD_RIGHTS_READ |
50
- FILE_READ_DATA |
51
- FILE_READ_ATTRIBUTES |
52
- FILE_READ_EA |
53
- SYNCHRONIZE
54
-
55
- FILE_GENERIC_WRITE =
56
- STANDARD_RIGHTS_WRITE |
57
- FILE_WRITE_DATA |
58
- FILE_WRITE_ATTRIBUTES |
59
- FILE_WRITE_EA |
60
- FILE_APPEND_DATA |
61
- SYNCHRONIZE
62
-
63
- FILE_GENERIC_EXECUTE =
64
- STANDARD_RIGHTS_EXECUTE |
65
- FILE_READ_ATTRIBUTES |
66
- FILE_EXECUTE |
67
- SYNCHRONIZE
68
-
69
- REPLACEFILE_WRITE_THROUGH = 0x1
70
- REPLACEFILE_IGNORE_MERGE_ERRORS = 0x2
71
- REPLACEFILE_IGNORE_ACL_ERRORS = 0x3
6
+ include Puppet::FFI::Windows::Constants
7
+
8
+ extend Puppet::FFI::Windows::Structs
9
+ include Puppet::FFI::Windows::Structs
10
+
11
+ include Puppet::FFI::Windows::Functions
12
+ extend Puppet::FFI::Windows::Functions
72
13
 
73
14
  def replace_file(target, source)
74
15
  target_encoded = wide_string(target.to_s)
@@ -111,7 +52,6 @@ module Puppet::Util::Windows::File
111
52
  end
112
53
  module_function :symlink
113
54
 
114
-
115
55
  def exist?(path)
116
56
  path = path.to_str if path.respond_to?(:to_str) # support WatchedFile
117
57
  path = path.to_s # support String and Pathname
@@ -144,9 +84,6 @@ module Puppet::Util::Windows::File
144
84
  end
145
85
  module_function :exist?
146
86
 
147
-
148
- INVALID_FILE_ATTRIBUTES = 0xFFFFFFFF #define INVALID_FILE_ATTRIBUTES (DWORD (-1))
149
-
150
87
  def get_attributes(file_name, raise_on_invalid = true)
151
88
  result = GetFileAttributesW(wide_string(file_name.to_s))
152
89
  if raise_on_invalid && result == INVALID_FILE_ATTRIBUTES
@@ -199,18 +136,6 @@ module Puppet::Util::Windows::File
199
136
  "#{flags_and_attributes.to_s(8)}, #{template_file_handle})")
200
137
  end
201
138
 
202
- IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003
203
- IO_REPARSE_TAG_HSM = 0xC0000004
204
- IO_REPARSE_TAG_HSM2 = 0x80000006
205
- IO_REPARSE_TAG_SIS = 0x80000007
206
- IO_REPARSE_TAG_WIM = 0x80000008
207
- IO_REPARSE_TAG_CSV = 0x80000009
208
- IO_REPARSE_TAG_DFS = 0x8000000A
209
- IO_REPARSE_TAG_SYMLINK = 0xA000000C
210
- IO_REPARSE_TAG_DFSR = 0x80000012
211
- IO_REPARSE_TAG_DEDUP = 0x80000013
212
- IO_REPARSE_TAG_NFS = 0x80000014
213
-
214
139
  def self.get_reparse_point_data(handle, &block)
215
140
  # must be multiple of 1024, min 10240
216
141
  FFI::MemoryPointer.new(MAXIMUM_REPARSE_DATA_BUFFER_SIZE) do |reparse_data_buffer_ptr|
@@ -276,7 +201,6 @@ module Puppet::Util::Windows::File
276
201
  out_buffer
277
202
  end
278
203
 
279
- FILE_ATTRIBUTE_REPARSE_POINT = 0x400
280
204
  def reparse_point?(file_name)
281
205
  attributes = get_attributes(file_name, false)
282
206
 
@@ -291,16 +215,6 @@ module Puppet::Util::Windows::File
291
215
  end
292
216
  module_function :symlink?
293
217
 
294
- GENERIC_READ = 0x80000000
295
- GENERIC_WRITE = 0x40000000
296
- GENERIC_EXECUTE = 0x20000000
297
- GENERIC_ALL = 0x10000000
298
- FILE_SHARE_READ = 1
299
- FILE_SHARE_WRITE = 2
300
- OPEN_EXISTING = 3
301
- FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
302
- FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
303
-
304
218
  def self.open_symlink(link_name)
305
219
  begin
306
220
  yield handle = create_file(
@@ -329,9 +243,6 @@ module Puppet::Util::Windows::File
329
243
  end
330
244
  module_function :readlink
331
245
 
332
- ERROR_FILE_NOT_FOUND = 2
333
- ERROR_PATH_NOT_FOUND = 3
334
-
335
246
  def get_long_pathname(path)
336
247
  converted = ''
337
248
  FFI::Pointer.from_string_to_wide_string(path) do |path_ptr|
@@ -411,9 +322,6 @@ module Puppet::Util::Windows::File
411
322
  end
412
323
  module_function :lstat
413
324
 
414
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364571(v=vs.85).aspx
415
- FSCTL_GET_REPARSE_POINT = 0x900a8
416
-
417
325
  def self.resolve_symlink(handle)
418
326
  path = nil
419
327
  get_reparse_point_data(handle) do |reparse_data|
@@ -444,146 +352,4 @@ module Puppet::Util::Windows::File
444
352
  symlink
445
353
  end
446
354
  private_class_method :symlink_reparse_point?
447
-
448
- ffi_convention :stdcall
449
-
450
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa365512(v=vs.85).aspx
451
- # BOOL WINAPI ReplaceFile(
452
- # _In_ LPCTSTR lpReplacedFileName,
453
- # _In_ LPCTSTR lpReplacementFileName,
454
- # _In_opt_ LPCTSTR lpBackupFileName,
455
- # _In_ DWORD dwReplaceFlags - 0x1 REPLACEFILE_WRITE_THROUGH,
456
- # 0x2 REPLACEFILE_IGNORE_MERGE_ERRORS,
457
- # 0x4 REPLACEFILE_IGNORE_ACL_ERRORS
458
- # _Reserved_ LPVOID lpExclude,
459
- # _Reserved_ LPVOID lpReserved
460
- # );
461
- ffi_lib :kernel32
462
- attach_function_private :ReplaceFileW,
463
- [:lpcwstr, :lpcwstr, :lpcwstr, :dword, :lpvoid, :lpvoid], :win32_bool
464
-
465
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa365240(v=vs.85).aspx
466
- # BOOL WINAPI MoveFileEx(
467
- # _In_ LPCTSTR lpExistingFileName,
468
- # _In_opt_ LPCTSTR lpNewFileName,
469
- # _In_ DWORD dwFlags
470
- # );
471
- ffi_lib :kernel32
472
- attach_function_private :MoveFileExW,
473
- [:lpcwstr, :lpcwstr, :dword], :win32_bool
474
-
475
- # BOOLEAN WINAPI CreateSymbolicLink(
476
- # _In_ LPTSTR lpSymlinkFileName, - symbolic link to be created
477
- # _In_ LPTSTR lpTargetFileName, - name of target for symbolic link
478
- # _In_ DWORD dwFlags - 0x0 target is a file, 0x1 target is a directory
479
- # );
480
- # rescue on Windows < 6.0 so that code doesn't explode
481
- begin
482
- ffi_lib :kernel32
483
- attach_function_private :CreateSymbolicLinkW,
484
- [:lpwstr, :lpwstr, :dword], :boolean
485
- rescue LoadError
486
- end
487
-
488
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364944(v=vs.85).aspx
489
- # DWORD WINAPI GetFileAttributes(
490
- # _In_ LPCTSTR lpFileName
491
- # );
492
- ffi_lib :kernel32
493
- attach_function_private :GetFileAttributesW,
494
- [:lpcwstr], :dword
495
-
496
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa365535(v=vs.85).aspx
497
- # BOOL WINAPI SetFileAttributes(
498
- # _In_ LPCTSTR lpFileName,
499
- # _In_ DWORD dwFileAttributes
500
- # );
501
- ffi_lib :kernel32
502
- attach_function_private :SetFileAttributesW,
503
- [:lpcwstr, :dword], :win32_bool
504
-
505
- # HANDLE WINAPI CreateFile(
506
- # _In_ LPCTSTR lpFileName,
507
- # _In_ DWORD dwDesiredAccess,
508
- # _In_ DWORD dwShareMode,
509
- # _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
510
- # _In_ DWORD dwCreationDisposition,
511
- # _In_ DWORD dwFlagsAndAttributes,
512
- # _In_opt_ HANDLE hTemplateFile
513
- # );
514
- ffi_lib :kernel32
515
- attach_function_private :CreateFileW,
516
- [:lpcwstr, :dword, :dword, :pointer, :dword, :dword, :handle], :handle
517
-
518
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa363216(v=vs.85).aspx
519
- # BOOL WINAPI DeviceIoControl(
520
- # _In_ HANDLE hDevice,
521
- # _In_ DWORD dwIoControlCode,
522
- # _In_opt_ LPVOID lpInBuffer,
523
- # _In_ DWORD nInBufferSize,
524
- # _Out_opt_ LPVOID lpOutBuffer,
525
- # _In_ DWORD nOutBufferSize,
526
- # _Out_opt_ LPDWORD lpBytesReturned,
527
- # _Inout_opt_ LPOVERLAPPED lpOverlapped
528
- # );
529
- ffi_lib :kernel32
530
- attach_function_private :DeviceIoControl,
531
- [:handle, :dword, :lpvoid, :dword, :lpvoid, :dword, :lpdword, :pointer], :win32_bool
532
-
533
- MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16384
534
-
535
- # SYMLINK_REPARSE_DATA_BUFFER
536
- # https://msdn.microsoft.com/en-us/library/cc232006.aspx
537
- # https://msdn.microsoft.com/en-us/library/windows/hardware/ff552012(v=vs.85).aspx
538
- # struct is always MAXIMUM_REPARSE_DATA_BUFFER_SIZE bytes
539
- class SYMLINK_REPARSE_DATA_BUFFER < FFI::Struct
540
- layout :ReparseTag, :win32_ulong,
541
- :ReparseDataLength, :ushort,
542
- :Reserved, :ushort,
543
- :SubstituteNameOffset, :ushort,
544
- :SubstituteNameLength, :ushort,
545
- :PrintNameOffset, :ushort,
546
- :PrintNameLength, :ushort,
547
- :Flags, :win32_ulong,
548
- # max less above fields dword / uint 4 bytes, ushort 2 bytes
549
- # technically a WCHAR buffer, but we care about size in bytes here
550
- :PathBuffer, [:byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE - 20]
551
- end
552
-
553
- # MOUNT_POINT_REPARSE_DATA_BUFFER
554
- # https://msdn.microsoft.com/en-us/library/cc232007.aspx
555
- # https://msdn.microsoft.com/en-us/library/windows/hardware/ff552012(v=vs.85).aspx
556
- # struct is always MAXIMUM_REPARSE_DATA_BUFFER_SIZE bytes
557
- class MOUNT_POINT_REPARSE_DATA_BUFFER < FFI::Struct
558
- layout :ReparseTag, :win32_ulong,
559
- :ReparseDataLength, :ushort,
560
- :Reserved, :ushort,
561
- :SubstituteNameOffset, :ushort,
562
- :SubstituteNameLength, :ushort,
563
- :PrintNameOffset, :ushort,
564
- :PrintNameLength, :ushort,
565
- # max less above fields dword / uint 4 bytes, ushort 2 bytes
566
- # technically a WCHAR buffer, but we care about size in bytes here
567
- :PathBuffer, [:byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE - 16]
568
- end
569
-
570
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364980(v=vs.85).aspx
571
- # DWORD WINAPI GetLongPathName(
572
- # _In_ LPCTSTR lpszShortPath,
573
- # _Out_ LPTSTR lpszLongPath,
574
- # _In_ DWORD cchBuffer
575
- # );
576
- ffi_lib :kernel32
577
- attach_function_private :GetLongPathNameW,
578
- [:lpcwstr, :lpwstr, :dword], :dword
579
-
580
- # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364989(v=vs.85).aspx
581
- # DWORD WINAPI GetShortPathName(
582
- # _In_ LPCTSTR lpszLongPath,
583
- # _Out_ LPTSTR lpszShortPath,
584
- # _In_ DWORD cchBuffer
585
- # );
586
- ffi_lib :kernel32
587
- attach_function_private :GetShortPathNameW,
588
- [:lpcwstr, :lpwstr, :dword], :dword
589
355
  end
@@ -0,0 +1,414 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ffi'
4
+ require 'puppet/ffi/windows'
5
+ require 'puppet/util/windows/string'
6
+
7
+ module Process
8
+ extend FFI::Library
9
+ extend Puppet::Util::Windows::String
10
+
11
+ extend Puppet::FFI::Windows::APITypes
12
+ extend Puppet::FFI::Windows::Functions
13
+ extend Puppet::FFI::Windows::Structs
14
+
15
+ include Puppet::FFI::Windows::Constants
16
+ include Puppet::FFI::Windows::Structs
17
+
18
+ ProcessInfo = Struct.new(
19
+ 'ProcessInfo',
20
+ :process_handle,
21
+ :thread_handle,
22
+ :process_id,
23
+ :thread_id
24
+ )
25
+
26
+ private_constant :ProcessInfo
27
+
28
+ # Disable popups. This mostly affects the Process.kill method.
29
+ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX)
30
+
31
+ class << self
32
+
33
+ private :SetHandleInformation, :SetErrorMode, :CreateProcessW, :OpenProcess,
34
+ :SetPriorityClass, :CreateProcessWithLogonW, :get_osfhandle, :get_errno
35
+
36
+ # Process.create(key => value, ...) => ProcessInfo
37
+ #
38
+ # This is a wrapper for the CreateProcess() function. It executes a process,
39
+ # returning a ProcessInfo struct. It accepts a hash as an argument.
40
+ # There are several primary keys:
41
+ #
42
+ # * command_line (this or app_name must be present)
43
+ # * app_name (default: nil)
44
+ # * inherit (default: false)
45
+ # * process_inherit (default: false)
46
+ # * thread_inherit (default: false)
47
+ # * creation_flags (default: 0)
48
+ # * cwd (default: Dir.pwd)
49
+ # * startup_info (default: nil)
50
+ # * environment (default: nil)
51
+ # * close_handles (default: true)
52
+ # * with_logon (default: nil)
53
+ # * domain (default: nil)
54
+ # * password (default: nil, mandatory if with_logon)
55
+ #
56
+ # Of these, the 'command_line' or 'app_name' must be specified or an
57
+ # error is raised. Both may be set individually, but 'command_line' should
58
+ # be preferred if only one of them is set because it does not (necessarily)
59
+ # require an explicit path or extension to work.
60
+ #
61
+ # The 'domain' and 'password' options are only relevent in the context
62
+ # of 'with_logon'. If 'with_logon' is set, then the 'password' option is
63
+ # mandatory.
64
+ #
65
+ # The startup_info key takes a hash. Its keys are attributes that are
66
+ # part of the StartupInfo struct, and are generally only meaningful for
67
+ # GUI or console processes. See the documentation on CreateProcess()
68
+ # and the StartupInfo struct on MSDN for more information.
69
+ #
70
+ # * desktop
71
+ # * title
72
+ # * x
73
+ # * y
74
+ # * x_size
75
+ # * y_size
76
+ # * x_count_chars
77
+ # * y_count_chars
78
+ # * fill_attribute
79
+ # * sw_flags
80
+ # * startf_flags
81
+ # * stdin
82
+ # * stdout
83
+ # * stderr
84
+ #
85
+ # Note that the 'stdin', 'stdout' and 'stderr' options can be either Ruby
86
+ # IO objects or file descriptors (i.e. a fileno). However, StringIO objects
87
+ # are not currently supported. Unfortunately, setting these is not currently
88
+ # an option for JRuby.
89
+ #
90
+ # If 'stdin', 'stdout' or 'stderr' are specified, then the +inherit+ value
91
+ # is automatically set to true and the Process::STARTF_USESTDHANDLES flag is
92
+ # automatically OR'd to the +startf_flags+ value.
93
+ #
94
+ # The ProcessInfo struct contains the following members:
95
+ #
96
+ # * process_handle - The handle to the newly created process.
97
+ # * thread_handle - The handle to the primary thread of the process.
98
+ # * process_id - Process ID.
99
+ # * thread_id - Thread ID.
100
+ #
101
+ # If the 'close_handles' option is set to true (the default) then the
102
+ # process_handle and the thread_handle are automatically closed for you
103
+ # before the ProcessInfo struct is returned.
104
+ #
105
+ # If the 'with_logon' option is set, then the process runs the specified
106
+ # executable file in the security context of the specified credentials.
107
+
108
+ VALID_KEYS = %i[
109
+ app_name command_line inherit creation_flags cwd environment
110
+ startup_info thread_inherit process_inherit close_handles with_logon
111
+ domain password
112
+ ].freeze
113
+
114
+ VALID_SI_KEYS = %i[
115
+ startf_flags desktop title x y x_size y_size x_count_chars
116
+ y_count_chars fill_attribute sw_flags stdin stdout stderr
117
+ ].freeze
118
+
119
+ private_constant :VALID_KEYS, :VALID_SI_KEYS
120
+
121
+ def create(args)
122
+ # Validate that args is a Hash
123
+ validate_args(args)
124
+
125
+ initialize_defaults
126
+
127
+ # Validate the keys, and convert symbols and case to lowercase strings.
128
+ validate_keys(args)
129
+
130
+ # If the startup_info key is present, validate its subkeys
131
+ validate_startup_info if hash[:startup_info]
132
+
133
+ # validates that 'app_name' or 'command_line' is set
134
+ validate_command_line
135
+
136
+ if hash[:app_name] && !hash[:command_line]
137
+ hash[:command_line] = hash[:app_name]
138
+ hash[:app_name] = nil
139
+ end
140
+
141
+ # Setup stdin, stdout and stderr handlers
142
+ setup_std_handlers
143
+
144
+ if logon
145
+ create_process_with_logon
146
+ else
147
+ create_process
148
+ end
149
+
150
+ # Automatically close the process and thread handles in the
151
+ # PROCESS_INFORMATION struct unless explicitly told not to.
152
+ if hash[:close_handles]
153
+ FFI::WIN32.CloseHandle(procinfo[:hProcess])
154
+ FFI::WIN32.CloseHandle(procinfo[:hThread])
155
+ end
156
+
157
+ ProcessInfo.new(
158
+ procinfo[:hProcess],
159
+ procinfo[:hThread],
160
+ procinfo[:dwProcessId],
161
+ procinfo[:dwThreadId]
162
+ )
163
+ end
164
+
165
+ remove_method :setpriority
166
+
167
+ # Sets the priority class for the specified process id +int+.
168
+ #
169
+ # The +kind+ parameter is ignored but present for API compatibility.
170
+ # You can only retrieve process information, not process group or user
171
+ # information, so it is effectively always Process::PRIO_PROCESS.
172
+ #
173
+ # Possible +int_priority+ values are:
174
+ #
175
+ # * Process::NORMAL_PRIORITY_CLASS
176
+ # * Process::IDLE_PRIORITY_CLASS
177
+ # * Process::HIGH_PRIORITY_CLASS
178
+ # * Process::REALTIME_PRIORITY_CLASS
179
+ # * Process::BELOW_NORMAL_PRIORITY_CLASS
180
+ # * Process::ABOVE_NORMAL_PRIORITY_CLASS
181
+
182
+ def setpriority(kind, int, int_priority)
183
+ raise TypeError unless kind.is_a?(Integer)
184
+ raise TypeError unless int.is_a?(Integer)
185
+ raise TypeError unless int_priority.is_a?(Integer)
186
+
187
+ int = Process.pid if int == 0
188
+ handle = OpenProcess(PROCESS_SET_INFORMATION, 0 , int)
189
+
190
+ if handle == 0
191
+ raise SystemCallError, FFI.errno, "OpenProcess"
192
+ end
193
+
194
+ begin
195
+ result = SetPriorityClass(handle, int_priority)
196
+ raise SystemCallError, FFI.errno, "SetPriorityClass" unless result
197
+ ensure
198
+ FFI::WIN32.CloseHandle(handle)
199
+ end
200
+
201
+ return 0
202
+ end
203
+
204
+ private
205
+
206
+ def initialize_defaults
207
+ @hash = {
208
+ app_name: nil,
209
+ creation_flags: 0,
210
+ close_handles: true
211
+ }
212
+ @si_hash = nil
213
+ @procinfo = nil
214
+ end
215
+
216
+ def validate_args(args)
217
+ raise TypeError, 'hash keyword arguments expected' unless args.is_a?(Hash)
218
+ end
219
+
220
+ def validate_keys(args)
221
+ args.each do |key, val|
222
+ key = key.to_s.to_sym
223
+ raise ArgumentError, "invalid key '#{key}'" unless VALID_KEYS.include?(key)
224
+
225
+ hash[key] = val
226
+ end
227
+ end
228
+
229
+ def validate_startup_info
230
+ hash[:startup_info].each do |key, val|
231
+ key = key.to_s.to_sym
232
+ raise ArgumentError, "invalid startup_info key '#{key}'" unless VALID_SI_KEYS.include?(key)
233
+
234
+ si_hash[key] = val
235
+ end
236
+ end
237
+
238
+ def validate_command_line
239
+ raise ArgumentError, 'command_line or app_name must be specified' unless hash[:app_name] || hash[:command_line]
240
+ end
241
+
242
+ def procinfo
243
+ @procinfo ||= PROCESS_INFORMATION.new
244
+ end
245
+
246
+ def hash
247
+ @hash ||= {}
248
+ end
249
+
250
+ def si_hash
251
+ @si_hash ||= {}
252
+ end
253
+
254
+ def app
255
+ wide_string(hash[:app_name])
256
+ end
257
+
258
+ def cmd
259
+ wide_string(hash[:command_line])
260
+ end
261
+
262
+ def cwd
263
+ wide_string(hash[:cwd])
264
+ end
265
+
266
+ def password
267
+ wide_string(hash[:password])
268
+ end
269
+
270
+ def logon
271
+ wide_string(hash[:with_logon])
272
+ end
273
+
274
+ def domain
275
+ wide_string(hash[:domain])
276
+ end
277
+
278
+ def env
279
+ env = hash[:environment]
280
+ return unless env
281
+
282
+ env = env.split(File::PATH_SEPARATOR) unless env.respond_to?(:join)
283
+ env = env.map { |e| e + 0.chr }.join('') + 0.chr
284
+ env = wide_string(env) if hash[:with_logon]
285
+ env
286
+ end
287
+
288
+ def process_security
289
+ return unless hash[:process_inherit]
290
+
291
+ process_security = SECURITY_ATTRIBUTES.new
292
+ process_security[:nLength] = SECURITY_ATTRIBUTES.size
293
+ process_security[:bInheritHandle] = 1
294
+ process_security
295
+ end
296
+
297
+ def thread_security
298
+ return unless hash[:thread_inherit]
299
+
300
+ thread_security = SECURITY_ATTRIBUTES.new
301
+ thread_security[:nLength] = SECURITY_ATTRIBUTES.size
302
+ thread_security[:bInheritHandle] = 1
303
+ thread_security
304
+ end
305
+
306
+ # Automatically handle stdin, stdout and stderr as either IO objects
307
+ # or file descriptors. This won't work for StringIO, however. It also
308
+ # will not work on JRuby because of the way it handles internal file
309
+ # descriptors.
310
+ def setup_std_handlers
311
+ %i[stdin stdout stderr].each do |io|
312
+ next unless si_hash[io]
313
+
314
+ handle = if si_hash[io].respond_to?(:fileno)
315
+ get_osfhandle(si_hash[io].fileno)
316
+ else
317
+ get_osfhandle(si_hash[io])
318
+ end
319
+
320
+ if handle == INVALID_HANDLE_VALUE
321
+ ptr = FFI::MemoryPointer.new(:int)
322
+
323
+ errno = if get_errno(ptr).zero?
324
+ ptr.read_int
325
+ else
326
+ FFI.errno
327
+ end
328
+
329
+ raise SystemCallError.new('get_osfhandle', errno)
330
+ end
331
+
332
+ # Most implementations of Ruby on Windows create inheritable
333
+ # handles by default, but some do not. RF bug #26988.
334
+ bool = SetHandleInformation(
335
+ handle,
336
+ HANDLE_FLAG_INHERIT,
337
+ HANDLE_FLAG_INHERIT
338
+ )
339
+
340
+ raise SystemCallError.new('SetHandleInformation', FFI.errno) unless bool
341
+
342
+ si_hash[io] = handle
343
+ si_hash[:startf_flags] ||= 0
344
+ si_hash[:startf_flags] |= STARTF_USESTDHANDLES
345
+ hash[:inherit] = true
346
+ end
347
+ end
348
+
349
+ def startinfo
350
+ startinfo = STARTUPINFO.new
351
+
352
+ return startinfo if si_hash.empty?
353
+
354
+ startinfo[:cb] = startinfo.size
355
+ startinfo[:lpDesktop] = si_hash[:desktop] if si_hash[:desktop]
356
+ startinfo[:lpTitle] = si_hash[:title] if si_hash[:title]
357
+ startinfo[:dwX] = si_hash[:x] if si_hash[:x]
358
+ startinfo[:dwY] = si_hash[:y] if si_hash[:y]
359
+ startinfo[:dwXSize] = si_hash[:x_size] if si_hash[:x_size]
360
+ startinfo[:dwYSize] = si_hash[:y_size] if si_hash[:y_size]
361
+ startinfo[:dwXCountChars] = si_hash[:x_count_chars] if si_hash[:x_count_chars]
362
+ startinfo[:dwYCountChars] = si_hash[:y_count_chars] if si_hash[:y_count_chars]
363
+ startinfo[:dwFillAttribute] = si_hash[:fill_attribute] if si_hash[:fill_attribute]
364
+ startinfo[:dwFlags] = si_hash[:startf_flags] if si_hash[:startf_flags]
365
+ startinfo[:wShowWindow] = si_hash[:sw_flags] if si_hash[:sw_flags]
366
+ startinfo[:cbReserved2] = 0
367
+ startinfo[:hStdInput] = si_hash[:stdin] if si_hash[:stdin]
368
+ startinfo[:hStdOutput] = si_hash[:stdout] if si_hash[:stdout]
369
+ startinfo[:hStdError] = si_hash[:stderr] if si_hash[:stderr]
370
+ startinfo
371
+ end
372
+
373
+ def create_process_with_logon
374
+ raise ArgumentError, 'password must be specified if with_logon is used' unless password
375
+
376
+ hash[:creation_flags] |= CREATE_UNICODE_ENVIRONMENT
377
+
378
+ bool = CreateProcessWithLogonW(
379
+ logon, # User
380
+ domain, # Domain
381
+ password, # Password
382
+ LOGON_WITH_PROFILE, # Logon flags
383
+ app, # App name
384
+ cmd, # Command line
385
+ hash[:creation_flags], # Creation flags
386
+ env, # Environment
387
+ cwd, # Working directory
388
+ startinfo, # Startup Info
389
+ procinfo # Process Info
390
+ )
391
+
392
+ raise SystemCallError.new('CreateProcessWithLogonW', FFI.errno) unless bool
393
+ end
394
+
395
+ def create_process
396
+ inherit = hash[:inherit] ? 1 : 0
397
+
398
+ bool = CreateProcessW(
399
+ app, # App name
400
+ cmd, # Command line
401
+ process_security, # Process attributes
402
+ thread_security, # Thread attributes
403
+ inherit, # Inherit handles?
404
+ hash[:creation_flags], # Creation flags
405
+ env, # Environment
406
+ cwd, # Working directory
407
+ startinfo, # Startup Info
408
+ procinfo # Process Info
409
+ )
410
+
411
+ raise SystemCallError.new('CreateProcess', FFI.errno) unless bool
412
+ end
413
+ end
414
+ end