puppet 6.21.1 → 7.4.1

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 -162
  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
@@ -466,11 +466,7 @@ module Puppet::Environments
466
466
  when Float::INFINITY
467
467
  Entry.new(env) # Entry that never expires (avoids syscall to get time)
468
468
  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
469
+ MRUEntry.new(env, ttl) # Entry that expires in ttl from when it was last touched
474
470
  end
475
471
  end
476
472
 
@@ -505,27 +501,12 @@ module Puppet::Environments
505
501
  end
506
502
  end
507
503
 
508
- # Policy that expires in ttl_seconds from when it was created
509
- class TTLEntry < Entry
504
+ # Policy that expires if it hasn't been touched within ttl_seconds
505
+ class MRUEntry < Entry
510
506
  def initialize(value, ttl_seconds)
511
507
  super(value)
512
508
  @ttl = Time.now + ttl_seconds
513
509
  @ttl_seconds = ttl_seconds
514
- end
515
-
516
- def expired?(now)
517
- now > @ttl
518
- end
519
-
520
- def label
521
- "(ttl = #{@ttl_seconds} sec)"
522
- 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
510
 
530
511
  touch
531
512
  end
@@ -534,8 +515,12 @@ module Puppet::Environments
534
515
  @ttl = Time.now + @ttl_seconds
535
516
  end
536
517
 
518
+ def expired?(now)
519
+ now > @ttl
520
+ end
521
+
537
522
  def label
538
- "(mru = #{@ttl_seconds} sec)"
523
+ "(ttl = #{@ttl_seconds} sec)"
539
524
  end
540
525
  end
541
526
  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,92 @@ 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
130
+
131
+ option("--value-only") do
132
+ summary _("Show only the value when the action is called with a single query")
133
+ end
134
+
135
+ option("--timing") do
136
+ summary _("Show how much time it took to resolve each fact.")
137
+ end
129
138
 
130
139
  when_invoked do |*args|
140
+ options = args.pop
141
+
131
142
  Puppet.settings.preferred_run_mode = :agent
132
143
  Puppet::Node::Facts.indirection.terminus_class = :facter
133
144
 
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
145
+ if options[:value_only] && !args.count.eql?(1)
146
+ options[:value_only] = nil
147
+ Puppet.warning("Incorrect use of --value-only argument; it can only be used when querying for a single fact!")
148
+ end
149
+
150
+ options[:user_query] = args
151
+ options[:resolve_options] = true
152
+ result = Puppet::Node::Facts.indirection.find(Puppet.settings[:certname], options)
153
+
154
+ if options[:value_only]
155
+ result.values.values.first
144
156
  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
157
+ result.values
158
+ end
159
+ end
160
+
161
+ when_rendering :console do |result|
162
+ # VALID_TYPES = [Integer, Float, TrueClass, FalseClass, NilClass, Symbol, String, Array, Hash].freeze
163
+ # from https://github.com/puppetlabs/facter/blob/4.0.49/lib/facter/custom_facts/util/normalization.rb#L8
164
+
165
+ case result
166
+ when Array, Hash
167
+ Puppet::Util::Json.dump(result, :pretty => true)
168
+ else # one of VALID_TYPES above
169
+ result
147
170
  end
148
171
  end
149
172
  end
150
173
  end
174
+
@@ -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.
@@ -47,6 +47,14 @@ Puppet::Face.define(:node, '0.0.1') do
47
47
  end
48
48
 
49
49
  class LoggerIO
50
+ def debug(message)
51
+ Puppet.debug(message)
52
+ end
53
+
54
+ def warn(message)
55
+ Puppet.warning(message)
56
+ end
57
+
50
58
  def err(message)
51
59
  Puppet.err(message) unless message =~ /^\s*Error:\s*/
52
60
  end
@@ -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