puppet 4.5.3-x64-mingw32 → 4.6.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 (422) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -1
  3. data/ext/debian/control +2 -4
  4. data/ext/project_data.yaml +4 -4
  5. data/install.rb +6 -2
  6. data/lib/puppet.rb +3 -1
  7. data/lib/puppet/agent/locker.rb +1 -1
  8. data/lib/puppet/application.rb +6 -4
  9. data/lib/puppet/application/agent.rb +2 -1
  10. data/lib/puppet/application/cert.rb +35 -2
  11. data/lib/puppet/application/device.rb +1 -1
  12. data/lib/puppet/application/generate.rb +5 -0
  13. data/lib/puppet/application/lookup.rb +3 -3
  14. data/lib/puppet/application_support.rb +1 -1
  15. data/lib/puppet/compilable_resource_type.rb +15 -0
  16. data/lib/puppet/configurer.rb +67 -10
  17. data/lib/puppet/configurer/plugin_handler.rb +2 -4
  18. data/lib/puppet/data_providers/hiera_config.rb +1 -1
  19. data/lib/puppet/defaults.rb +34 -7
  20. data/lib/puppet/environments.rb +4 -2
  21. data/lib/puppet/error.rb +1 -1
  22. data/lib/puppet/external/dot.rb +1 -1
  23. data/lib/puppet/face/ca.rb +4 -1
  24. data/lib/puppet/face/certificate.rb +7 -1
  25. data/lib/puppet/face/epp.rb +5 -5
  26. data/lib/puppet/face/generate.rb +64 -0
  27. data/lib/puppet/face/help.rb +19 -13
  28. data/lib/puppet/face/man.rb +1 -1
  29. data/lib/puppet/feature/external_facts.rb +1 -1
  30. data/lib/puppet/file_system.rb +16 -0
  31. data/lib/puppet/file_system/file_impl.rb +5 -0
  32. data/lib/puppet/file_system/memory_impl.rb +4 -0
  33. data/lib/puppet/file_system/path_pattern.rb +1 -0
  34. data/lib/puppet/file_system/windows.rb +19 -0
  35. data/lib/puppet/functions.rb +3 -5
  36. data/lib/puppet/functions/assert_type.rb +1 -1
  37. data/lib/puppet/functions/defined.rb +7 -5
  38. data/lib/puppet/functions/dig.rb +2 -18
  39. data/lib/puppet/functions/hiera.rb +1 -1
  40. data/lib/puppet/functions/lest.rb +1 -37
  41. data/lib/puppet/functions/new.rb +2 -473
  42. data/lib/puppet/functions/reverse_each.rb +2 -59
  43. data/lib/puppet/functions/scanf.rb +4 -4
  44. data/lib/puppet/functions/step.rb +1 -63
  45. data/lib/puppet/functions/then.rb +1 -61
  46. data/lib/puppet/functions/type.rb +1 -40
  47. data/lib/puppet/functions/unwrap.rb +40 -0
  48. data/lib/puppet/generate/models/type/property.rb +70 -0
  49. data/lib/puppet/generate/models/type/type.rb +57 -0
  50. data/lib/puppet/generate/templates/type/pcore.erb +41 -0
  51. data/lib/puppet/generate/type.rb +239 -0
  52. data/lib/puppet/graph/simple_graph.rb +2 -6
  53. data/lib/puppet/indirector/catalog/static_compiler.rb +5 -2
  54. data/lib/puppet/indirector/facts/facter.rb +1 -1
  55. data/lib/puppet/indirector/key/ca.rb +2 -2
  56. data/lib/puppet/indirector/request.rb +25 -4
  57. data/lib/puppet/indirector/rest.rb +73 -3
  58. data/lib/puppet/info_service/class_information_service.rb +1 -2
  59. data/lib/puppet/interface/documentation.rb +1 -1
  60. data/lib/puppet/loaders.rb +2 -0
  61. data/lib/puppet/metatype/manager.rb +6 -6
  62. data/lib/puppet/module.rb +8 -1
  63. data/lib/puppet/module_tool.rb +2 -2
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  66. data/lib/puppet/module_tool/metadata.rb +1 -1
  67. data/lib/puppet/network/http/api/indirected_routes.rb +23 -32
  68. data/lib/puppet/network/http/rack/rest.rb +15 -1
  69. data/lib/puppet/network/rights.rb +1 -11
  70. data/lib/puppet/node/environment.rb +7 -3
  71. data/lib/puppet/node/facts.rb +1 -1
  72. data/lib/puppet/parameter.rb +23 -3
  73. data/lib/puppet/parameter/boolean.rb +1 -1
  74. data/lib/puppet/parameter/value.rb +1 -1
  75. data/lib/puppet/parser.rb +0 -1
  76. data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
  77. data/lib/puppet/parser/ast/resource.rb +5 -0
  78. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  79. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  80. data/lib/puppet/parser/compiler.rb +14 -17
  81. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +1 -1
  82. data/lib/puppet/parser/environment_compiler.rb +10 -0
  83. data/lib/puppet/parser/functions/create_resources.rb +39 -24
  84. data/lib/puppet/parser/functions/defined.rb +2 -26
  85. data/lib/puppet/parser/functions/dig.rb +29 -0
  86. data/lib/puppet/parser/functions/lest.rb +49 -0
  87. data/lib/puppet/parser/functions/new.rb +530 -0
  88. data/lib/puppet/parser/functions/require.rb +1 -1
  89. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  90. data/lib/puppet/parser/functions/scanf.rb +4 -4
  91. data/lib/puppet/parser/functions/step.rb +84 -0
  92. data/lib/puppet/parser/functions/then.rb +73 -0
  93. data/lib/puppet/parser/functions/type.rb +53 -0
  94. data/lib/puppet/parser/resource.rb +16 -7
  95. data/lib/puppet/parser/scope.rb +36 -28
  96. data/lib/puppet/parser/type_loader.rb +1 -1
  97. data/lib/puppet/plugins/data_providers/data_provider.rb +1 -1
  98. data/lib/puppet/pops.rb +13 -0
  99. data/lib/puppet/pops/adapters.rb +49 -49
  100. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  101. data/lib/puppet/pops/evaluator/access_operator.rb +39 -2
  102. data/lib/puppet/pops/evaluator/closure.rb +39 -13
  103. data/lib/puppet/pops/evaluator/collector_transformer.rb +10 -1
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +16 -11
  105. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  106. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +0 -1
  107. data/lib/puppet/pops/evaluator/literal_evaluator.rb +0 -1
  108. data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -2
  109. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  110. data/lib/puppet/pops/evaluator/runtime3_support.rb +19 -45
  111. data/lib/puppet/pops/functions/function.rb +5 -0
  112. data/lib/puppet/pops/issues.rb +1 -1
  113. data/lib/puppet/pops/label_provider.rb +2 -2
  114. data/lib/puppet/pops/loader/base_loader.rb +12 -15
  115. data/lib/puppet/pops/loader/loader.rb +15 -50
  116. data/lib/puppet/pops/loader/loader_paths.rb +28 -2
  117. data/lib/puppet/pops/loader/module_loaders.rb +16 -1
  118. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  119. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +12 -11
  120. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  121. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +2 -3
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +52 -13
  123. data/lib/puppet/pops/loader/static_loader.rb +55 -0
  124. data/lib/puppet/pops/loader/type_definition_instantiator.rb +30 -14
  125. data/lib/puppet/pops/loader/typed_name.rb +50 -0
  126. data/lib/puppet/pops/loaders.rb +64 -19
  127. data/lib/puppet/pops/merge_strategy.rb +7 -7
  128. data/lib/puppet/pops/migration/migration_checker.rb +4 -0
  129. data/lib/puppet/pops/model/model_label_provider.rb +2 -0
  130. data/lib/puppet/pops/parser/egrammar.ra +8 -5
  131. data/lib/puppet/pops/parser/eparser.rb +1550 -1498
  132. data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
  133. data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
  134. data/lib/puppet/pops/parser/lexer2.rb +14 -1
  135. data/lib/puppet/pops/parser/locator.rb +30 -1
  136. data/lib/puppet/pops/parser/parser_support.rb +0 -3
  137. data/lib/puppet/pops/parser/slurp_support.rb +3 -3
  138. data/lib/puppet/pops/patterns.rb +9 -1
  139. data/lib/puppet/pops/pcore.rb +67 -11
  140. data/lib/puppet/pops/puppet_stack.rb +43 -0
  141. data/lib/puppet/pops/resource/param.rb +51 -0
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +301 -0
  143. data/lib/puppet/pops/resource/resource_type_set.pcore +21 -0
  144. data/lib/puppet/pops/serialization.rb +17 -0
  145. data/lib/puppet/pops/serialization/abstract_reader.rb +149 -0
  146. data/lib/puppet/pops/serialization/abstract_writer.rb +179 -0
  147. data/lib/puppet/pops/serialization/deserializer.rb +60 -0
  148. data/lib/puppet/pops/serialization/extension.rb +126 -0
  149. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  150. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  151. data/lib/puppet/pops/serialization/json.rb +247 -0
  152. data/lib/puppet/pops/serialization/object.rb +63 -0
  153. data/lib/puppet/pops/serialization/rgen.rb +151 -0
  154. data/lib/puppet/pops/serialization/serializer.rb +91 -0
  155. data/lib/puppet/pops/serialization/time_factory.rb +66 -0
  156. data/lib/puppet/pops/types/annotatable.rb +36 -0
  157. data/lib/puppet/pops/types/implementation_registry.rb +3 -8
  158. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  159. data/lib/puppet/pops/types/p_object_type.rb +110 -117
  160. data/lib/puppet/pops/types/p_runtime_type.rb +13 -0
  161. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +23 -0
  162. data/lib/puppet/pops/types/p_sem_ver_type.rb +30 -2
  163. data/lib/puppet/pops/types/p_sensitive_type.rb +69 -0
  164. data/lib/puppet/pops/types/p_type_set_type.rb +361 -0
  165. data/lib/puppet/pops/types/puppet_object.rb +0 -5
  166. data/lib/puppet/pops/types/ruby_generator.rb +9 -2
  167. data/lib/puppet/pops/types/type_calculator.rb +6 -1
  168. data/lib/puppet/pops/types/type_factory.rb +14 -12
  169. data/lib/puppet/pops/types/type_formatter.rb +78 -33
  170. data/lib/puppet/pops/types/type_mismatch_describer.rb +0 -2
  171. data/lib/puppet/pops/types/type_parser.rb +27 -2
  172. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  173. data/lib/puppet/pops/types/types.rb +366 -13
  174. data/lib/puppet/pops/validation.rb +4 -4
  175. data/lib/puppet/pops/validation/checker4_0.rb +5 -2
  176. data/lib/puppet/pops/visitor.rb +2 -2
  177. data/lib/puppet/property.rb +64 -5
  178. data/lib/puppet/provider.rb +1 -1
  179. data/lib/puppet/provider/aixobject.rb +3 -3
  180. data/lib/puppet/provider/group/aix.rb +4 -4
  181. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  182. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  183. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -2
  184. data/lib/puppet/provider/mount/parsed.rb +1 -1
  185. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  186. data/lib/puppet/provider/package/appdmg.rb +3 -3
  187. data/lib/puppet/provider/package/apple.rb +1 -1
  188. data/lib/puppet/provider/package/dnf.rb +5 -0
  189. data/lib/puppet/provider/package/nim.rb +1 -1
  190. data/lib/puppet/provider/package/pacman.rb +2 -2
  191. data/lib/puppet/provider/package/pip.rb +5 -3
  192. data/lib/puppet/provider/package/pip3.rb +1 -1
  193. data/lib/puppet/provider/package/pkg.rb +5 -5
  194. data/lib/puppet/provider/package/pkgdmg.rb +4 -4
  195. data/lib/puppet/provider/package/pkgin.rb +1 -1
  196. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  197. data/lib/puppet/provider/package/portage.rb +48 -8
  198. data/lib/puppet/provider/package/sun.rb +1 -1
  199. data/lib/puppet/provider/package/tdnf.rb +28 -0
  200. data/lib/puppet/provider/package/yum.rb +22 -4
  201. data/lib/puppet/provider/parsedfile.rb +2 -2
  202. data/lib/puppet/provider/service/base.rb +1 -1
  203. data/lib/puppet/provider/service/bsd.rb +1 -1
  204. data/lib/puppet/provider/service/daemontools.rb +2 -2
  205. data/lib/puppet/provider/service/debian.rb +3 -3
  206. data/lib/puppet/provider/service/init.rb +5 -3
  207. data/lib/puppet/provider/service/launchd.rb +16 -2
  208. data/lib/puppet/provider/service/runit.rb +1 -1
  209. data/lib/puppet/provider/service/smf.rb +8 -1
  210. data/lib/puppet/provider/service/systemd.rb +39 -6
  211. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +3 -2
  213. data/lib/puppet/provider/user/directoryservice.rb +4 -3
  214. data/lib/puppet/provider/user/hpux.rb +1 -1
  215. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  216. data/lib/puppet/provider/user/windows_adsi.rb +3 -0
  217. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  218. data/lib/puppet/reference/type.rb +1 -1
  219. data/lib/puppet/resource.rb +33 -7
  220. data/lib/puppet/resource/capability_finder.rb +74 -54
  221. data/lib/puppet/resource/status.rb +11 -2
  222. data/lib/puppet/settings.rb +17 -6
  223. data/lib/puppet/settings/environment_conf.rb +1 -1
  224. data/lib/puppet/settings/server_list_setting.rb +20 -0
  225. data/lib/puppet/ssl/certificate_authority.rb +32 -9
  226. data/lib/puppet/ssl/certificate_authority/interface.rb +164 -24
  227. data/lib/puppet/ssl/host.rb +3 -3
  228. data/lib/puppet/ssl/oids.rb +10 -0
  229. data/lib/puppet/ssl/validator/default_validator.rb +2 -2
  230. data/lib/puppet/test/test_helper.rb +2 -2
  231. data/lib/puppet/transaction.rb +12 -0
  232. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  233. data/lib/puppet/transaction/event.rb +29 -2
  234. data/lib/puppet/transaction/event_manager.rb +1 -1
  235. data/lib/puppet/transaction/persistence.rb +84 -0
  236. data/lib/puppet/transaction/report.rb +49 -2
  237. data/lib/puppet/transaction/resource_harness.rb +98 -18
  238. data/lib/puppet/type.rb +63 -21
  239. data/lib/puppet/type/augeas.rb +3 -3
  240. data/lib/puppet/type/cron.rb +1 -1
  241. data/lib/puppet/type/file.rb +39 -2
  242. data/lib/puppet/type/file/data_sync.rb +13 -5
  243. data/lib/puppet/type/host.rb +1 -1
  244. data/lib/puppet/type/mount.rb +2 -6
  245. data/lib/puppet/type/notify.rb +1 -1
  246. data/lib/puppet/type/package.rb +1 -1
  247. data/lib/puppet/type/resources.rb +1 -1
  248. data/lib/puppet/type/scheduled_task.rb +1 -1
  249. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  250. data/lib/puppet/type/tidy.rb +1 -1
  251. data/lib/puppet/type/yumrepo.rb +3 -3
  252. data/lib/puppet/type/zone.rb +1 -1
  253. data/lib/puppet/util.rb +2 -2
  254. data/lib/puppet/util/classgen.rb +1 -1
  255. data/lib/puppet/util/command_line.rb +6 -2
  256. data/lib/puppet/util/command_line/trollop.rb +1 -1
  257. data/lib/puppet/util/execution.rb +2 -2
  258. data/lib/puppet/util/http_proxy.rb +1 -1
  259. data/lib/puppet/util/inifile.rb +1 -1
  260. data/lib/puppet/util/instance_loader.rb +1 -1
  261. data/lib/puppet/util/logging.rb +1 -1
  262. data/lib/puppet/util/multi_match.rb +1 -1
  263. data/lib/puppet/util/plist.rb +15 -5
  264. data/lib/puppet/util/profiler.rb +1 -1
  265. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  266. data/lib/puppet/util/psych_support.rb +1 -1
  267. data/lib/puppet/util/rdoc.rb +2 -2
  268. data/lib/puppet/util/rubygems.rb +1 -1
  269. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  270. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  271. data/lib/puppet/util/windows/adsi.rb +30 -8
  272. data/lib/puppet/util/windows/api_types.rb +1 -1
  273. data/lib/puppet/util/windows/file.rb +59 -0
  274. data/lib/puppet/util/windows/process.rb +10 -0
  275. data/lib/puppet/util/windows/security.rb +1 -1
  276. data/lib/puppet/util/windows/user.rb +22 -4
  277. data/lib/puppet/util/yaml.rb +15 -3
  278. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  279. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  280. data/lib/puppet/version.rb +2 -2
  281. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  282. data/spec/integration/agent/logging_spec.rb +15 -14
  283. data/spec/integration/application/apply_spec.rb +1 -0
  284. data/spec/integration/directory_environments_spec.rb +16 -0
  285. data/spec/integration/environments/settings_spec.rb +32 -4
  286. data/spec/integration/faces/documentation_spec.rb +1 -1
  287. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  288. data/spec/integration/node/environment_spec.rb +21 -0
  289. data/spec/integration/parser/collection_spec.rb +10 -0
  290. data/spec/integration/parser/compiler_spec.rb +76 -840
  291. data/spec/integration/parser/functions/require_spec.rb +3 -3
  292. data/spec/integration/parser/parameter_defaults_spec.rb +6 -2
  293. data/spec/integration/parser/pcore_resource_spec.rb +208 -0
  294. data/spec/integration/parser/resource_expressions_spec.rb +4 -2
  295. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  296. data/spec/integration/transaction/report_spec.rb +666 -0
  297. data/spec/integration/type/file_spec.rb +11 -12
  298. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  299. data/spec/integration/util/windows/principal_spec.rb +109 -60
  300. data/spec/integration/util/windows/process_spec.rb +4 -2
  301. data/spec/integration/util/windows/security_spec.rb +34 -8
  302. data/spec/integration/util/windows/user_spec.rb +26 -4
  303. data/spec/lib/puppet_spec/files.rb +2 -2
  304. data/spec/lib/puppet_spec/network.rb +12 -8
  305. data/spec/shared_examples/rhel_package_provider.rb +341 -0
  306. data/spec/spec_helper.rb +8 -2
  307. data/spec/unit/application/cert_spec.rb +20 -0
  308. data/spec/unit/configurer/plugin_handler_spec.rb +0 -26
  309. data/spec/unit/configurer_spec.rb +46 -0
  310. data/spec/unit/defaults_spec.rb +14 -0
  311. data/spec/unit/face/generate_spec.rb +230 -0
  312. data/spec/unit/face/help_spec.rb +53 -0
  313. data/spec/unit/face/parser_spec.rb +6 -0
  314. data/spec/unit/face/plugin_spec.rb +0 -4
  315. data/spec/unit/file_system_spec.rb +85 -0
  316. data/spec/unit/functions/lookup_spec.rb +4 -4
  317. data/spec/unit/functions/match_spec.rb +2 -2
  318. data/spec/unit/functions/regsubst_spec.rb +1 -1
  319. data/spec/unit/functions/split_spec.rb +1 -1
  320. data/spec/unit/functions/unwrap_spec.rb +29 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +8 -8
  323. data/spec/unit/indirector/facts/facter_spec.rb +1 -9
  324. data/spec/unit/indirector/rest_spec.rb +95 -9
  325. data/spec/unit/module_spec.rb +43 -7
  326. data/spec/unit/module_tool/applications/installer_spec.rb +10 -1
  327. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  328. data/spec/unit/module_tool/applications/upgrader_spec.rb +8 -0
  329. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +49 -58
  331. data/spec/unit/network/http/api/master/v3_spec.rb +7 -4
  332. data/spec/unit/network/rights_spec.rb +1 -1
  333. data/spec/unit/parameter_spec.rb +11 -0
  334. data/spec/unit/parser/compiler_spec.rb +19 -33
  335. data/spec/unit/{appmgmt_spec.rb → parser/environment_compiler_spec.rb} +12 -1
  336. data/spec/unit/parser/functions/create_resources_spec.rb +76 -4
  337. data/spec/unit/parser/functions/require_spec.rb +2 -2
  338. data/spec/unit/parser/resource_spec.rb +21 -11
  339. data/spec/unit/parser/scope_spec.rb +1 -5
  340. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1 -1
  341. data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
  342. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +63 -5
  344. data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
  345. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  346. data/spec/unit/pops/parser/lexer2_spec.rb +27 -3
  347. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +8 -0
  348. data/spec/unit/pops/parser/parse_calls_spec.rb +9 -0
  349. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  350. data/spec/unit/pops/resource/resource_type_impl_spec.rb +37 -0
  351. data/spec/unit/pops/serialization/packer_spec.rb +153 -0
  352. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  353. data/spec/unit/pops/serialization/serialization_spec.rb +228 -0
  354. data/spec/unit/pops/types/p_object_type_spec.rb +44 -2
  355. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +42 -0
  356. data/spec/unit/pops/types/p_sensitive_type_spec.rb +139 -0
  357. data/spec/unit/pops/types/p_type_set_type_spec.rb +424 -0
  358. data/spec/unit/pops/types/ruby_generator_spec.rb +497 -181
  359. data/spec/unit/pops/types/type_calculator_spec.rb +10 -4
  360. data/spec/unit/pops/types/type_formatter_spec.rb +1 -1
  361. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  362. data/spec/unit/pops/types/type_parser_spec.rb +1 -1
  363. data/spec/unit/pops/types/types_spec.rb +1 -1
  364. data/spec/unit/pops/validator/validator_spec.rb +18 -1
  365. data/spec/unit/property_spec.rb +48 -11
  366. data/spec/unit/provider/group/windows_adsi_spec.rb +11 -1
  367. data/spec/unit/provider/package/dnf_spec.rb +1 -99
  368. data/spec/unit/provider/package/pacman_spec.rb +4 -4
  369. data/spec/unit/provider/package/pip_spec.rb +14 -0
  370. data/spec/unit/provider/package/pkg_spec.rb +6 -0
  371. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -3
  372. data/spec/unit/provider/package/portage_spec.rb +64 -8
  373. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  374. data/spec/unit/provider/package/windows/package_spec.rb +4 -1
  375. data/spec/unit/provider/package/windows_spec.rb +8 -2
  376. data/spec/unit/provider/package/yum_spec.rb +6 -377
  377. data/spec/unit/provider/service/base_spec.rb +6 -0
  378. data/spec/unit/provider/service/debian_spec.rb +16 -7
  379. data/spec/unit/provider/service/gentoo_spec.rb +6 -0
  380. data/spec/unit/provider/service/init_spec.rb +7 -0
  381. data/spec/unit/provider/service/launchd_spec.rb +35 -4
  382. data/spec/unit/provider/service/openrc_spec.rb +6 -0
  383. data/spec/unit/provider/service/smf_spec.rb +31 -6
  384. data/spec/unit/provider/service/src_spec.rb +6 -0
  385. data/spec/unit/provider/service/systemd_spec.rb +70 -20
  386. data/spec/unit/provider/service/upstart_spec.rb +6 -0
  387. data/spec/unit/provider/user/aix_spec.rb +7 -0
  388. data/spec/unit/provider/user/directoryservice_spec.rb +30 -1
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +19 -0
  390. data/spec/unit/resource/capability_finder_spec.rb +51 -3
  391. data/spec/unit/resource/catalog_spec.rb +5 -0
  392. data/spec/unit/resource/type_spec.rb +2 -2
  393. data/spec/unit/resource_spec.rb +19 -0
  394. data/spec/unit/settings_spec.rb +13 -0
  395. data/spec/unit/ssl/certificate_authority/interface_spec.rb +176 -10
  396. data/spec/unit/ssl/certificate_authority_spec.rb +63 -22
  397. data/spec/unit/ssl/host_spec.rb +1 -1
  398. data/spec/unit/ssl/oids_spec.rb +24 -21
  399. data/spec/unit/transaction/event_spec.rb +3 -1
  400. data/spec/unit/transaction/persistence_spec.rb +173 -0
  401. data/spec/unit/transaction/report_spec.rb +64 -1
  402. data/spec/unit/transaction/resource_harness_spec.rb +91 -0
  403. data/spec/unit/type/file/content_spec.rb +47 -15
  404. data/spec/unit/type/file_spec.rb +28 -0
  405. data/spec/unit/type/mount_spec.rb +5 -12
  406. data/spec/unit/type/yumrepo_spec.rb +1 -5
  407. data/spec/unit/type_spec.rb +32 -0
  408. data/spec/unit/util/command_line_spec.rb +11 -0
  409. data/spec/unit/util/execution_spec.rb +1 -1
  410. data/spec/unit/util/plist_spec.rb +16 -3
  411. data/spec/unit/util/storage_spec.rb +4 -1
  412. data/spec/unit/util/windows/adsi_spec.rb +23 -2
  413. data/spec/unit/util/windows/file_spec.rb +56 -1
  414. data/spec/unit/util/windows/sid_spec.rb +31 -7
  415. data/spec/unit/util/yaml_spec.rb +12 -0
  416. data/spec/unit/util_spec.rb +87 -20
  417. metadata +91 -48
  418. data/ext/puppetlisten/puppetlisten.rb +0 -77
  419. data/ext/puppetlisten/puppetrun.rb +0 -38
  420. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  421. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  422. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
@@ -11,15 +11,15 @@ Puppet::Type.newtype(:yumrepo) do
11
11
 
12
12
  Continuation lines that yum supports (for the `baseurl`, for example)
13
13
  are not supported. This type does not attempt to read or verify the
14
- exinstence of files listed in the `include` attribute."
14
+ existence of files listed in the `include` attribute."
15
15
 
16
16
  # Ensure yumrepos can be removed too.
17
17
  ensurable
18
18
  # Doc string for properties that can be made 'absent'
19
19
  ABSENT_DOC="Set this to `absent` to remove it from the file completely."
20
20
  # False can be false/0/no and True can be true/1/yes in yum.
21
- YUM_BOOLEAN=/^(True|False|0|1|No|Yes)$/i
22
- YUM_BOOLEAN_DOC="Valid values are: False/0/No or True/1/Yes."
21
+ YUM_BOOLEAN=/^(true|false|0|1|no|yes)$/
22
+ YUM_BOOLEAN_DOC="Valid values are: false/0/no or true/1/yes."
23
23
 
24
24
  # Common munge logic for YUM_BOOLEAN values. Munges for two requirements:
25
25
  # 1) Because of how regex validation works in Puppet::Parameter::Value,
@@ -343,7 +343,7 @@ end
343
343
 
344
344
  validate do
345
345
  return unless self[:ip]
346
- # self[:ip] reflects the type passed from proeprty:ip.should. If we
346
+ # self[:ip] reflects the type passed from property:ip.should. If we
347
347
  # override it and pass @should, then we get an array here back.
348
348
  self[:ip].each do |ip|
349
349
  interface, address, router = ip.split(':')
data/lib/puppet/util.rb CHANGED
@@ -118,8 +118,8 @@ module Util
118
118
 
119
119
  # Run some code with a specific environment. Resets the environment back to
120
120
  # what it was at the end of the code.
121
- # Windows can store unicode chars in the environment as keys or values, but
122
- # Rubys ENV tries to roundtrip them through the local codepage, which can
121
+ # Windows can store Unicode chars in the environment as keys or values, but
122
+ # Ruby's ENV tries to roundtrip them through the local codepage, which can
123
123
  # cause encoding problems - underlying helpers use Windows APIs on Windows
124
124
  # see https://bugs.ruby-lang.org/issues/8822
125
125
  def withenv(hash, mode = :posix)
@@ -153,7 +153,7 @@ module Puppet::Util::ClassGen
153
153
  # @api private
154
154
  #
155
155
  def handleclassconst(klass, name, options)
156
- const = genconst_string(name, options)
156
+ const = genconst_string(name, options)
157
157
 
158
158
  if is_constant_defined?(const)
159
159
  if options[:overwrite]
@@ -81,7 +81,11 @@ module Puppet
81
81
 
82
82
  def find_subcommand
83
83
  if subcommand_name.nil?
84
- NilSubcommand.new(self)
84
+ if args.include?("--help") || args.include?("-h")
85
+ ApplicationSubcommand.new("help", CommandLine.new("puppet", ["help"]))
86
+ else
87
+ NilSubcommand.new(self)
88
+ end
85
89
  elsif Puppet::Application.available_application_names.include?(subcommand_name)
86
90
  ApplicationSubcommand.new(subcommand_name, self)
87
91
  elsif path_to_subcommand = external_subcommand
@@ -102,7 +106,7 @@ module Puppet
102
106
  # For most applications, we want to be able to load code from the modulepath,
103
107
  # such as apply, describe, resource, and faces.
104
108
  # For agent, we only want to load pluginsync'ed code from libdir.
105
- # For master, we shouldn't ever be loading per-enviroment code into the master's
109
+ # For master, we shouldn't ever be loading per-environment code into the master's
106
110
  # ruby process, but that requires fixing (#17210, #12173, #8750). So for now
107
111
  # we try to restrict to only code that can be autoloaded from the node's
108
112
  # environment.
@@ -141,7 +141,7 @@ class Parser
141
141
  ## There's one ambiguous case to be aware of: when +:multi+: is true and a
142
142
  ## +:default+ is set to an array (of something), it's ambiguous whether this
143
143
  ## is a multi-value argument as well as a multi-occurrence argument.
144
- ## In thise case, Trollop assumes that it's not a multi-value argument.
144
+ ## In this case, Trollop assumes that it's not a multi-value argument.
145
145
  ## If you want a multi-value, multi-occurrence argument with a default
146
146
  ## value, you must specify +:type+ as well.
147
147
 
@@ -11,7 +11,7 @@ module Puppet
11
11
  end
12
12
  end
13
13
 
14
- # This module defines methods for execution of system commands. It is intented for inclusion
14
+ # This module defines methods for execution of system commands. It is intended for inclusion
15
15
  # in classes that needs to execute system commands.
16
16
  # @api public
17
17
  module Puppet::Util::Execution
@@ -48,7 +48,7 @@ module Puppet::Util::Execution
48
48
  # @yield [pipe] to a block executing a subprocess
49
49
  # @yieldparam pipe [IO] the opened pipe
50
50
  # @yieldreturn [String] the output to return
51
- # @raise [Puppet::ExecutionFailure] if the executed chiled process did not
51
+ # @raise [Puppet::ExecutionFailure] if the executed child process did not
52
52
  # exit with status == 0 and `failonfail` is `true`.
53
53
  # @return [String] a string with the output from the subprocess executed by
54
54
  # the given block
@@ -30,7 +30,7 @@ module Puppet::Util::HttpProxy
30
30
  # Other documentation suggests that just a leading '.' indicates a domain
31
31
  # level exclusion, e.g.:
32
32
  # .example.com
33
- # We'll accomodate both here.
33
+ # We'll accommodate both here.
34
34
  def self.no_proxy?(dest)
35
35
  unless no_proxy_env = ENV["no_proxy"] || ENV["NO_PROXY"]
36
36
  return false
@@ -56,7 +56,7 @@ module Puppet::Util::IniConfig
56
56
  end
57
57
 
58
58
  # Set the entry 'key=value'. If no entry with the
59
- # given key exists, one is appended to teh end of the section
59
+ # given key exists, one is appended to the end of the section
60
60
  def []=(key, value)
61
61
  entry = find_entry(key)
62
62
  @dirty = true
@@ -60,7 +60,7 @@ module Puppet::Util::InstanceLoader
60
60
  @autoloaders[type.intern]
61
61
  end
62
62
 
63
- # Retrieve an alread-loaded instance, or attempt to load our instance.
63
+ # Retrieve an already-loaded instance, or attempt to load our instance.
64
64
  def loaded_instance(type, name)
65
65
  name = name.intern
66
66
  return nil unless instances = instance_hash(type)
@@ -55,7 +55,7 @@ module Logging
55
55
  backtrace = []
56
56
  build_exception_trace(backtrace, exception, trace)
57
57
  Puppet::Util::Log.create({
58
- :level => :err,
58
+ :level => options[:level] || :err,
59
59
  :source => log_source,
60
60
  :message => exception.basic_message,
61
61
  :issue_code => exception.issue_code,
@@ -3,7 +3,7 @@
3
3
  # "each v === other.each v".
4
4
  #
5
5
  # This class is useful in situations when the Puppet Type System cannot be used
6
- # (e.g. in Logging, since it needs to be able to log very early i the intialization
6
+ # (e.g. in Logging, since it needs to be able to log very early in the initialization
7
7
  # cycle of puppet)
8
8
  #
9
9
  # Typically used with the constants
@@ -1,4 +1,4 @@
1
- require 'cfpropertylist'
1
+ require 'cfpropertylist' if Puppet.features.cfpropertylist?
2
2
  require 'puppet/util/execution'
3
3
 
4
4
  module Puppet::Util::Plist
@@ -33,7 +33,7 @@ module Puppet::Util::Plist
33
33
  # NOTE: We used IO.read originally to be Ruby 1.8.x compatible.
34
34
  if read_file_with_offset(file_path, binary_plist_magic_number.length) == binary_plist_magic_number
35
35
  plist_obj = new_cfpropertylist(:file => file_path)
36
- convert_cfpropertylist_to_native_types(plist_obj)
36
+ return convert_cfpropertylist_to_native_types(plist_obj)
37
37
  else
38
38
  plist_data = open_file_with_args(file_path, "r:UTF-8")
39
39
  plist = parse_plist(plist_data, file_path)
@@ -48,6 +48,7 @@ module Puppet::Util::Plist
48
48
  Puppet.warning("Cannot read file #{file_path}; Puppet is skipping it.\n" + "Details: #{detail}")
49
49
  end
50
50
  end
51
+ return nil
51
52
  end
52
53
 
53
54
  # Read plist text using the CFPropertyList gem.
@@ -60,7 +61,8 @@ module Puppet::Util::Plist
60
61
 
61
62
  begin
62
63
  plist_obj = new_cfpropertylist(:data => plist_data)
63
- rescue CFFormatError => e
64
+ # CFPropertyList library will raise NoMethodError for invalid data
65
+ rescue CFFormatError, NoMethodError => e
64
66
  Puppet.debug "Failed with #{e.class} on #{file_path}: #{e.inspect}"
65
67
  return nil
66
68
  end
@@ -75,7 +77,7 @@ module Puppet::Util::Plist
75
77
  File.open(file, args).read
76
78
  end
77
79
 
78
- # Helper method to assist in generating a new CFPropertList Plist. It's
80
+ # Helper method to assist in generating a new CFPropertyList Plist. It's
79
81
  # its own method for stubbing purposes
80
82
  #
81
83
  # @api private
@@ -83,7 +85,7 @@ module Puppet::Util::Plist
83
85
  CFPropertyList::List.new(plist_opts)
84
86
  end
85
87
 
86
- # Helper method to assist in converting a native CFPropertList object to a
88
+ # Helper method to assist in converting a native CFPropertyList object to a
87
89
  # native Ruby object (hash). It's its own method for stubbing purposes
88
90
  #
89
91
  # @api private
@@ -91,6 +93,14 @@ module Puppet::Util::Plist
91
93
  CFPropertyList.native_types(plist_obj.value)
92
94
  end
93
95
 
96
+ # Helper method to convert a string into a CFProperty::Blob, which is
97
+ # needed to properly handle binary strings
98
+ #
99
+ # @api private
100
+ def string_to_blob(str)
101
+ CFPropertyList::Blob.new(str)
102
+ end
103
+
94
104
  # Helper method to assist in reading a file with an offset value. It's its
95
105
  # own method for stubbing purposes
96
106
  #
@@ -41,7 +41,7 @@ module Puppet::Util::Profiler
41
41
  # This outputs logs entries to the Puppet masters logging destination
42
42
  # providing the time it took, a message describing the profiled code
43
43
  # and a leaf location marking where the profile method was called
44
- # in the profiled hierachy.
44
+ # in the profiled hierarchy.
45
45
  #
46
46
  # @param message [String] A description of the profiled event
47
47
  # @param metric_id [Array] A list of strings making up the ID of a metric to profile
@@ -41,7 +41,7 @@ class Puppet::Util::Profiler::AroundProfiler
41
41
  # This outputs logs entries to the Puppet masters logging destination
42
42
  # providing the time it took, a message describing the profiled code
43
43
  # and a leaf location marking where the profile method was called
44
- # in the profiled hierachy.
44
+ # in the profiled hierarchy.
45
45
  #
46
46
  # @param message [String] A description of the profiled event
47
47
  # @param metric_id [Array] A list of strings making up the ID of a metric to profile
@@ -1,5 +1,5 @@
1
1
  # This module should be included when a class can be serialized to yaml and
2
- # needs to handle the deserialization from Psych with more control. Psych normall
2
+ # needs to handle the deserialization from Psych with more control. Psych normally
3
3
  # pokes values directly into an instance using `instance_variable_set` which completely
4
4
  # bypasses encapsulation.
5
5
  #
@@ -2,7 +2,7 @@ require 'puppet/util'
2
2
  module Puppet::Util::RDoc
3
3
  module_function
4
4
 
5
- # launch a rdoc documenation process
5
+ # launch a rdoc documentation process
6
6
  # with the files/dir passed in +files+
7
7
  def rdoc(outputdir, files, charset = nil)
8
8
 
@@ -26,7 +26,7 @@ module Puppet::Util::RDoc
26
26
 
27
27
  options << "--force-update"
28
28
  options += [ "--charset", charset] if charset
29
- # Rdoc root default is Dir.pwd, but the win32-dir gem monkey patchs Dir.pwd
29
+ # Rdoc root default is Dir.pwd, but the win32-dir gem monkey patches Dir.pwd
30
30
  # replacing Ruby's normal / with \. When RDoc generates relative paths it
31
31
  # uses relative_path_from that will generate errors when the slashes don't
32
32
  # properly match. This is a workaround for that issue.
@@ -39,7 +39,7 @@ module Puppet::Util::RubyGems
39
39
  # @api private
40
40
  class Gems18Source < Source
41
41
  def directories
42
- # `require 'mygem'` will consider and potentally load
42
+ # `require 'mygem'` will consider and potentially load
43
43
  # prerelease gems, so we need to match that behavior.
44
44
  Gem::Specification.latest_specs(true).collect do |spec|
45
45
  File.join(spec.full_gem_path, 'lib')
@@ -1,8 +1,8 @@
1
1
  # Monitor a given watcher for changes on a periodic interval.
2
2
  class Puppet::Util::Watcher::PeriodicWatcher
3
3
  # @param watcher [Puppet::Util::Watcher::ChangeWatcher] a watcher for the value to watch
4
- # @param timer [Puppet::Util::Watcher::Timer] A timer to determin when to
5
- # recheck the watcher. If the timout of the timer is negative, then the
4
+ # @param timer [Puppet::Util::Watcher::Timer] A timer to determine when to
5
+ # recheck the watcher. If the timeout of the timer is negative, then the
6
6
  # watched value is always considered to be changed
7
7
  def initialize(watcher, timer)
8
8
  @watcher = watcher
@@ -47,7 +47,7 @@ class Puppet::Util::Windows::AccessControlEntry
47
47
 
48
48
  # Returns true if this ACE applies to child directories.
49
49
  #
50
- # @return [Boolean] true if the ACE applies to child direcories
50
+ # @return [Boolean] true if the ACE applies to child directories
51
51
  def container_inherit?
52
52
  (@flags & CONTAINER_INHERIT_ACE) == CONTAINER_INHERIT_ACE
53
53
  end
@@ -57,7 +57,7 @@ module Puppet::Util::Windows::ADSI
57
57
  end
58
58
 
59
59
  # This method should *only* be used to generate WinNT://<SID> style monikers
60
- # used for IAdsGroup::Add / IAdsGroup::Remove. These URIs are not useable
60
+ # used for IAdsGroup::Add / IAdsGroup::Remove. These URIs are not usable
61
61
  # to resolve an account with WIN32OLE.connect
62
62
  # Valid input is a SID::Principal, S-X-X style SID string or any valid
63
63
  # account name with or without domain prefix
@@ -107,8 +107,19 @@ module Puppet::Util::Windows::ADSI
107
107
  end
108
108
 
109
109
  module Shared
110
+ def localized_domains
111
+ @localized_domains ||= [
112
+ # localized version of BUILTIN
113
+ # for instance VORDEFINIERT on German Windows
114
+ Puppet::Util::Windows::SID.sid_to_name('S-1-5-32').upcase,
115
+ # localized version of NT AUTHORITY (can't use S-1-5)
116
+ # for instance AUTORITE NT on French Windows
117
+ Puppet::Util::Windows::SID.name_to_sid_object('SYSTEM').domain.upcase
118
+ ]
119
+ end
120
+
110
121
  def uri(name, host = '.')
111
- host = '.' if ['NT AUTHORITY', 'BUILTIN', Socket.gethostname].include?(host)
122
+ host = '.' if (localized_domains << Socket.gethostname.upcase).include?(host.upcase)
112
123
 
113
124
  # group or user
114
125
  account_type = self.name.split('::').last.downcase
@@ -184,7 +195,10 @@ module Puppet::Util::Windows::ADSI
184
195
  end
185
196
 
186
197
  def [](attribute)
187
- native_user.Get(attribute)
198
+ value = native_user.Get(attribute)
199
+ # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
200
+ return value.encode(Encoding::UTF_8) if value.is_a?(String)
201
+ value
188
202
  end
189
203
 
190
204
  def []=(attribute, value)
@@ -234,7 +248,8 @@ module Puppet::Util::Windows::ADSI
234
248
  # https://msdn.microsoft.com/en-us/library/aa746342.aspx
235
249
  # WIN32OLE objects aren't enumerable, so no map
236
250
  groups = []
237
- native_user.Groups.each {|g| groups << g.Name} rescue nil
251
+ # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
252
+ native_user.Groups.each {|g| groups << g.Name.encode(Encoding::UTF_8)} rescue nil
238
253
  groups
239
254
  end
240
255
 
@@ -320,6 +335,10 @@ module Puppet::Util::Windows::ADSI
320
335
  user_name
321
336
  end
322
337
 
338
+ def self.current_user_sid
339
+ Puppet::Util::Windows::SID.name_to_sid_object(current_user_name)
340
+ end
341
+
323
342
  def self.exists?(name_or_sid)
324
343
  well_known = false
325
344
  if (sid = Puppet::Util::Windows::SID.name_to_sid_object(name_or_sid))
@@ -353,7 +372,8 @@ module Puppet::Util::Windows::ADSI
353
372
 
354
373
  users = []
355
374
  wql.each do |u|
356
- users << new(u.name)
375
+ # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
376
+ users << new(u.name.encode(Encoding::UTF_8))
357
377
  end
358
378
 
359
379
  users.each(&block)
@@ -377,7 +397,7 @@ module Puppet::Util::Windows::ADSI
377
397
  Puppet::Util::Windows::ADSI.wmi_connection.Delete("Win32_UserProfile.SID='#{sid}'")
378
398
  rescue WIN32OLERuntimeError => e
379
399
  # https://social.technet.microsoft.com/Forums/en/ITCG/thread/0f190051-ac96-4bf1-a47f-6b864bfacee5
380
- # Prior to Vista SP1, there's no builtin way to programmatically
400
+ # Prior to Vista SP1, there's no built-in way to programmatically
381
401
  # delete user profiles (except for delprof.exe). So try to delete
382
402
  # but warn if we fail
383
403
  raise e unless e.message.include?('80041010')
@@ -445,7 +465,8 @@ module Puppet::Util::Windows::ADSI
445
465
  def members
446
466
  # WIN32OLE objects aren't enumerable, so no map
447
467
  members = []
448
- native_group.Members.each {|m| members << m.Name}
468
+ # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
469
+ native_group.Members.each {|m| members << m.Name.encode(Encoding::UTF_8)}
449
470
  members
450
471
  end
451
472
 
@@ -514,7 +535,8 @@ module Puppet::Util::Windows::ADSI
514
535
 
515
536
  groups = []
516
537
  wql.each do |g|
517
- groups << new(g.name)
538
+ # Rubys WIN32OLE errantly converts UTF-16 values to Encoding.default_external
539
+ groups << new(g.name.encode(Encoding::UTF_8))
518
540
  end
519
541
 
520
542
  groups.each(&block)
@@ -59,7 +59,7 @@ module Puppet::Util::Windows::APITypes
59
59
  str.encode(dst_encoding)
60
60
  end
61
61
 
62
- # @param max_char_length [Integer] Maximum number of wide chars tp return (typically excluding NULLs), *not* bytes
62
+ # @param max_char_length [Integer] Maximum number of wide chars to return (typically excluding NULLs), *not* bytes
63
63
  # @param null_terminator [Symbol] Number of number of null wchar characters, *not* bytes, that determine the end of the string
64
64
  # null_terminator = :single_null, then the terminating sequence is two bytes of zero. This is UNIT16 = 0
65
65
  # null_terminator = :double_null, then the terminating sequence is four bytes of zero. This is UNIT32 = 0
@@ -257,6 +257,45 @@ module Puppet::Util::Windows::File
257
257
  end
258
258
  module_function :readlink
259
259
 
260
+ ERROR_FILE_NOT_FOUND = 2
261
+ ERROR_PATH_NOT_FOUND = 3
262
+
263
+ def get_long_pathname(path)
264
+ converted = ''
265
+ FFI::Pointer.from_string_to_wide_string(path) do |path_ptr|
266
+ # includes terminating NULL
267
+ buffer_size = GetLongPathNameW(path_ptr, FFI::Pointer::NULL, 0)
268
+ FFI::MemoryPointer.new(:wchar, buffer_size) do |converted_ptr|
269
+ if GetLongPathNameW(path_ptr, converted_ptr, buffer_size) == FFI::WIN32_FALSE
270
+ raise Puppet::Util::Windows::Error.new("Failed to call GetLongPathName")
271
+ end
272
+
273
+ converted = converted_ptr.read_wide_string(buffer_size - 1)
274
+ end
275
+ end
276
+
277
+ converted
278
+ end
279
+ module_function :get_long_pathname
280
+
281
+ def get_short_pathname(path)
282
+ converted = ''
283
+ FFI::Pointer.from_string_to_wide_string(path) do |path_ptr|
284
+ # includes terminating NULL
285
+ buffer_size = GetShortPathNameW(path_ptr, FFI::Pointer::NULL, 0)
286
+ FFI::MemoryPointer.new(:wchar, buffer_size) do |converted_ptr|
287
+ if GetShortPathNameW(path_ptr, converted_ptr, buffer_size) == FFI::WIN32_FALSE
288
+ raise Puppet::Util::Windows::Error.new("Failed to call GetShortPathName")
289
+ end
290
+
291
+ converted = converted_ptr.read_wide_string(buffer_size - 1)
292
+ end
293
+ end
294
+
295
+ converted
296
+ end
297
+ module_function :get_short_pathname
298
+
260
299
  def stat(file_name)
261
300
  file_name = file_name.to_s # accommodate PathName or String
262
301
  stat = File.stat(file_name)
@@ -422,4 +461,24 @@ module Puppet::Util::Windows::File
422
461
  # technically a WCHAR buffer, but we care about size in bytes here
423
462
  :PathBuffer, [:byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE - 20]
424
463
  end
464
+
465
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364980(v=vs.85).aspx
466
+ # DWORD WINAPI GetLongPathName(
467
+ # _In_ LPCTSTR lpszShortPath,
468
+ # _Out_ LPTSTR lpszLongPath,
469
+ # _In_ DWORD cchBuffer
470
+ # );
471
+ ffi_lib :kernel32
472
+ attach_function_private :GetLongPathNameW,
473
+ [:lpcwstr, :lpwstr, :dword], :dword
474
+
475
+ # https://msdn.microsoft.com/en-us/library/windows/desktop/aa364989(v=vs.85).aspx
476
+ # DWORD WINAPI GetShortPathName(
477
+ # _In_ LPCTSTR lpszLongPath,
478
+ # _Out_ LPTSTR lpszShortPath,
479
+ # _In_ DWORD cchBuffer
480
+ # );
481
+ ffi_lib :kernel32
482
+ attach_function_private :GetShortPathNameW,
483
+ [:lpcwstr, :lpwstr, :dword], :dword
425
484
  end