cfacter 3.11.0.rc.20180314

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1046) hide show
  1. checksums.yaml +7 -0
  2. data/ext/facter/Makefile.erb +31 -0
  3. data/ext/facter/cpp-hocon/CMakeLists.txt +67 -0
  4. data/ext/facter/cpp-hocon/CONTRIBUTING.md +9 -0
  5. data/ext/facter/cpp-hocon/LICENSE +17 -0
  6. data/ext/facter/cpp-hocon/MAINTAINERS +33 -0
  7. data/ext/facter/cpp-hocon/README.md +74 -0
  8. data/ext/facter/cpp-hocon/acceptance/Gemfile +18 -0
  9. data/ext/facter/cpp-hocon/acceptance/Rakefile +7 -0
  10. data/ext/facter/cpp-hocon/acceptance/tests/fake.rb +0 -0
  11. data/ext/facter/cpp-hocon/appveyor.yml +41 -0
  12. data/ext/facter/cpp-hocon/lib/CMakeLists.txt +94 -0
  13. data/ext/facter/cpp-hocon/lib/Doxyfile.in +2312 -0
  14. data/ext/facter/cpp-hocon/lib/inc/hocon/config.hpp +734 -0
  15. data/ext/facter/cpp-hocon/lib/inc/hocon/config_exception.hpp +184 -0
  16. data/ext/facter/cpp-hocon/lib/inc/hocon/config_include_context.hpp +51 -0
  17. data/ext/facter/cpp-hocon/lib/inc/hocon/config_includer.hpp +53 -0
  18. data/ext/facter/cpp-hocon/lib/inc/hocon/config_includer_file.hpp +30 -0
  19. data/ext/facter/cpp-hocon/lib/inc/hocon/config_list.hpp +51 -0
  20. data/ext/facter/cpp-hocon/lib/inc/hocon/config_mergeable.hpp +72 -0
  21. data/ext/facter/cpp-hocon/lib/inc/hocon/config_object.hpp +81 -0
  22. data/ext/facter/cpp-hocon/lib/inc/hocon/config_origin.hpp +98 -0
  23. data/ext/facter/cpp-hocon/lib/inc/hocon/config_parse_options.hpp +139 -0
  24. data/ext/facter/cpp-hocon/lib/inc/hocon/config_parseable.hpp +47 -0
  25. data/ext/facter/cpp-hocon/lib/inc/hocon/config_render_options.hpp +128 -0
  26. data/ext/facter/cpp-hocon/lib/inc/hocon/config_resolve_options.hpp +83 -0
  27. data/ext/facter/cpp-hocon/lib/inc/hocon/config_syntax.hpp +24 -0
  28. data/ext/facter/cpp-hocon/lib/inc/hocon/config_value.hpp +267 -0
  29. data/ext/facter/cpp-hocon/lib/inc/hocon/config_value_factory.hpp +48 -0
  30. data/ext/facter/cpp-hocon/lib/inc/hocon/functional_list.hpp +318 -0
  31. data/ext/facter/cpp-hocon/lib/inc/hocon/parser/config_document.hpp +95 -0
  32. data/ext/facter/cpp-hocon/lib/inc/hocon/parser/config_document_factory.hpp +39 -0
  33. data/ext/facter/cpp-hocon/lib/inc/hocon/parser/config_node.hpp +32 -0
  34. data/ext/facter/cpp-hocon/lib/inc/hocon/path.hpp +60 -0
  35. data/ext/facter/cpp-hocon/lib/inc/hocon/program_options.hpp +84 -0
  36. data/ext/facter/cpp-hocon/lib/inc/hocon/types.hpp +57 -0
  37. data/ext/facter/cpp-hocon/lib/inc/internal/config_document_parser.hpp +83 -0
  38. data/ext/facter/cpp-hocon/lib/inc/internal/config_parser.hpp +55 -0
  39. data/ext/facter/cpp-hocon/lib/inc/internal/config_util.hpp +17 -0
  40. data/ext/facter/cpp-hocon/lib/inc/internal/container.hpp +28 -0
  41. data/ext/facter/cpp-hocon/lib/inc/internal/default_transformer.hpp +12 -0
  42. data/ext/facter/cpp-hocon/lib/inc/internal/full_includer.hpp +13 -0
  43. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/abstract_config_node.hpp +16 -0
  44. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/abstract_config_node_value.hpp +12 -0
  45. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_array.hpp +17 -0
  46. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_comment.hpp +14 -0
  47. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_complex_value.hpp +25 -0
  48. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_concatenation.hpp +16 -0
  49. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_field.hpp +29 -0
  50. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_include.hpp +26 -0
  51. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_object.hpp +45 -0
  52. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_path.hpp +25 -0
  53. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_root.hpp +24 -0
  54. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_simple_value.hpp +21 -0
  55. data/ext/facter/cpp-hocon/lib/inc/internal/nodes/config_node_single_token.hpp +20 -0
  56. data/ext/facter/cpp-hocon/lib/inc/internal/parseable.hpp +128 -0
  57. data/ext/facter/cpp-hocon/lib/inc/internal/path_builder.hpp +20 -0
  58. data/ext/facter/cpp-hocon/lib/inc/internal/path_parser.hpp +55 -0
  59. data/ext/facter/cpp-hocon/lib/inc/internal/replaceable_merge_stack.hpp +14 -0
  60. data/ext/facter/cpp-hocon/lib/inc/internal/resolve_context.hpp +53 -0
  61. data/ext/facter/cpp-hocon/lib/inc/internal/resolve_result.hpp +21 -0
  62. data/ext/facter/cpp-hocon/lib/inc/internal/resolve_source.hpp +55 -0
  63. data/ext/facter/cpp-hocon/lib/inc/internal/simple_config_document.hpp +28 -0
  64. data/ext/facter/cpp-hocon/lib/inc/internal/simple_config_origin.hpp +67 -0
  65. data/ext/facter/cpp-hocon/lib/inc/internal/simple_include_context.hpp +22 -0
  66. data/ext/facter/cpp-hocon/lib/inc/internal/simple_includer.hpp +79 -0
  67. data/ext/facter/cpp-hocon/lib/inc/internal/substitution_expression.hpp +28 -0
  68. data/ext/facter/cpp-hocon/lib/inc/internal/token.hpp +45 -0
  69. data/ext/facter/cpp-hocon/lib/inc/internal/tokenizer.hpp +143 -0
  70. data/ext/facter/cpp-hocon/lib/inc/internal/tokens.hpp +135 -0
  71. data/ext/facter/cpp-hocon/lib/inc/internal/unmergeable.hpp +20 -0
  72. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_boolean.hpp +26 -0
  73. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_concatenation.hpp +59 -0
  74. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_delayed_merge.hpp +53 -0
  75. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_delayed_merge_object.hpp +57 -0
  76. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_double.hpp +28 -0
  77. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_int.hpp +25 -0
  78. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_long.hpp +28 -0
  79. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_null.hpp +33 -0
  80. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_number.hpp +38 -0
  81. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_reference.hpp +38 -0
  82. data/ext/facter/cpp-hocon/lib/inc/internal/values/config_string.hpp +32 -0
  83. data/ext/facter/cpp-hocon/lib/inc/internal/values/simple_config_list.hpp +75 -0
  84. data/ext/facter/cpp-hocon/lib/inc/internal/values/simple_config_object.hpp +107 -0
  85. data/ext/facter/cpp-hocon/lib/namespaces.dox.in +6 -0
  86. data/ext/facter/cpp-hocon/lib/src/config.cc +573 -0
  87. data/ext/facter/cpp-hocon/lib/src/config_document_factory.cc +24 -0
  88. data/ext/facter/cpp-hocon/lib/src/config_document_parser.cc +620 -0
  89. data/ext/facter/cpp-hocon/lib/src/config_parse_options.cc +101 -0
  90. data/ext/facter/cpp-hocon/lib/src/config_parser.cc +399 -0
  91. data/ext/facter/cpp-hocon/lib/src/config_render_options.cc +44 -0
  92. data/ext/facter/cpp-hocon/lib/src/config_resolve_options.cc +24 -0
  93. data/ext/facter/cpp-hocon/lib/src/config_util.cc +95 -0
  94. data/ext/facter/cpp-hocon/lib/src/config_value_factory.cc +68 -0
  95. data/ext/facter/cpp-hocon/lib/src/default_transformer.cc +94 -0
  96. data/ext/facter/cpp-hocon/lib/src/nodes/abstract_config_node.cc +19 -0
  97. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_array.cc +13 -0
  98. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_comment.cc +15 -0
  99. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_complex_value.cc +50 -0
  100. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_concatenation.cc +14 -0
  101. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_field.cc +80 -0
  102. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_include.cc +38 -0
  103. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_object.cc +318 -0
  104. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_path.cc +47 -0
  105. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_root.cc +70 -0
  106. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_simple_value.cc +50 -0
  107. data/ext/facter/cpp-hocon/lib/src/nodes/config_node_single_token.cc +18 -0
  108. data/ext/facter/cpp-hocon/lib/src/parseable.cc +325 -0
  109. data/ext/facter/cpp-hocon/lib/src/path.cc +219 -0
  110. data/ext/facter/cpp-hocon/lib/src/path_builder.cc +38 -0
  111. data/ext/facter/cpp-hocon/lib/src/path_parser.cc +253 -0
  112. data/ext/facter/cpp-hocon/lib/src/resolve_context.cc +139 -0
  113. data/ext/facter/cpp-hocon/lib/src/resolve_source.cc +216 -0
  114. data/ext/facter/cpp-hocon/lib/src/simple_config_document.cc +69 -0
  115. data/ext/facter/cpp-hocon/lib/src/simple_config_origin.cc +246 -0
  116. data/ext/facter/cpp-hocon/lib/src/simple_include_context.cc +18 -0
  117. data/ext/facter/cpp-hocon/lib/src/simple_includer.cc +186 -0
  118. data/ext/facter/cpp-hocon/lib/src/substitution_expression.cc +35 -0
  119. data/ext/facter/cpp-hocon/lib/src/token.cc +52 -0
  120. data/ext/facter/cpp-hocon/lib/src/tokenizer.cc +568 -0
  121. data/ext/facter/cpp-hocon/lib/src/tokens.cc +257 -0
  122. data/ext/facter/cpp-hocon/lib/src/values/config_boolean.cc +34 -0
  123. data/ext/facter/cpp-hocon/lib/src/values/config_concatenation.cc +260 -0
  124. data/ext/facter/cpp-hocon/lib/src/values/config_delayed_merge.cc +223 -0
  125. data/ext/facter/cpp-hocon/lib/src/values/config_delayed_merge_object.cc +180 -0
  126. data/ext/facter/cpp-hocon/lib/src/values/config_double.cc +35 -0
  127. data/ext/facter/cpp-hocon/lib/src/values/config_int.cc +35 -0
  128. data/ext/facter/cpp-hocon/lib/src/values/config_long.cc +35 -0
  129. data/ext/facter/cpp-hocon/lib/src/values/config_null.cc +35 -0
  130. data/ext/facter/cpp-hocon/lib/src/values/config_number.cc +78 -0
  131. data/ext/facter/cpp-hocon/lib/src/values/config_object.cc +97 -0
  132. data/ext/facter/cpp-hocon/lib/src/values/config_reference.cc +85 -0
  133. data/ext/facter/cpp-hocon/lib/src/values/config_string.cc +47 -0
  134. data/ext/facter/cpp-hocon/lib/src/values/config_value.cc +289 -0
  135. data/ext/facter/cpp-hocon/lib/src/values/simple_config_list.cc +219 -0
  136. data/ext/facter/cpp-hocon/lib/src/values/simple_config_object.cc +515 -0
  137. data/ext/facter/cpp-hocon/lib/tests/CMakeLists.txt +42 -0
  138. data/ext/facter/cpp-hocon/lib/tests/concatenation_test.cc +401 -0
  139. data/ext/facter/cpp-hocon/lib/tests/conf_parser_test.cc +715 -0
  140. data/ext/facter/cpp-hocon/lib/tests/config_document_parser_test.cc +208 -0
  141. data/ext/facter/cpp-hocon/lib/tests/config_document_tests.cc +110 -0
  142. data/ext/facter/cpp-hocon/lib/tests/config_node_test.cc +338 -0
  143. data/ext/facter/cpp-hocon/lib/tests/config_substitution_test.cc +897 -0
  144. data/ext/facter/cpp-hocon/lib/tests/config_test.cc +151 -0
  145. data/ext/facter/cpp-hocon/lib/tests/config_value_factory_test.cc +60 -0
  146. data/ext/facter/cpp-hocon/lib/tests/config_value_test.cc +111 -0
  147. data/ext/facter/cpp-hocon/lib/tests/fixtures.hpp.in +3 -0
  148. data/ext/facter/cpp-hocon/lib/tests/fixtures/test01.conf +91 -0
  149. data/ext/facter/cpp-hocon/lib/tests/fixtures/test01.json +4 -0
  150. data/ext/facter/cpp-hocon/lib/tests/main.cc +8 -0
  151. data/ext/facter/cpp-hocon/lib/tests/path_test.cc +129 -0
  152. data/ext/facter/cpp-hocon/lib/tests/program_options.cc +63 -0
  153. data/ext/facter/cpp-hocon/lib/tests/test.conf +1 -0
  154. data/ext/facter/cpp-hocon/lib/tests/test_utils.cc +452 -0
  155. data/ext/facter/cpp-hocon/lib/tests/test_utils.hpp +139 -0
  156. data/ext/facter/cpp-hocon/lib/tests/token_test.cc +108 -0
  157. data/ext/facter/cpp-hocon/lib/tests/tokenizer_test.cc +694 -0
  158. data/ext/facter/cpp-hocon/lib/version.h.in +28 -0
  159. data/ext/facter/cpp-hocon/locales/CMakeLists.txt +4 -0
  160. data/ext/facter/cpp-hocon/locales/cpp-hocon.pot +767 -0
  161. data/ext/facter/extconf.rb +22 -0
  162. data/ext/facter/facter/CMakeLists.txt +183 -0
  163. data/ext/facter/facter/CONTRIBUTING.md +99 -0
  164. data/ext/facter/facter/Extensibility.md +133 -0
  165. data/ext/facter/facter/LICENSE +17 -0
  166. data/ext/facter/facter/MAINTAINERS +28 -0
  167. data/ext/facter/facter/README.md +295 -0
  168. data/ext/facter/facter/Rakefile +42 -0
  169. data/ext/facter/facter/acceptance/Gemfile +21 -0
  170. data/ext/facter/facter/acceptance/Rakefile +342 -0
  171. data/ext/facter/facter/acceptance/bin/ci-bootstrap-from-artifacts.sh +55 -0
  172. data/ext/facter/facter/acceptance/config/aio/options.rb +9 -0
  173. data/ext/facter/facter/acceptance/config/git/options.rb +7 -0
  174. data/ext/facter/facter/acceptance/config/nodes/aix-53-power.yaml +7 -0
  175. data/ext/facter/facter/acceptance/config/nodes/aix-61-power.yaml +7 -0
  176. data/ext/facter/facter/acceptance/config/nodes/aix-71-power.yaml +7 -0
  177. data/ext/facter/facter/acceptance/config/nodes/huaweios-6-powerpc.yaml +7 -0
  178. data/ext/facter/facter/acceptance/config/nodes/solaris-10-sparc.yaml +9 -0
  179. data/ext/facter/facter/acceptance/config/nodes/solaris-11-sparc.yaml +9 -0
  180. data/ext/facter/facter/acceptance/lib/facter/acceptance/base_fact_utils.rb +563 -0
  181. data/ext/facter/facter/acceptance/lib/facter/acceptance/user_fact_utils.rb +132 -0
  182. data/ext/facter/facter/acceptance/lib/helper.rb +1 -0
  183. data/ext/facter/facter/acceptance/lib/puppet/acceptance/common_utils.rb +10 -0
  184. data/ext/facter/facter/acceptance/lib/puppet/acceptance/git_utils.rb +19 -0
  185. data/ext/facter/facter/acceptance/lib/puppet/acceptance/install_utils.rb +58 -0
  186. data/ext/facter/facter/acceptance/setup/aio/pre-suite/010_Install.rb +22 -0
  187. data/ext/facter/facter/acceptance/setup/aio/pre-suite/021_InstallAristaModule.rb +12 -0
  188. data/ext/facter/facter/acceptance/setup/aio/pre-suite/022_Remove_LD_PRELOAD.rb +11 -0
  189. data/ext/facter/facter/acceptance/setup/common/00_EnvSetup.rb +64 -0
  190. data/ext/facter/facter/acceptance/setup/common/pre-suite/000-delete-puppet-when-none.rb +11 -0
  191. data/ext/facter/facter/acceptance/setup/git/pre-suite/01_TestSetup.rb +31 -0
  192. data/ext/facter/facter/acceptance/tests/custom_facts/custom_fact_with_10001_weight_overrides_external_fact.rb +30 -0
  193. data/ext/facter/facter/acceptance/tests/custom_facts/having_multiple_facts_in_one_file.rb +40 -0
  194. data/ext/facter/facter/acceptance/tests/custom_facts/using_win32ole_should_not_hang.rb +33 -0
  195. data/ext/facter/facter/acceptance/tests/external_facts/env_var_overrides_external_fact.rb +46 -0
  196. data/ext/facter/facter/acceptance/tests/external_facts/external_dir_overrides_default_external_fact.rb +34 -0
  197. data/ext/facter/facter/acceptance/tests/external_facts/external_fact_overrides_custom_fact.rb +29 -0
  198. data/ext/facter/facter/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_10000_weight_or_less.rb +30 -0
  199. data/ext/facter/facter/acceptance/tests/external_facts/external_fact_overrides_custom_fact_with_confine.rb +35 -0
  200. data/ext/facter/facter/acceptance/tests/external_facts/external_fact_stderr_messages_output_to_stderr.rb +49 -0
  201. data/ext/facter/facter/acceptance/tests/external_facts/external_facts_only_run_once.rb +43 -0
  202. data/ext/facter/facter/acceptance/tests/external_facts/fact_directory_precedence.rb +109 -0
  203. data/ext/facter/facter/acceptance/tests/external_facts/non_root_users_default_external_fact_directory.rb +142 -0
  204. data/ext/facter/facter/acceptance/tests/external_facts/root_uses_default_external_fact_dir.rb +34 -0
  205. data/ext/facter/facter/acceptance/tests/external_facts/structured_executable_facts.rb +139 -0
  206. data/ext/facter/facter/acceptance/tests/facter_returns_success_on_non_existent_fact.rb +9 -0
  207. data/ext/facter/facter/acceptance/tests/facts/dmi.rb +51 -0
  208. data/ext/facter/facter/acceptance/tests/facts/facterversion.rb +11 -0
  209. data/ext/facter/facter/acceptance/tests/facts/identity.rb +52 -0
  210. data/ext/facter/facter/acceptance/tests/facts/networking_facts.rb +76 -0
  211. data/ext/facter/facter/acceptance/tests/facts/non_root_users_without_errors.rb +32 -0
  212. data/ext/facter/facter/acceptance/tests/facts/operatingsystem_detection_after_clear_on_ubuntu.rb +26 -0
  213. data/ext/facter/facter/acceptance/tests/facts/os_processors_and_kernel.rb +20 -0
  214. data/ext/facter/facter/acceptance/tests/facts/partitions.rb +37 -0
  215. data/ext/facter/facter/acceptance/tests/facts/productname.rb +15 -0
  216. data/ext/facter/facter/acceptance/tests/facts/ruby.rb +59 -0
  217. data/ext/facter/facter/acceptance/tests/facts/validate_file_system_size_bytes.rb +37 -0
  218. data/ext/facter/facter/acceptance/tests/facts/verify_tmpfs_file_system.rb +54 -0
  219. data/ext/facter/facter/acceptance/tests/load_libfacter.rb +66 -0
  220. data/ext/facter/facter/acceptance/tests/no_errors_on_stderr.rb +10 -0
  221. data/ext/facter/facter/acceptance/tests/options/color.rb +16 -0
  222. data/ext/facter/facter/acceptance/tests/options/config.rb +27 -0
  223. data/ext/facter/facter/acceptance/tests/options/config_file/blocklist.rb +35 -0
  224. data/ext/facter/facter/acceptance/tests/options/config_file/blocklist_from_puppet_facts.rb +40 -0
  225. data/ext/facter/facter/acceptance/tests/options/config_file/custom_dir_overridden_by_cli_custom_dir.rb +56 -0
  226. data/ext/facter/facter/acceptance/tests/options/config_file/custom_facts.rb +42 -0
  227. data/ext/facter/facter/acceptance/tests/options/config_file/custom_facts_list.rb +56 -0
  228. data/ext/facter/facter/acceptance/tests/options/config_file/debug.rb +34 -0
  229. data/ext/facter/facter/acceptance/tests/options/config_file/debug_override_config_file.rb +34 -0
  230. data/ext/facter/facter/acceptance/tests/options/config_file/default_file_location.rb +37 -0
  231. data/ext/facter/facter/acceptance/tests/options/config_file/external_dir_conflicts_with_cli_no_external_facts.rb +37 -0
  232. data/ext/facter/facter/acceptance/tests/options/config_file/external_dir_overridden_by_cli_external_dir.rb +40 -0
  233. data/ext/facter/facter/acceptance/tests/options/config_file/external_facts.rb +37 -0
  234. data/ext/facter/facter/acceptance/tests/options/config_file/external_facts_list.rb +43 -0
  235. data/ext/facter/facter/acceptance/tests/options/config_file/load_from_ruby.rb +73 -0
  236. data/ext/facter/facter/acceptance/tests/options/config_file/log_level.rb +35 -0
  237. data/ext/facter/facter/acceptance/tests/options/config_file/no_custom_facts_and_custom_dir.rb +43 -0
  238. data/ext/facter/facter/acceptance/tests/options/config_file/no_custom_facts_and_facterlib.rb +43 -0
  239. data/ext/facter/facter/acceptance/tests/options/config_file/no_custom_facts_and_load_path.rb +49 -0
  240. data/ext/facter/facter/acceptance/tests/options/config_file/no_external_facts.rb +38 -0
  241. data/ext/facter/facter/acceptance/tests/options/config_file/no_external_facts_and_external_dir.rb +34 -0
  242. data/ext/facter/facter/acceptance/tests/options/config_file/no_ruby_disables_custom_facts.rb +52 -0
  243. data/ext/facter/facter/acceptance/tests/options/config_file/no_ruby_disables_ruby_facts.rb +34 -0
  244. data/ext/facter/facter/acceptance/tests/options/config_file/trace.rb +48 -0
  245. data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_clear_by_empty_ttls_cache_list.rb +71 -0
  246. data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_creates_json_cache_file.rb +48 -0
  247. data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_do_not_read_the_old_cached_value.rb +58 -0
  248. data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_expire_facts_refresh_the_cached_value.rb +61 -0
  249. data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_read_from_the_cached_value.rb +57 -0
  250. data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_that_are_corrupt_are_refreshed.rb +53 -0
  251. data/ext/facter/facter/acceptance/tests/options/config_file/ttls_cached_facts_that_are_empty_return_an_empty_value.rb +53 -0
  252. data/ext/facter/facter/acceptance/tests/options/config_file/ttls_puppet_facts_creates_json_for_cached_facts.rb +45 -0
  253. data/ext/facter/facter/acceptance/tests/options/config_file/ttls_puppet_facts_honors_cached_facts.rb +54 -0
  254. data/ext/facter/facter/acceptance/tests/options/config_file/verbose.rb +34 -0
  255. data/ext/facter/facter/acceptance/tests/options/custom_facts.rb +34 -0
  256. data/ext/facter/facter/acceptance/tests/options/custom_facts_facterlib.rb +33 -0
  257. data/ext/facter/facter/acceptance/tests/options/custom_facts_list.rb +48 -0
  258. data/ext/facter/facter/acceptance/tests/options/custom_facts_load_path.rb +42 -0
  259. data/ext/facter/facter/acceptance/tests/options/debug.rb +12 -0
  260. data/ext/facter/facter/acceptance/tests/options/external_facts.rb +28 -0
  261. data/ext/facter/facter/acceptance/tests/options/external_facts_list.rb +35 -0
  262. data/ext/facter/facter/acceptance/tests/options/help.rb +13 -0
  263. data/ext/facter/facter/acceptance/tests/options/json.rb +43 -0
  264. data/ext/facter/facter/acceptance/tests/options/list_block_groups.rb +16 -0
  265. data/ext/facter/facter/acceptance/tests/options/list_cache_groups.rb +16 -0
  266. data/ext/facter/facter/acceptance/tests/options/log_level.rb +13 -0
  267. data/ext/facter/facter/acceptance/tests/options/no_block.rb +34 -0
  268. data/ext/facter/facter/acceptance/tests/options/no_cache_should_not_cache_facts.rb +43 -0
  269. data/ext/facter/facter/acceptance/tests/options/no_cache_should_not_load_cached_facts.rb +58 -0
  270. data/ext/facter/facter/acceptance/tests/options/no_cache_should_not_refresh_cached_facts.rb +63 -0
  271. data/ext/facter/facter/acceptance/tests/options/no_color.rb +16 -0
  272. data/ext/facter/facter/acceptance/tests/options/no_custom_facts.rb +34 -0
  273. data/ext/facter/facter/acceptance/tests/options/no_custom_facts_and_custom_dir.rb +19 -0
  274. data/ext/facter/facter/acceptance/tests/options/no_custom_facts_and_facterlib.rb +34 -0
  275. data/ext/facter/facter/acceptance/tests/options/no_custom_facts_and_load_path.rb +43 -0
  276. data/ext/facter/facter/acceptance/tests/options/no_external_facts.rb +28 -0
  277. data/ext/facter/facter/acceptance/tests/options/no_external_facts_and_external_dir.rb +19 -0
  278. data/ext/facter/facter/acceptance/tests/options/no_ruby.rb +44 -0
  279. data/ext/facter/facter/acceptance/tests/options/puppet_facts.rb +35 -0
  280. data/ext/facter/facter/acceptance/tests/options/show_legacy.rb +18 -0
  281. data/ext/facter/facter/acceptance/tests/options/strict.rb +11 -0
  282. data/ext/facter/facter/acceptance/tests/options/trace.rb +36 -0
  283. data/ext/facter/facter/acceptance/tests/options/verbose.rb +12 -0
  284. data/ext/facter/facter/acceptance/tests/options/version.rb +12 -0
  285. data/ext/facter/facter/acceptance/tests/options/yaml.rb +43 -0
  286. data/ext/facter/facter/acceptance/tests/ticket_1123_facter_with_invalid_locale.rb +22 -0
  287. data/ext/facter/facter/acceptance/tests/ticket_1238_hostname_fqdn.rb +57 -0
  288. data/ext/facter/facter/appveyor.yml +43 -0
  289. data/ext/facter/facter/cmake/FindBLKID.cmake +6 -0
  290. data/ext/facter/facter/cmake/FindCPPHOCON.cmake +6 -0
  291. data/ext/facter/facter/cmake/FindDependency.cmake +54 -0
  292. data/ext/facter/facter/cmake/FindOPENSSL.cmake +10 -0
  293. data/ext/facter/facter/cmake/FindRuby.cmake +286 -0
  294. data/ext/facter/facter/cmake/FindWHEREAMI.cmake +6 -0
  295. data/ext/facter/facter/cmake/FindYAMLCPP.cmake +17 -0
  296. data/ext/facter/facter/contrib/dockerfiles/travis-cpp-builder/Dockerfile +56 -0
  297. data/ext/facter/facter/contrib/dockerfiles/travis-facter-builder/Dockerfile +23 -0
  298. data/ext/facter/facter/contrib/dockerfiles/travis-facter-coverity/Dockerfile +40 -0
  299. data/ext/facter/facter/contrib/dockerfiles/travis-facter-coverity/_coverity-submit.erb +12 -0
  300. data/ext/facter/facter/contrib/dockerfiles/travis-facter-coverity/fix_curl_command.patch +32 -0
  301. data/ext/facter/facter/exe/CMakeLists.txt +39 -0
  302. data/ext/facter/facter/exe/facter.cc +377 -0
  303. data/ext/facter/facter/ext/build_defaults.yaml +16 -0
  304. data/ext/facter/facter/ext/debian/changelog.erb +11 -0
  305. data/ext/facter/facter/ext/debian/compat +1 -0
  306. data/ext/facter/facter/ext/debian/control +14 -0
  307. data/ext/facter/facter/ext/debian/copyright +19 -0
  308. data/ext/facter/facter/ext/debian/docs +2 -0
  309. data/ext/facter/facter/ext/debian/facter.install +4 -0
  310. data/ext/facter/facter/ext/debian/lintian-overrides +0 -0
  311. data/ext/facter/facter/ext/debian/rules +39 -0
  312. data/ext/facter/facter/ext/debian/source/format +1 -0
  313. data/ext/facter/facter/ext/project_data.yaml +30 -0
  314. data/ext/facter/facter/ext/redhat/facter.spec.erb +113 -0
  315. data/ext/facter/facter/ext/windows/facter.bat +8 -0
  316. data/ext/facter/facter/ext/windows/facter_interactive.bat +6 -0
  317. data/ext/facter/facter/ext/windows/run_facter_interactive.bat +9 -0
  318. data/ext/facter/facter/factergo/example/main.go +17 -0
  319. data/ext/facter/facter/factergo/facter.go +42 -0
  320. data/ext/facter/facter/factergo/facter_test.go +25 -0
  321. data/ext/facter/facter/lib/CMakeLists.txt +409 -0
  322. data/ext/facter/facter/lib/Doxyfile +2313 -0
  323. data/ext/facter/facter/lib/Facter.java.in +110 -0
  324. data/ext/facter/facter/lib/Gemfile +11 -0
  325. data/ext/facter/facter/lib/Rakefile +8 -0
  326. data/ext/facter/facter/lib/docs/generate.rb +25 -0
  327. data/ext/facter/facter/lib/docs/namespaces.dox +129 -0
  328. data/ext/facter/facter/lib/docs/template.erb +43 -0
  329. data/ext/facter/facter/lib/facter.rb.in +45 -0
  330. data/ext/facter/facter/lib/gemspec.in +21 -0
  331. data/ext/facter/facter/lib/inc/facter/cwrapper.hpp +18 -0
  332. data/ext/facter/facter/lib/inc/facter/facts/array_value.hpp +125 -0
  333. data/ext/facter/facter/lib/inc/facter/facts/collection.hpp +339 -0
  334. data/ext/facter/facter/lib/inc/facter/facts/external/resolver.hpp +49 -0
  335. data/ext/facter/facter/lib/inc/facter/facts/fact.hpp +669 -0
  336. data/ext/facter/facter/lib/inc/facter/facts/map_value.hpp +127 -0
  337. data/ext/facter/facter/lib/inc/facter/facts/os.hpp +202 -0
  338. data/ext/facter/facter/lib/inc/facter/facts/os_family.hpp +58 -0
  339. data/ext/facter/facter/lib/inc/facter/facts/resolver.hpp +126 -0
  340. data/ext/facter/facter/lib/inc/facter/facts/scalar_value.hpp +152 -0
  341. data/ext/facter/facter/lib/inc/facter/facts/value.hpp +164 -0
  342. data/ext/facter/facter/lib/inc/facter/facts/vm.hpp +157 -0
  343. data/ext/facter/facter/lib/inc/facter/logging/logging.hpp +192 -0
  344. data/ext/facter/facter/lib/inc/facter/ruby/ruby.hpp +62 -0
  345. data/ext/facter/facter/lib/inc/facter/util/config.hpp +84 -0
  346. data/ext/facter/facter/lib/inc/facter/util/string.hpp +72 -0
  347. data/ext/facter/facter/lib/inc/internal/facts/aix/disk_resolver.hpp +25 -0
  348. data/ext/facter/facter/lib/inc/internal/facts/aix/filesystem_resolver.hpp +41 -0
  349. data/ext/facter/facter/lib/inc/internal/facts/aix/kernel_resolver.hpp +25 -0
  350. data/ext/facter/facter/lib/inc/internal/facts/aix/memory_resolver.hpp +25 -0
  351. data/ext/facter/facter/lib/inc/internal/facts/aix/networking_resolver.hpp +49 -0
  352. data/ext/facter/facter/lib/inc/internal/facts/aix/operating_system_resolver.hpp +24 -0
  353. data/ext/facter/facter/lib/inc/internal/facts/aix/processor_resolver.hpp +25 -0
  354. data/ext/facter/facter/lib/inc/internal/facts/aix/serial_number_resolver.hpp +27 -0
  355. data/ext/facter/facter/lib/inc/internal/facts/bsd/filesystem_resolver.hpp +30 -0
  356. data/ext/facter/facter/lib/inc/internal/facts/bsd/networking_resolver.hpp +59 -0
  357. data/ext/facter/facter/lib/inc/internal/facts/bsd/uptime_resolver.hpp +24 -0
  358. data/ext/facter/facter/lib/inc/internal/facts/cache.hpp +71 -0
  359. data/ext/facter/facter/lib/inc/internal/facts/external/execution_resolver.hpp +31 -0
  360. data/ext/facter/facter/lib/inc/internal/facts/external/json_resolver.hpp +31 -0
  361. data/ext/facter/facter/lib/inc/internal/facts/external/text_resolver.hpp +31 -0
  362. data/ext/facter/facter/lib/inc/internal/facts/external/windows/powershell_resolver.hpp +34 -0
  363. data/ext/facter/facter/lib/inc/internal/facts/external/yaml_resolver.hpp +31 -0
  364. data/ext/facter/facter/lib/inc/internal/facts/freebsd/dmi_resolver.hpp +28 -0
  365. data/ext/facter/facter/lib/inc/internal/facts/freebsd/memory_resolver.hpp +25 -0
  366. data/ext/facter/facter/lib/inc/internal/facts/freebsd/networking_resolver.hpp +42 -0
  367. data/ext/facter/facter/lib/inc/internal/facts/freebsd/operating_system_resolver.hpp +24 -0
  368. data/ext/facter/facter/lib/inc/internal/facts/freebsd/processor_resolver.hpp +25 -0
  369. data/ext/facter/facter/lib/inc/internal/facts/freebsd/virtualization_resolver.hpp +27 -0
  370. data/ext/facter/facter/lib/inc/internal/facts/freebsd/zfs_resolver.hpp +24 -0
  371. data/ext/facter/facter/lib/inc/internal/facts/freebsd/zpool_resolver.hpp +24 -0
  372. data/ext/facter/facter/lib/inc/internal/facts/glib/load_average_resolver.hpp +24 -0
  373. data/ext/facter/facter/lib/inc/internal/facts/linux/disk_resolver.hpp +25 -0
  374. data/ext/facter/facter/lib/inc/internal/facts/linux/dmi_resolver.hpp +37 -0
  375. data/ext/facter/facter/lib/inc/internal/facts/linux/filesystem_resolver.hpp +40 -0
  376. data/ext/facter/facter/lib/inc/internal/facts/linux/fips_resolver.hpp +31 -0
  377. data/ext/facter/facter/lib/inc/internal/facts/linux/kernel_resolver.hpp +25 -0
  378. data/ext/facter/facter/lib/inc/internal/facts/linux/memory_resolver.hpp +25 -0
  379. data/ext/facter/facter/lib/inc/internal/facts/linux/networking_resolver.hpp +78 -0
  380. data/ext/facter/facter/lib/inc/internal/facts/linux/operating_system_resolver.hpp +28 -0
  381. data/ext/facter/facter/lib/inc/internal/facts/linux/os_cisco.hpp +114 -0
  382. data/ext/facter/facter/lib/inc/internal/facts/linux/os_coreos.hpp +56 -0
  383. data/ext/facter/facter/lib/inc/internal/facts/linux/os_cumulus.hpp +56 -0
  384. data/ext/facter/facter/lib/inc/internal/facts/linux/os_linux.hpp +72 -0
  385. data/ext/facter/facter/lib/inc/internal/facts/linux/processor_resolver.hpp +60 -0
  386. data/ext/facter/facter/lib/inc/internal/facts/linux/release_file.hpp +124 -0
  387. data/ext/facter/facter/lib/inc/internal/facts/linux/uptime_resolver.hpp +24 -0
  388. data/ext/facter/facter/lib/inc/internal/facts/linux/virtualization_resolver.hpp +50 -0
  389. data/ext/facter/facter/lib/inc/internal/facts/openbsd/dmi_resolver.hpp +28 -0
  390. data/ext/facter/facter/lib/inc/internal/facts/openbsd/memory_resolver.hpp +25 -0
  391. data/ext/facter/facter/lib/inc/internal/facts/openbsd/networking_resolver.hpp +42 -0
  392. data/ext/facter/facter/lib/inc/internal/facts/openbsd/processor_resolver.hpp +25 -0
  393. data/ext/facter/facter/lib/inc/internal/facts/openbsd/virtualization_resolver.hpp +25 -0
  394. data/ext/facter/facter/lib/inc/internal/facts/osx/dmi_resolver.hpp +25 -0
  395. data/ext/facter/facter/lib/inc/internal/facts/osx/memory_resolver.hpp +25 -0
  396. data/ext/facter/facter/lib/inc/internal/facts/osx/networking_resolver.hpp +60 -0
  397. data/ext/facter/facter/lib/inc/internal/facts/osx/operating_system_resolver.hpp +25 -0
  398. data/ext/facter/facter/lib/inc/internal/facts/osx/processor_resolver.hpp +25 -0
  399. data/ext/facter/facter/lib/inc/internal/facts/osx/system_profiler_resolver.hpp +25 -0
  400. data/ext/facter/facter/lib/inc/internal/facts/osx/virtualization_resolver.hpp +25 -0
  401. data/ext/facter/facter/lib/inc/internal/facts/posix/identity_resolver.hpp +25 -0
  402. data/ext/facter/facter/lib/inc/internal/facts/posix/kernel_resolver.hpp +25 -0
  403. data/ext/facter/facter/lib/inc/internal/facts/posix/networking_resolver.hpp +48 -0
  404. data/ext/facter/facter/lib/inc/internal/facts/posix/operating_system_resolver.hpp +25 -0
  405. data/ext/facter/facter/lib/inc/internal/facts/posix/processor_resolver.hpp +25 -0
  406. data/ext/facter/facter/lib/inc/internal/facts/posix/ssh_resolver.hpp +28 -0
  407. data/ext/facter/facter/lib/inc/internal/facts/posix/timezone_resolver.hpp +24 -0
  408. data/ext/facter/facter/lib/inc/internal/facts/posix/uptime_resolver.hpp +32 -0
  409. data/ext/facter/facter/lib/inc/internal/facts/posix/xen_resolver.hpp +24 -0
  410. data/ext/facter/facter/lib/inc/internal/facts/resolvers/augeas_resolver.hpp +35 -0
  411. data/ext/facter/facter/lib/inc/internal/facts/resolvers/disk_resolver.hpp +81 -0
  412. data/ext/facter/facter/lib/inc/internal/facts/resolvers/dmi_resolver.hpp +115 -0
  413. data/ext/facter/facter/lib/inc/internal/facts/resolvers/ec2_resolver.hpp +30 -0
  414. data/ext/facter/facter/lib/inc/internal/facts/resolvers/filesystem_resolver.hpp +166 -0
  415. data/ext/facter/facter/lib/inc/internal/facts/resolvers/fips_resolver.hpp +46 -0
  416. data/ext/facter/facter/lib/inc/internal/facts/resolvers/gce_resolver.hpp +28 -0
  417. data/ext/facter/facter/lib/inc/internal/facts/resolvers/hypervisors_resolver.hpp +69 -0
  418. data/ext/facter/facter/lib/inc/internal/facts/resolvers/identity_resolver.hpp +73 -0
  419. data/ext/facter/facter/lib/inc/internal/facts/resolvers/kernel_resolver.hpp +66 -0
  420. data/ext/facter/facter/lib/inc/internal/facts/resolvers/ldom_resolver.hpp +64 -0
  421. data/ext/facter/facter/lib/inc/internal/facts/resolvers/load_average_resolver.hpp +37 -0
  422. data/ext/facter/facter/lib/inc/internal/facts/resolvers/memory_resolver.hpp +99 -0
  423. data/ext/facter/facter/lib/inc/internal/facts/resolvers/networking_resolver.hpp +155 -0
  424. data/ext/facter/facter/lib/inc/internal/facts/resolvers/operating_system_resolver.hpp +235 -0
  425. data/ext/facter/facter/lib/inc/internal/facts/resolvers/path_resolver.hpp +28 -0
  426. data/ext/facter/facter/lib/inc/internal/facts/resolvers/processor_resolver.hpp +80 -0
  427. data/ext/facter/facter/lib/inc/internal/facts/resolvers/ruby_resolver.hpp +56 -0
  428. data/ext/facter/facter/lib/inc/internal/facts/resolvers/ssh_resolver.hpp +105 -0
  429. data/ext/facter/facter/lib/inc/internal/facts/resolvers/system_profiler_resolver.hpp +127 -0
  430. data/ext/facter/facter/lib/inc/internal/facts/resolvers/timezone_resolver.hpp +36 -0
  431. data/ext/facter/facter/lib/inc/internal/facts/resolvers/uptime_resolver.hpp +36 -0
  432. data/ext/facter/facter/lib/inc/internal/facts/resolvers/virtualization_resolver.hpp +95 -0
  433. data/ext/facter/facter/lib/inc/internal/facts/resolvers/xen_resolver.hpp +55 -0
  434. data/ext/facter/facter/lib/inc/internal/facts/resolvers/zfs_resolver.hpp +59 -0
  435. data/ext/facter/facter/lib/inc/internal/facts/resolvers/zone_resolver.hpp +95 -0
  436. data/ext/facter/facter/lib/inc/internal/facts/resolvers/zpool_resolver.hpp +63 -0
  437. data/ext/facter/facter/lib/inc/internal/facts/solaris/disk_resolver.hpp +25 -0
  438. data/ext/facter/facter/lib/inc/internal/facts/solaris/dmi_resolver.hpp +25 -0
  439. data/ext/facter/facter/lib/inc/internal/facts/solaris/filesystem_resolver.hpp +29 -0
  440. data/ext/facter/facter/lib/inc/internal/facts/solaris/kernel_resolver.hpp +25 -0
  441. data/ext/facter/facter/lib/inc/internal/facts/solaris/ldom_resolver.hpp +25 -0
  442. data/ext/facter/facter/lib/inc/internal/facts/solaris/memory_resolver.hpp +25 -0
  443. data/ext/facter/facter/lib/inc/internal/facts/solaris/networking_resolver.hpp +48 -0
  444. data/ext/facter/facter/lib/inc/internal/facts/solaris/operating_system_resolver.hpp +25 -0
  445. data/ext/facter/facter/lib/inc/internal/facts/solaris/processor_resolver.hpp +25 -0
  446. data/ext/facter/facter/lib/inc/internal/facts/solaris/virtualization_resolver.hpp +25 -0
  447. data/ext/facter/facter/lib/inc/internal/facts/solaris/zfs_resolver.hpp +24 -0
  448. data/ext/facter/facter/lib/inc/internal/facts/solaris/zone_resolver.hpp +25 -0
  449. data/ext/facter/facter/lib/inc/internal/facts/solaris/zpool_resolver.hpp +24 -0
  450. data/ext/facter/facter/lib/inc/internal/facts/windows/dmi_resolver.hpp +38 -0
  451. data/ext/facter/facter/lib/inc/internal/facts/windows/identity_resolver.hpp +25 -0
  452. data/ext/facter/facter/lib/inc/internal/facts/windows/kernel_resolver.hpp +25 -0
  453. data/ext/facter/facter/lib/inc/internal/facts/windows/memory_resolver.hpp +25 -0
  454. data/ext/facter/facter/lib/inc/internal/facts/windows/networking_resolver.hpp +74 -0
  455. data/ext/facter/facter/lib/inc/internal/facts/windows/operating_system_resolver.hpp +36 -0
  456. data/ext/facter/facter/lib/inc/internal/facts/windows/processor_resolver.hpp +36 -0
  457. data/ext/facter/facter/lib/inc/internal/facts/windows/timezone_resolver.hpp +24 -0
  458. data/ext/facter/facter/lib/inc/internal/facts/windows/uptime_resolver.hpp +32 -0
  459. data/ext/facter/facter/lib/inc/internal/facts/windows/virtualization_resolver.hpp +37 -0
  460. data/ext/facter/facter/lib/inc/internal/ruby/aggregate_resolution.hpp +77 -0
  461. data/ext/facter/facter/lib/inc/internal/ruby/chunk.hpp +83 -0
  462. data/ext/facter/facter/lib/inc/internal/ruby/confine.hpp +60 -0
  463. data/ext/facter/facter/lib/inc/internal/ruby/fact.hpp +108 -0
  464. data/ext/facter/facter/lib/inc/internal/ruby/module.hpp +165 -0
  465. data/ext/facter/facter/lib/inc/internal/ruby/resolution.hpp +126 -0
  466. data/ext/facter/facter/lib/inc/internal/ruby/ruby_value.hpp +119 -0
  467. data/ext/facter/facter/lib/inc/internal/ruby/simple_resolution.hpp +56 -0
  468. data/ext/facter/facter/lib/inc/internal/util/agent.hpp +29 -0
  469. data/ext/facter/facter/lib/inc/internal/util/aix/odm.hpp +373 -0
  470. data/ext/facter/facter/lib/inc/internal/util/aix/vmount.hpp +139 -0
  471. data/ext/facter/facter/lib/inc/internal/util/bsd/scoped_ifaddrs.hpp +33 -0
  472. data/ext/facter/facter/lib/inc/internal/util/posix/scoped_addrinfo.hpp +45 -0
  473. data/ext/facter/facter/lib/inc/internal/util/posix/scoped_bio.hpp +34 -0
  474. data/ext/facter/facter/lib/inc/internal/util/posix/scoped_descriptor.hpp +27 -0
  475. data/ext/facter/facter/lib/inc/internal/util/scoped_file.hpp +36 -0
  476. data/ext/facter/facter/lib/inc/internal/util/solaris/k_stat.hpp +176 -0
  477. data/ext/facter/facter/lib/inc/internal/util/solaris/scoped_kstat.hpp +45 -0
  478. data/ext/facter/facter/lib/inc/internal/util/versions.hpp +34 -0
  479. data/ext/facter/facter/lib/inc/internal/util/windows/wsa.hpp +92 -0
  480. data/ext/facter/facter/lib/inc/internal/util/yaml.hpp +25 -0
  481. data/ext/facter/facter/lib/schema/core_facts.pot +2017 -0
  482. data/ext/facter/facter/lib/schema/facter.yaml +1947 -0
  483. data/ext/facter/facter/lib/schema/translation_tooling.rb +67 -0
  484. data/ext/facter/facter/lib/spec/unit/facter_spec.rb +136 -0
  485. data/ext/facter/facter/lib/spec_helper.rb.in +27 -0
  486. data/ext/facter/facter/lib/src/cwrapper.cc +45 -0
  487. data/ext/facter/facter/lib/src/facts/aix/collection.cc +32 -0
  488. data/ext/facter/facter/lib/src/facts/aix/disk_resolver.cc +66 -0
  489. data/ext/facter/facter/lib/src/facts/aix/filesystem_resolver.cc +132 -0
  490. data/ext/facter/facter/lib/src/facts/aix/kernel_resolver.cc +27 -0
  491. data/ext/facter/facter/lib/src/facts/aix/memory_resolver.cc +48 -0
  492. data/ext/facter/facter/lib/src/facts/aix/networking_resolver.cc +245 -0
  493. data/ext/facter/facter/lib/src/facts/aix/operating_system_resolver.cc +61 -0
  494. data/ext/facter/facter/lib/src/facts/aix/processor_resolver.cc +106 -0
  495. data/ext/facter/facter/lib/src/facts/aix/serial_number_resolver.cc +43 -0
  496. data/ext/facter/facter/lib/src/facts/array_value.cc +111 -0
  497. data/ext/facter/facter/lib/src/facts/bsd/collection.cc +27 -0
  498. data/ext/facter/facter/lib/src/facts/bsd/filesystem_resolver.cc +92 -0
  499. data/ext/facter/facter/lib/src/facts/bsd/networking_resolver.cc +175 -0
  500. data/ext/facter/facter/lib/src/facts/bsd/uptime_resolver.cc +23 -0
  501. data/ext/facter/facter/lib/src/facts/cache.cc +117 -0
  502. data/ext/facter/facter/lib/src/facts/collection.cc +661 -0
  503. data/ext/facter/facter/lib/src/facts/external/execution_resolver.cc +89 -0
  504. data/ext/facter/facter/lib/src/facts/external/json_resolver.cc +219 -0
  505. data/ext/facter/facter/lib/src/facts/external/resolver.cc +12 -0
  506. data/ext/facter/facter/lib/src/facts/external/text_resolver.cc +45 -0
  507. data/ext/facter/facter/lib/src/facts/external/windows/powershell_resolver.cc +117 -0
  508. data/ext/facter/facter/lib/src/facts/external/yaml_resolver.cc +45 -0
  509. data/ext/facter/facter/lib/src/facts/freebsd/collection.cc +41 -0
  510. data/ext/facter/facter/lib/src/facts/freebsd/dmi_resolver.cc +43 -0
  511. data/ext/facter/facter/lib/src/facts/freebsd/memory_resolver.cc +76 -0
  512. data/ext/facter/facter/lib/src/facts/freebsd/networking_resolver.cc +55 -0
  513. data/ext/facter/facter/lib/src/facts/freebsd/operating_system_resolver.cc +17 -0
  514. data/ext/facter/facter/lib/src/facts/freebsd/processor_resolver.cc +63 -0
  515. data/ext/facter/facter/lib/src/facts/freebsd/virtualization_resolver.cc +41 -0
  516. data/ext/facter/facter/lib/src/facts/freebsd/zfs_resolver.cc +12 -0
  517. data/ext/facter/facter/lib/src/facts/freebsd/zpool_resolver.cc +12 -0
  518. data/ext/facter/facter/lib/src/facts/glib/load_average_resolver.cc +22 -0
  519. data/ext/facter/facter/lib/src/facts/linux/collection.cc +44 -0
  520. data/ext/facter/facter/lib/src/facts/linux/disk_resolver.cc +80 -0
  521. data/ext/facter/facter/lib/src/facts/linux/dmi_resolver.cc +208 -0
  522. data/ext/facter/facter/lib/src/facts/linux/filesystem_resolver.cc +282 -0
  523. data/ext/facter/facter/lib/src/facts/linux/fips_resolver.cc +31 -0
  524. data/ext/facter/facter/lib/src/facts/linux/kernel_resolver.cc +20 -0
  525. data/ext/facter/facter/lib/src/facts/linux/memory_resolver.cc +50 -0
  526. data/ext/facter/facter/lib/src/facts/linux/networking_resolver.cc +275 -0
  527. data/ext/facter/facter/lib/src/facts/linux/operating_system_resolver.cc +175 -0
  528. data/ext/facter/facter/lib/src/facts/linux/os_linux.cc +393 -0
  529. data/ext/facter/facter/lib/src/facts/linux/processor_resolver.cc +200 -0
  530. data/ext/facter/facter/lib/src/facts/linux/uptime_resolver.cc +15 -0
  531. data/ext/facter/facter/lib/src/facts/linux/virtualization_resolver.cc +282 -0
  532. data/ext/facter/facter/lib/src/facts/map_value.cc +119 -0
  533. data/ext/facter/facter/lib/src/facts/openbsd/collection.cc +37 -0
  534. data/ext/facter/facter/lib/src/facts/openbsd/dmi_resolver.cc +47 -0
  535. data/ext/facter/facter/lib/src/facts/openbsd/memory_resolver.cc +76 -0
  536. data/ext/facter/facter/lib/src/facts/openbsd/networking_resolver.cc +55 -0
  537. data/ext/facter/facter/lib/src/facts/openbsd/processor_resolver.cc +59 -0
  538. data/ext/facter/facter/lib/src/facts/openbsd/virtualization_resolver.cc +20 -0
  539. data/ext/facter/facter/lib/src/facts/osx/collection.cc +39 -0
  540. data/ext/facter/facter/lib/src/facts/osx/dmi_resolver.cc +32 -0
  541. data/ext/facter/facter/lib/src/facts/osx/memory_resolver.cc +60 -0
  542. data/ext/facter/facter/lib/src/facts/osx/networking_resolver.cc +71 -0
  543. data/ext/facter/facter/lib/src/facts/osx/operating_system_resolver.cc +49 -0
  544. data/ext/facter/facter/lib/src/facts/osx/processor_resolver.cc +55 -0
  545. data/ext/facter/facter/lib/src/facts/osx/system_profiler_resolver.cc +66 -0
  546. data/ext/facter/facter/lib/src/facts/osx/virtualization_resolver.cc +46 -0
  547. data/ext/facter/facter/lib/src/facts/posix/cache.cc +9 -0
  548. data/ext/facter/facter/lib/src/facts/posix/collection.cc +48 -0
  549. data/ext/facter/facter/lib/src/facts/posix/identity_resolver.cc +79 -0
  550. data/ext/facter/facter/lib/src/facts/posix/kernel_resolver.cc +25 -0
  551. data/ext/facter/facter/lib/src/facts/posix/networking_resolver.cc +136 -0
  552. data/ext/facter/facter/lib/src/facts/posix/operatingsystem_resolver.cc +29 -0
  553. data/ext/facter/facter/lib/src/facts/posix/processor_resolver.cc +22 -0
  554. data/ext/facter/facter/lib/src/facts/posix/ssh_resolver.cc +116 -0
  555. data/ext/facter/facter/lib/src/facts/posix/timezone_resolver.cc +26 -0
  556. data/ext/facter/facter/lib/src/facts/posix/uptime_resolver.cc +53 -0
  557. data/ext/facter/facter/lib/src/facts/posix/xen_resolver.cc +43 -0
  558. data/ext/facter/facter/lib/src/facts/resolver.cc +105 -0
  559. data/ext/facter/facter/lib/src/facts/resolvers/augeas_resolver.cc +56 -0
  560. data/ext/facter/facter/lib/src/facts/resolvers/disk_resolver.cc +69 -0
  561. data/ext/facter/facter/lib/src/facts/resolvers/dmi_resolver.cc +160 -0
  562. data/ext/facter/facter/lib/src/facts/resolvers/ec2_resolver.cc +174 -0
  563. data/ext/facter/facter/lib/src/facts/resolvers/filesystem_resolver.cc +118 -0
  564. data/ext/facter/facter/lib/src/facts/resolvers/fips_resolver.cc +23 -0
  565. data/ext/facter/facter/lib/src/facts/resolvers/gce_resolver.cc +276 -0
  566. data/ext/facter/facter/lib/src/facts/resolvers/hypervisors_resolver.cc +76 -0
  567. data/ext/facter/facter/lib/src/facts/resolvers/identity_resolver.cc +50 -0
  568. data/ext/facter/facter/lib/src/facts/resolvers/kernel_resolver.cc +62 -0
  569. data/ext/facter/facter/lib/src/facts/resolvers/ldom_resolver.cc +60 -0
  570. data/ext/facter/facter/lib/src/facts/resolvers/load_average_resolver.cc +36 -0
  571. data/ext/facter/facter/lib/src/facts/resolvers/memory_resolver.cc +88 -0
  572. data/ext/facter/facter/lib/src/facts/resolvers/networking_resolver.cc +280 -0
  573. data/ext/facter/facter/lib/src/facts/resolvers/operating_system_resolver.cc +276 -0
  574. data/ext/facter/facter/lib/src/facts/resolvers/path_resolver.cc +25 -0
  575. data/ext/facter/facter/lib/src/facts/resolvers/processor_resolver.cc +70 -0
  576. data/ext/facter/facter/lib/src/facts/resolvers/ruby_resolver.cc +109 -0
  577. data/ext/facter/facter/lib/src/facts/resolvers/ssh_resolver.cc +77 -0
  578. data/ext/facter/facter/lib/src/facts/resolvers/system_profiler_resolver.cc +137 -0
  579. data/ext/facter/facter/lib/src/facts/resolvers/timezone_resolver.cc +27 -0
  580. data/ext/facter/facter/lib/src/facts/resolvers/uptime_resolver.cc +63 -0
  581. data/ext/facter/facter/lib/src/facts/resolvers/virtualization_resolver.cc +119 -0
  582. data/ext/facter/facter/lib/src/facts/resolvers/xen_resolver.cc +80 -0
  583. data/ext/facter/facter/lib/src/facts/resolvers/zfs_resolver.cc +63 -0
  584. data/ext/facter/facter/lib/src/facts/resolvers/zone_resolver.cc +91 -0
  585. data/ext/facter/facter/lib/src/facts/resolvers/zpool_resolver.cc +93 -0
  586. data/ext/facter/facter/lib/src/facts/scalar_value.cc +73 -0
  587. data/ext/facter/facter/lib/src/facts/solaris/collection.cc +51 -0
  588. data/ext/facter/facter/lib/src/facts/solaris/disk_resolver.cc +35 -0
  589. data/ext/facter/facter/lib/src/facts/solaris/dmi_resolver.cc +86 -0
  590. data/ext/facter/facter/lib/src/facts/solaris/filesystem_resolver.cc +92 -0
  591. data/ext/facter/facter/lib/src/facts/solaris/kernel_resolver.cc +24 -0
  592. data/ext/facter/facter/lib/src/facts/solaris/ldom_resolver.cc +87 -0
  593. data/ext/facter/facter/lib/src/facts/solaris/memory_resolver.cc +91 -0
  594. data/ext/facter/facter/lib/src/facts/solaris/networking_resolver.cc +183 -0
  595. data/ext/facter/facter/lib/src/facts/solaris/operating_system_resolver.cc +83 -0
  596. data/ext/facter/facter/lib/src/facts/solaris/processor_resolver.cc +105 -0
  597. data/ext/facter/facter/lib/src/facts/solaris/virtualization_resolver.cc +38 -0
  598. data/ext/facter/facter/lib/src/facts/solaris/zfs_resolver.cc +12 -0
  599. data/ext/facter/facter/lib/src/facts/solaris/zone_resolver.cc +33 -0
  600. data/ext/facter/facter/lib/src/facts/solaris/zpool_resolver.cc +12 -0
  601. data/ext/facter/facter/lib/src/facts/windows/cache.cc +11 -0
  602. data/ext/facter/facter/lib/src/facts/windows/collection.cc +91 -0
  603. data/ext/facter/facter/lib/src/facts/windows/dmi_resolver.cc +38 -0
  604. data/ext/facter/facter/lib/src/facts/windows/identity_resolver.cc +46 -0
  605. data/ext/facter/facter/lib/src/facts/windows/kernel_resolver.cc +78 -0
  606. data/ext/facter/facter/lib/src/facts/windows/memory_resolver.cc +25 -0
  607. data/ext/facter/facter/lib/src/facts/windows/networking_resolver.cc +227 -0
  608. data/ext/facter/facter/lib/src/facts/windows/operating_system_resolver.cc +125 -0
  609. data/ext/facter/facter/lib/src/facts/windows/processor_resolver.cc +99 -0
  610. data/ext/facter/facter/lib/src/facts/windows/timezone_resolver.cc +28 -0
  611. data/ext/facter/facter/lib/src/facts/windows/uptime_resolver.cc +26 -0
  612. data/ext/facter/facter/lib/src/facts/windows/virtualization_resolver.cc +63 -0
  613. data/ext/facter/facter/lib/src/java/facter.cc +185 -0
  614. data/ext/facter/facter/lib/src/logging/logging.cc +151 -0
  615. data/ext/facter/facter/lib/src/ruby/aggregate_resolution.cc +249 -0
  616. data/ext/facter/facter/lib/src/ruby/chunk.cc +136 -0
  617. data/ext/facter/facter/lib/src/ruby/confine.cc +84 -0
  618. data/ext/facter/facter/lib/src/ruby/fact.cc +382 -0
  619. data/ext/facter/facter/lib/src/ruby/module.cc +1130 -0
  620. data/ext/facter/facter/lib/src/ruby/resolution.cc +230 -0
  621. data/ext/facter/facter/lib/src/ruby/ruby.cc +150 -0
  622. data/ext/facter/facter/lib/src/ruby/ruby_value.cc +288 -0
  623. data/ext/facter/facter/lib/src/ruby/simple_resolution.cc +156 -0
  624. data/ext/facter/facter/lib/src/util/bsd/scoped_ifaddrs.cc +29 -0
  625. data/ext/facter/facter/lib/src/util/config/config.cc +83 -0
  626. data/ext/facter/facter/lib/src/util/config/posix/config.cc +12 -0
  627. data/ext/facter/facter/lib/src/util/config/windows/config.cc +14 -0
  628. data/ext/facter/facter/lib/src/util/posix/scoped_addrinfo.cc +41 -0
  629. data/ext/facter/facter/lib/src/util/posix/scoped_bio.cc +29 -0
  630. data/ext/facter/facter/lib/src/util/posix/scoped_descriptor.cc +20 -0
  631. data/ext/facter/facter/lib/src/util/scoped_file.cc +26 -0
  632. data/ext/facter/facter/lib/src/util/solaris/k_stat.cc +165 -0
  633. data/ext/facter/facter/lib/src/util/solaris/scoped_kstat.cc +31 -0
  634. data/ext/facter/facter/lib/src/util/string.cc +170 -0
  635. data/ext/facter/facter/lib/src/util/windows/wsa.cc +69 -0
  636. data/ext/facter/facter/lib/src/util/yaml.cc +72 -0
  637. data/ext/facter/facter/lib/tasks/spec.rake +26 -0
  638. data/ext/facter/facter/lib/tests/CMakeLists.txt +172 -0
  639. data/ext/facter/facter/lib/tests/collection_fixture.cc +15 -0
  640. data/ext/facter/facter/lib/tests/collection_fixture.hpp +19 -0
  641. data/ext/facter/facter/lib/tests/cwrapper.cc +22 -0
  642. data/ext/facter/facter/lib/tests/facts/array_value.cc +140 -0
  643. data/ext/facter/facter/lib/tests/facts/boolean_value.cc +67 -0
  644. data/ext/facter/facter/lib/tests/facts/cache.cc +100 -0
  645. data/ext/facter/facter/lib/tests/facts/collection.cc +576 -0
  646. data/ext/facter/facter/lib/tests/facts/double_value.cc +40 -0
  647. data/ext/facter/facter/lib/tests/facts/external/json_resolver.cc +62 -0
  648. data/ext/facter/facter/lib/tests/facts/external/posix/execution_resolver.cc +69 -0
  649. data/ext/facter/facter/lib/tests/facts/external/text_resolver.cc +46 -0
  650. data/ext/facter/facter/lib/tests/facts/external/windows/execution_resolver.cc +69 -0
  651. data/ext/facter/facter/lib/tests/facts/external/windows/powershell_resolver.cc +122 -0
  652. data/ext/facter/facter/lib/tests/facts/external/yaml_resolver.cc +70 -0
  653. data/ext/facter/facter/lib/tests/facts/integer_value.cc +69 -0
  654. data/ext/facter/facter/lib/tests/facts/linux/dmi_resolver.cc +116 -0
  655. data/ext/facter/facter/lib/tests/facts/linux/filesystem_resolver.cc +13 -0
  656. data/ext/facter/facter/lib/tests/facts/linux/processor_fixture.cc +259 -0
  657. data/ext/facter/facter/lib/tests/facts/linux/processor_fixture.hpp +77 -0
  658. data/ext/facter/facter/lib/tests/facts/linux/processor_resolver.cc +312 -0
  659. data/ext/facter/facter/lib/tests/facts/linux/virtualization_resolver.cc +48 -0
  660. data/ext/facter/facter/lib/tests/facts/map_value.cc +116 -0
  661. data/ext/facter/facter/lib/tests/facts/posix/collection.cc +39 -0
  662. data/ext/facter/facter/lib/tests/facts/posix/uptime_resolver.cc +52 -0
  663. data/ext/facter/facter/lib/tests/facts/resolvers/augeas_resolver.cc +58 -0
  664. data/ext/facter/facter/lib/tests/facts/resolvers/disk_resolver.cc +114 -0
  665. data/ext/facter/facter/lib/tests/facts/resolvers/dmi_resolver.cc +152 -0
  666. data/ext/facter/facter/lib/tests/facts/resolvers/filesystem_resolver.cc +206 -0
  667. data/ext/facter/facter/lib/tests/facts/resolvers/identity_resolver.cc +83 -0
  668. data/ext/facter/facter/lib/tests/facts/resolvers/kernel_resolver.cc +61 -0
  669. data/ext/facter/facter/lib/tests/facts/resolvers/ldom_resolver.cc +86 -0
  670. data/ext/facter/facter/lib/tests/facts/resolvers/memory_resolver.cc +135 -0
  671. data/ext/facter/facter/lib/tests/facts/resolvers/networking_resolver.cc +507 -0
  672. data/ext/facter/facter/lib/tests/facts/resolvers/operating_system_resolver.cc +247 -0
  673. data/ext/facter/facter/lib/tests/facts/resolvers/processor_resolver.cc +157 -0
  674. data/ext/facter/facter/lib/tests/facts/resolvers/ruby_resolver.cc +74 -0
  675. data/ext/facter/facter/lib/tests/facts/resolvers/ssh_resolver.cc +103 -0
  676. data/ext/facter/facter/lib/tests/facts/resolvers/system_profiler_resolver.cc +135 -0
  677. data/ext/facter/facter/lib/tests/facts/resolvers/timezone_resolver.cc +49 -0
  678. data/ext/facter/facter/lib/tests/facts/resolvers/uptime_resolver.cc +151 -0
  679. data/ext/facter/facter/lib/tests/facts/resolvers/virtualization_resolver.cc +175 -0
  680. data/ext/facter/facter/lib/tests/facts/resolvers/xen_resolver.cc +100 -0
  681. data/ext/facter/facter/lib/tests/facts/resolvers/zfs_resolver.cc +65 -0
  682. data/ext/facter/facter/lib/tests/facts/resolvers/zone_resolver.cc +122 -0
  683. data/ext/facter/facter/lib/tests/facts/resolvers/zpool_resolver.cc +69 -0
  684. data/ext/facter/facter/lib/tests/facts/schema.cc +796 -0
  685. data/ext/facter/facter/lib/tests/facts/string_value.cc +270 -0
  686. data/ext/facter/facter/lib/tests/facts/windows/collection.cc +60 -0
  687. data/ext/facter/facter/lib/tests/facts/windows/networking_resolver.cc +217 -0
  688. data/ext/facter/facter/lib/tests/fixtures.cc +62 -0
  689. data/ext/facter/facter/lib/tests/fixtures.hpp.in +27 -0
  690. data/ext/facter/facter/lib/tests/fixtures/execution/with space/command_with_space.bat +2 -0
  691. data/ext/facter/facter/lib/tests/fixtures/facts/external/json/facts.json +12 -0
  692. data/ext/facter/facter/lib/tests/fixtures/facts/external/json/invalid.json +1 -0
  693. data/ext/facter/facter/lib/tests/fixtures/facts/external/ordering/bar/foo.yaml +1 -0
  694. data/ext/facter/facter/lib/tests/fixtures/facts/external/ordering/foo/foo.yaml +1 -0
  695. data/ext/facter/facter/lib/tests/fixtures/facts/external/posix/execution/error_message +4 -0
  696. data/ext/facter/facter/lib/tests/fixtures/facts/external/posix/execution/facts +5 -0
  697. data/ext/facter/facter/lib/tests/fixtures/facts/external/posix/execution/failed +3 -0
  698. data/ext/facter/facter/lib/tests/fixtures/facts/external/posix/execution/not_executable +1 -0
  699. data/ext/facter/facter/lib/tests/fixtures/facts/external/text/facts.txt +4 -0
  700. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/error_message.bat +4 -0
  701. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/facts.bat +4 -0
  702. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/failed.cmd +2 -0
  703. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/not_executable +1 -0
  704. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/execution/ruby_script.rb +1 -0
  705. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/error_message.ps1 +3 -0
  706. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/facts.ps1 +4 -0
  707. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/failed.ps1 +2 -0
  708. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/json.ps1 +21 -0
  709. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/not_executable +1 -0
  710. data/ext/facter/facter/lib/tests/fixtures/facts/external/windows/powershell/yaml.ps1 +18 -0
  711. data/ext/facter/facter/lib/tests/fixtures/facts/external/yaml/facts.yaml +15 -0
  712. data/ext/facter/facter/lib/tests/fixtures/facts/external/yaml/invalid.yaml +1 -0
  713. data/ext/facter/facter/lib/tests/fixtures/facts/external/z/303/266/facts.rb +3 -0
  714. data/ext/facter/facter/lib/tests/fixtures/facts/external/z/303/266/facts.txt +1 -0
  715. data/ext/facter/facter/lib/tests/fixtures/facts/linux/cloud/azure +3 -0
  716. data/ext/facter/facter/lib/tests/fixtures/facts/linux/cloud/azure-unknown +3 -0
  717. data/ext/facter/facter/lib/tests/fixtures/facts/linux/cloud/not-azure +0 -0
  718. data/ext/facter/facter/lib/tests/fixtures/facts/linux/dmidecode/full.txt +83 -0
  719. data/ext/facter/facter/lib/tests/fixtures/facts/linux/dmidecode/full_alternative.txt +83 -0
  720. data/ext/facter/facter/lib/tests/fixtures/facts/linux/dmidecode/none.txt +2 -0
  721. data/ext/facter/facter/lib/tests/fixtures/ruby/100_resolutions.rb +7 -0
  722. data/ext/facter/facter/lib/tests/fixtures/ruby/101_resolutions.rb +7 -0
  723. data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate.rb +9 -0
  724. data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_invalid_require.rb +9 -0
  725. data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_block.rb +30 -0
  726. data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_cycle.rb +9 -0
  727. data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_invalid_merge.rb +13 -0
  728. data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_merge.rb +23 -0
  729. data/ext/facter/facter/lib/tests/fixtures/ruby/aggregate_with_require.rb +16 -0
  730. data/ext/facter/facter/lib/tests/fixtures/ruby/array_confine.rb +6 -0
  731. data/ext/facter/facter/lib/tests/fixtures/ruby/array_fact.rb +5 -0
  732. data/ext/facter/facter/lib/tests/fixtures/ruby/bad_command.rb +19 -0
  733. data/ext/facter/facter/lib/tests/fixtures/ruby/bad_syntax.rb +2 -0
  734. data/ext/facter/facter/lib/tests/fixtures/ruby/bignum_fact_value.rb +5 -0
  735. data/ext/facter/facter/lib/tests/fixtures/ruby/block_confine.rb +9 -0
  736. data/ext/facter/facter/lib/tests/fixtures/ruby/block_false_confine.rb +9 -0
  737. data/ext/facter/facter/lib/tests/fixtures/ruby/block_nil_confine.rb +9 -0
  738. data/ext/facter/facter/lib/tests/fixtures/ruby/block_true_confine.rb +9 -0
  739. data/ext/facter/facter/lib/tests/fixtures/ruby/boolean_false_confine.rb +6 -0
  740. data/ext/facter/facter/lib/tests/fixtures/ruby/boolean_false_fact.rb +5 -0
  741. data/ext/facter/facter/lib/tests/fixtures/ruby/boolean_true_confine.rb +6 -0
  742. data/ext/facter/facter/lib/tests/fixtures/ruby/boolean_true_fact.rb +5 -0
  743. data/ext/facter/facter/lib/tests/fixtures/ruby/command_with_space.rb +5 -0
  744. data/ext/facter/facter/lib/tests/fixtures/ruby/confine_missing_fact.rb +22 -0
  745. data/ext/facter/facter/lib/tests/fixtures/ruby/confine_weight.rb +20 -0
  746. data/ext/facter/facter/lib/tests/fixtures/ruby/custom_dir/expect_network_init.rb +15 -0
  747. data/ext/facter/facter/lib/tests/fixtures/ruby/cycle.rb +7 -0
  748. data/ext/facter/facter/lib/tests/fixtures/ruby/debug.rb +7 -0
  749. data/ext/facter/facter/lib/tests/fixtures/ruby/debugging.rb +14 -0
  750. data/ext/facter/facter/lib/tests/fixtures/ruby/debugonce.rb +9 -0
  751. data/ext/facter/facter/lib/tests/fixtures/ruby/define_aggregate_fact.rb +13 -0
  752. data/ext/facter/facter/lib/tests/fixtures/ruby/define_fact.rb +9 -0
  753. data/ext/facter/facter/lib/tests/fixtures/ruby/double_fact.rb +5 -0
  754. data/ext/facter/facter/lib/tests/fixtures/ruby/empty_command.rb +3 -0
  755. data/ext/facter/facter/lib/tests/fixtures/ruby/empty_fact.rb +1 -0
  756. data/ext/facter/facter/lib/tests/fixtures/ruby/empty_fact_with_value.rb +1 -0
  757. data/ext/facter/facter/lib/tests/fixtures/ruby/empty_setcode_command.rb +3 -0
  758. data/ext/facter/facter/lib/tests/fixtures/ruby/exec.rb +7 -0
  759. data/ext/facter/facter/lib/tests/fixtures/ruby/execute_on_fail_raise.rb +17 -0
  760. data/ext/facter/facter/lib/tests/fixtures/ruby/execute_on_fail_value.rb +5 -0
  761. data/ext/facter/facter/lib/tests/fixtures/ruby/execute_timeout.rb +1 -0
  762. data/ext/facter/facter/lib/tests/fixtures/ruby/execution_failure.rb +5 -0
  763. data/ext/facter/facter/lib/tests/fixtures/ruby/existing_aggregate_resolution.rb +5 -0
  764. data/ext/facter/facter/lib/tests/fixtures/ruby/existing_simple_resolution.rb +5 -0
  765. data/ext/facter/facter/lib/tests/fixtures/ruby/fact.rb +7 -0
  766. data/ext/facter/facter/lib/tests/fixtures/ruby/facter.rb +7 -0
  767. data/ext/facter/facter/lib/tests/fixtures/ruby/facterversion.rb +17 -0
  768. data/ext/facter/facter/lib/tests/fixtures/ruby/hash_fact.rb +5 -0
  769. data/ext/facter/facter/lib/tests/fixtures/ruby/hash_with_non_string_key.rb +5 -0
  770. data/ext/facter/facter/lib/tests/fixtures/ruby/integer_fact.rb +5 -0
  771. data/ext/facter/facter/lib/tests/fixtures/ruby/log_exception.rb +21 -0
  772. data/ext/facter/facter/lib/tests/fixtures/ruby/lookup.rb +7 -0
  773. data/ext/facter/facter/lib/tests/fixtures/ruby/multi_confine.rb +6 -0
  774. data/ext/facter/facter/lib/tests/fixtures/ruby/named_resolution.rb +13 -0
  775. data/ext/facter/facter/lib/tests/fixtures/ruby/negative_number.rb +5 -0
  776. data/ext/facter/facter/lib/tests/fixtures/ruby/nil_fact.rb +5 -0
  777. data/ext/facter/facter/lib/tests/fixtures/ruby/nonexistent_command.rb +21 -0
  778. data/ext/facter/facter/lib/tests/fixtures/ruby/on_message.rb +16 -0
  779. data/ext/facter/facter/lib/tests/fixtures/ruby/range_confine.rb +6 -0
  780. data/ext/facter/facter/lib/tests/fixtures/ruby/regexp_confine.rb +6 -0
  781. data/ext/facter/facter/lib/tests/fixtures/ruby/ruby.rb +6 -0
  782. data/ext/facter/facter/lib/tests/fixtures/ruby/simple.rb +11 -0
  783. data/ext/facter/facter/lib/tests/fixtures/ruby/simple_command.rb +7 -0
  784. data/ext/facter/facter/lib/tests/fixtures/ruby/simple_confine.rb +6 -0
  785. data/ext/facter/facter/lib/tests/fixtures/ruby/simple_resolution.rb +5 -0
  786. data/ext/facter/facter/lib/tests/fixtures/ruby/single_allocation.rb +7 -0
  787. data/ext/facter/facter/lib/tests/fixtures/ruby/stderr_output.rb +9 -0
  788. data/ext/facter/facter/lib/tests/fixtures/ruby/string_fact.rb +5 -0
  789. data/ext/facter/facter/lib/tests/fixtures/ruby/timeout.rb +10 -0
  790. data/ext/facter/facter/lib/tests/fixtures/ruby/trace.rb +22 -0
  791. data/ext/facter/facter/lib/tests/fixtures/ruby/uni/341/220/201dir/customfacts/342/204/242.rb +6 -0
  792. data/ext/facter/facter/lib/tests/fixtures/ruby/uses_exit_code.rb +7 -0
  793. data/ext/facter/facter/lib/tests/fixtures/ruby/value.rb +6 -0
  794. data/ext/facter/facter/lib/tests/fixtures/ruby/version.rb +2 -0
  795. data/ext/facter/facter/lib/tests/fixtures/ruby/warn.rb +7 -0
  796. data/ext/facter/facter/lib/tests/fixtures/ruby/warnonce.rb +9 -0
  797. data/ext/facter/facter/lib/tests/fixtures/ruby/weight.rb +20 -0
  798. data/ext/facter/facter/lib/tests/fixtures/ruby/weight_option.rb +17 -0
  799. data/ext/facter/facter/lib/tests/fixtures/ruby/which.rb +9 -0
  800. data/ext/facter/facter/lib/tests/fixtures/ruby/windows/ole.rb +7 -0
  801. data/ext/facter/facter/lib/tests/java/facter.cc +69 -0
  802. data/ext/facter/facter/lib/tests/log_capture.cc +29 -0
  803. data/ext/facter/facter/lib/tests/log_capture.hpp +35 -0
  804. data/ext/facter/facter/lib/tests/logging/logging.cc +69 -0
  805. data/ext/facter/facter/lib/tests/main.cc +20 -0
  806. data/ext/facter/facter/lib/tests/mock_server.cc +44 -0
  807. data/ext/facter/facter/lib/tests/mock_server.hpp +25 -0
  808. data/ext/facter/facter/lib/tests/ruby/ruby.cc +634 -0
  809. data/ext/facter/facter/lib/tests/ruby/ruby_dirfacts.cc +35 -0
  810. data/ext/facter/facter/lib/tests/ruby/ruby_helper.cc +41 -0
  811. data/ext/facter/facter/lib/tests/ruby/ruby_helper.hpp +8 -0
  812. data/ext/facter/facter/lib/tests/ruby/windows/ruby.cc +53 -0
  813. data/ext/facter/facter/lib/tests/util/bsd/scoped_ifaddrs.cc +10 -0
  814. data/ext/facter/facter/lib/tests/util/posix/scoped_addrinfo.cc +11 -0
  815. data/ext/facter/facter/lib/tests/util/posix/scoped_bio.cc +12 -0
  816. data/ext/facter/facter/lib/tests/util/posix/scoped_descriptor.cc +22 -0
  817. data/ext/facter/facter/lib/tests/util/string.cc +291 -0
  818. data/ext/facter/facter/lib/version.h.in +28 -0
  819. data/ext/facter/facter/locales/CMakeLists.txt +7 -0
  820. data/ext/facter/facter/locales/FACTER.pot +1508 -0
  821. data/ext/facter/facter/man/man8/facter.8 +205 -0
  822. data/ext/facter/facter/scripts/cpplint.py +4754 -0
  823. data/ext/facter/facter/scripts/travis_target.sh +83 -0
  824. data/ext/facter/facter/tasks/ci.rake +22 -0
  825. data/ext/facter/leatherman/CHANGELOG.md +430 -0
  826. data/ext/facter/leatherman/CMakeLists.txt +143 -0
  827. data/ext/facter/leatherman/CONTRIBUTING.md +98 -0
  828. data/ext/facter/leatherman/LICENSE +17 -0
  829. data/ext/facter/leatherman/LeathermanConfig.cmake.in +57 -0
  830. data/ext/facter/leatherman/LeathermanConfigVersion.cmake.in +11 -0
  831. data/ext/facter/leatherman/MAINTAINERS +28 -0
  832. data/ext/facter/leatherman/README.md +416 -0
  833. data/ext/facter/leatherman/appveyor.yml +47 -0
  834. data/ext/facter/leatherman/catch/CMakeLists.txt +1 -0
  835. data/ext/facter/leatherman/cmake/FindICU.cmake +690 -0
  836. data/ext/facter/leatherman/cmake/GetGitRevisionDescription.cmake +130 -0
  837. data/ext/facter/leatherman/cmake/GetGitRevisionDescription.cmake.in +38 -0
  838. data/ext/facter/leatherman/cmake/cflags.cmake +110 -0
  839. data/ext/facter/leatherman/cmake/generate_translations.cmake +17 -0
  840. data/ext/facter/leatherman/cmake/internal.cmake +241 -0
  841. data/ext/facter/leatherman/cmake/leatherman.cmake.in +369 -0
  842. data/ext/facter/leatherman/cmake/leatherman_config.cmake +80 -0
  843. data/ext/facter/leatherman/cmake/normalize_pot.cmake +17 -0
  844. data/ext/facter/leatherman/cmake/options.cmake +21 -0
  845. data/ext/facter/leatherman/cmake/pod2man.cmake +36 -0
  846. data/ext/facter/leatherman/curl/CMakeLists.txt +42 -0
  847. data/ext/facter/leatherman/curl/inc/leatherman/curl/client.hpp +441 -0
  848. data/ext/facter/leatherman/curl/inc/leatherman/curl/request.hpp +130 -0
  849. data/ext/facter/leatherman/curl/inc/leatherman/curl/response.hpp +80 -0
  850. data/ext/facter/leatherman/curl/src/client.cc +575 -0
  851. data/ext/facter/leatherman/curl/src/request.cc +112 -0
  852. data/ext/facter/leatherman/curl/src/response.cc +62 -0
  853. data/ext/facter/leatherman/curl/tests/CMakeLists.txt +22 -0
  854. data/ext/facter/leatherman/curl/tests/client_test.cc +613 -0
  855. data/ext/facter/leatherman/curl/tests/fixtures.cc +27 -0
  856. data/ext/facter/leatherman/curl/tests/fixtures.hpp +31 -0
  857. data/ext/facter/leatherman/curl/tests/mock_curl.cc +423 -0
  858. data/ext/facter/leatherman/curl/tests/mock_curl.hpp +85 -0
  859. data/ext/facter/leatherman/curl/tests/request_test.cc +85 -0
  860. data/ext/facter/leatherman/curl/tests/response_test.cc +58 -0
  861. data/ext/facter/leatherman/dynamic_library/CMakeLists.txt +43 -0
  862. data/ext/facter/leatherman/dynamic_library/inc/leatherman/dynamic_library/dynamic_library.hpp +122 -0
  863. data/ext/facter/leatherman/dynamic_library/src/dynamic_library.cc +57 -0
  864. data/ext/facter/leatherman/dynamic_library/src/posix/dynamic_library.cc +91 -0
  865. data/ext/facter/leatherman/dynamic_library/src/windows/dynamic_library.cc +128 -0
  866. data/ext/facter/leatherman/dynamic_library/tests/dynamic_library_tests.cc +94 -0
  867. data/ext/facter/leatherman/dynamic_library/tests/fixtures.hpp.in +3 -0
  868. data/ext/facter/leatherman/dynamic_library/tests/test-lib/goodbye.cc +5 -0
  869. data/ext/facter/leatherman/dynamic_library/tests/test-lib/hello.cc +7 -0
  870. data/ext/facter/leatherman/execution/CMakeLists.txt +65 -0
  871. data/ext/facter/leatherman/execution/inc/leatherman/execution/execution.hpp +488 -0
  872. data/ext/facter/leatherman/execution/src/execution.cc +510 -0
  873. data/ext/facter/leatherman/execution/src/posix/execution.cc +574 -0
  874. data/ext/facter/leatherman/execution/src/posix/generic/platform.cc +30 -0
  875. data/ext/facter/leatherman/execution/src/posix/platform.hpp +15 -0
  876. data/ext/facter/leatherman/execution/src/posix/solaris/platform.cc +197 -0
  877. data/ext/facter/leatherman/execution/src/windows/execution.cc +698 -0
  878. data/ext/facter/leatherman/execution/tests/fixtures.hpp.in +2 -0
  879. data/ext/facter/leatherman/execution/tests/fixtures/echo_pid +2 -0
  880. data/ext/facter/leatherman/execution/tests/fixtures/error_message +5 -0
  881. data/ext/facter/leatherman/execution/tests/fixtures/execution/selfkill.sh +3 -0
  882. data/ext/facter/leatherman/execution/tests/fixtures/execution/sleep.sh +3 -0
  883. data/ext/facter/leatherman/execution/tests/fixtures/facts +5 -0
  884. data/ext/facter/leatherman/execution/tests/fixtures/failed +3 -0
  885. data/ext/facter/leatherman/execution/tests/fixtures/ls/crlf.txt +3 -0
  886. data/ext/facter/leatherman/execution/tests/fixtures/ls/file1.txt +1 -0
  887. data/ext/facter/leatherman/execution/tests/fixtures/ls/file2.txt +1 -0
  888. data/ext/facter/leatherman/execution/tests/fixtures/ls/file3.txt +1 -0
  889. data/ext/facter/leatherman/execution/tests/fixtures/ls/file4.txt +7 -0
  890. data/ext/facter/leatherman/execution/tests/fixtures/not_executable +1 -0
  891. data/ext/facter/leatherman/execution/tests/fixtures/windows/error_message.bat +6 -0
  892. data/ext/facter/leatherman/execution/tests/fixtures/windows/facts.bat +4 -0
  893. data/ext/facter/leatherman/execution/tests/fixtures/windows/failed.cmd +2 -0
  894. data/ext/facter/leatherman/execution/tests/fixtures/windows/not_executable +1 -0
  895. data/ext/facter/leatherman/execution/tests/fixtures/windows/ruby_script.rb +1 -0
  896. data/ext/facter/leatherman/execution/tests/log_capture.cc +29 -0
  897. data/ext/facter/leatherman/execution/tests/log_capture.hpp +35 -0
  898. data/ext/facter/leatherman/execution/tests/lth_cat.cc +38 -0
  899. data/ext/facter/leatherman/execution/tests/lth_cat.hpp +9 -0
  900. data/ext/facter/leatherman/execution/tests/posix/execution.cc +728 -0
  901. data/ext/facter/leatherman/execution/tests/posix/solaris/execution.cc +54 -0
  902. data/ext/facter/leatherman/execution/tests/windows/execution.cc +789 -0
  903. data/ext/facter/leatherman/file_util/CMakeLists.txt +18 -0
  904. data/ext/facter/leatherman/file_util/inc/leatherman/file_util/directory.hpp +28 -0
  905. data/ext/facter/leatherman/file_util/inc/leatherman/file_util/file.hpp +95 -0
  906. data/ext/facter/leatherman/file_util/src/directory.cc +51 -0
  907. data/ext/facter/leatherman/file_util/src/file.cc +131 -0
  908. data/ext/facter/leatherman/file_util/tests/directory_utils_test.cc +87 -0
  909. data/ext/facter/leatherman/file_util/tests/file_utils_test.cc +195 -0
  910. data/ext/facter/leatherman/file_util/tests/fixtures.cc +37 -0
  911. data/ext/facter/leatherman/file_util/tests/fixtures.hpp +39 -0
  912. data/ext/facter/leatherman/json_container/CMakeLists.txt +11 -0
  913. data/ext/facter/leatherman/json_container/README.md +108 -0
  914. data/ext/facter/leatherman/json_container/inc/leatherman/json_container/json_container.hpp +443 -0
  915. data/ext/facter/leatherman/json_container/src/json_container.cc +655 -0
  916. data/ext/facter/leatherman/json_container/tests/json_container_test.cc +1129 -0
  917. data/ext/facter/leatherman/locale/CMakeLists.txt +46 -0
  918. data/ext/facter/leatherman/locale/disabled/locale.cc +38 -0
  919. data/ext/facter/leatherman/locale/inc/leatherman/locale/locale.hpp +263 -0
  920. data/ext/facter/leatherman/locale/locales/CMakeLists.txt +6 -0
  921. data/ext/facter/leatherman/locale/locales/fr.po +40 -0
  922. data/ext/facter/leatherman/locale/locales/leatherman_locale.pot +41 -0
  923. data/ext/facter/leatherman/locale/src/locale.cc +95 -0
  924. data/ext/facter/leatherman/locale/tests/format.cc +117 -0
  925. data/ext/facter/leatherman/locale/tests/locale.cc +190 -0
  926. data/ext/facter/leatherman/locales/CMakeLists.txt +7 -0
  927. data/ext/facter/leatherman/locales/leatherman.pot +717 -0
  928. data/ext/facter/leatherman/logging/CMakeLists.txt +43 -0
  929. data/ext/facter/leatherman/logging/inc/leatherman/logging/logging.hpp +264 -0
  930. data/ext/facter/leatherman/logging/locales/CMakeLists.txt +6 -0
  931. data/ext/facter/leatherman/logging/locales/fr.po +72 -0
  932. data/ext/facter/leatherman/logging/locales/leatherman_logging.pot +72 -0
  933. data/ext/facter/leatherman/logging/src/logging.cc +229 -0
  934. data/ext/facter/leatherman/logging/src/posix/logging.cc +39 -0
  935. data/ext/facter/leatherman/logging/src/windows/logging.cc +52 -0
  936. data/ext/facter/leatherman/logging/tests/logging.cc +118 -0
  937. data/ext/facter/leatherman/logging/tests/logging.hpp +88 -0
  938. data/ext/facter/leatherman/logging/tests/logging_i18n.cc +103 -0
  939. data/ext/facter/leatherman/logging/tests/logging_on_message.cc +61 -0
  940. data/ext/facter/leatherman/logging/tests/logging_stream.cc +159 -0
  941. data/ext/facter/leatherman/logging/tests/logging_stream_lines.cc +172 -0
  942. data/ext/facter/leatherman/logging/tests/posix/logging.cc +23 -0
  943. data/ext/facter/leatherman/logging/tests/windows/logging.cc +13 -0
  944. data/ext/facter/leatherman/nowide/CMakeLists.txt +7 -0
  945. data/ext/facter/leatherman/rapidjson/CMakeLists.txt +1 -0
  946. data/ext/facter/leatherman/ruby/CMakeLists.txt +26 -0
  947. data/ext/facter/leatherman/ruby/inc/leatherman/ruby/api.hpp +744 -0
  948. data/ext/facter/leatherman/ruby/src/api.cc +527 -0
  949. data/ext/facter/leatherman/ruby/src/posix/api.cc +14 -0
  950. data/ext/facter/leatherman/ruby/src/windows/api.cc +20 -0
  951. data/ext/facter/leatherman/ruby/tests/api-test.cc +206 -0
  952. data/ext/facter/leatherman/scripts/cpplint.py +6323 -0
  953. data/ext/facter/leatherman/tests/CMakeLists.txt +22 -0
  954. data/ext/facter/leatherman/tests/main.cc +17 -0
  955. data/ext/facter/leatherman/util/CMakeLists.txt +36 -0
  956. data/ext/facter/leatherman/util/inc/leatherman/util/environment.hpp +69 -0
  957. data/ext/facter/leatherman/util/inc/leatherman/util/option_set.hpp +228 -0
  958. data/ext/facter/leatherman/util/inc/leatherman/util/posix/scoped_descriptor.hpp +32 -0
  959. data/ext/facter/leatherman/util/inc/leatherman/util/regex.hpp +80 -0
  960. data/ext/facter/leatherman/util/inc/leatherman/util/scope_exit.hpp +62 -0
  961. data/ext/facter/leatherman/util/inc/leatherman/util/scoped_env.hpp +35 -0
  962. data/ext/facter/leatherman/util/inc/leatherman/util/scoped_resource.hpp +130 -0
  963. data/ext/facter/leatherman/util/inc/leatherman/util/strings.hpp +54 -0
  964. data/ext/facter/leatherman/util/inc/leatherman/util/time.hpp +36 -0
  965. data/ext/facter/leatherman/util/inc/leatherman/util/timer.hpp +43 -0
  966. data/ext/facter/leatherman/util/inc/leatherman/util/uri.hpp +23 -0
  967. data/ext/facter/leatherman/util/inc/leatherman/util/windows/scoped_handle.hpp +32 -0
  968. data/ext/facter/leatherman/util/src/environment.cc +29 -0
  969. data/ext/facter/leatherman/util/src/posix/environment.cc +75 -0
  970. data/ext/facter/leatherman/util/src/posix/scoped_descriptor.cc +23 -0
  971. data/ext/facter/leatherman/util/src/posix/time.cc +9 -0
  972. data/ext/facter/leatherman/util/src/scope_exit.cc +43 -0
  973. data/ext/facter/leatherman/util/src/scoped_env.cc +37 -0
  974. data/ext/facter/leatherman/util/src/strings.cc +41 -0
  975. data/ext/facter/leatherman/util/src/time.cc +49 -0
  976. data/ext/facter/leatherman/util/src/uri.cc +75 -0
  977. data/ext/facter/leatherman/util/src/windows/environment.cc +75 -0
  978. data/ext/facter/leatherman/util/src/windows/scoped_handle.cc +24 -0
  979. data/ext/facter/leatherman/util/src/windows/time.cc +10 -0
  980. data/ext/facter/leatherman/util/tests/environment.cc +90 -0
  981. data/ext/facter/leatherman/util/tests/option_set.cc +234 -0
  982. data/ext/facter/leatherman/util/tests/posix/environment.cc +36 -0
  983. data/ext/facter/leatherman/util/tests/scoped_env.cc +52 -0
  984. data/ext/facter/leatherman/util/tests/strings_test.cc +71 -0
  985. data/ext/facter/leatherman/util/tests/timer.cc +39 -0
  986. data/ext/facter/leatherman/util/tests/uri.cc +104 -0
  987. data/ext/facter/leatherman/util/tests/windows/environment.cc +30 -0
  988. data/ext/facter/leatherman/vendor/Catch-1.10.0.zip +0 -0
  989. data/ext/facter/leatherman/vendor/nowide/build/Jamfile.v2 +26 -0
  990. data/ext/facter/leatherman/vendor/nowide/doc/Doxyfile +1632 -0
  991. data/ext/facter/leatherman/vendor/nowide/doc/LICENSE_1_0.txt +23 -0
  992. data/ext/facter/leatherman/vendor/nowide/doc/gendoc.sh +11 -0
  993. data/ext/facter/leatherman/vendor/nowide/doc/main.txt +354 -0
  994. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/args.hpp +167 -0
  995. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/cenv.hpp +126 -0
  996. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/config.hpp +54 -0
  997. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/convert.hpp +154 -0
  998. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/cstdio.hpp +101 -0
  999. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/cstdlib.hpp +16 -0
  1000. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/filebuf.hpp +415 -0
  1001. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/fstream.hpp +283 -0
  1002. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/integration/filesystem.hpp +28 -0
  1003. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/iostream.hpp +99 -0
  1004. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/stackstring.hpp +154 -0
  1005. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/system.hpp +46 -0
  1006. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/utf8_codecvt.hpp +499 -0
  1007. data/ext/facter/leatherman/vendor/nowide/include/boost/nowide/windows.hpp +39 -0
  1008. data/ext/facter/leatherman/vendor/nowide/index.html +16 -0
  1009. data/ext/facter/leatherman/vendor/nowide/src/iostream.cpp +263 -0
  1010. data/ext/facter/leatherman/vendor/nowide/standalone/CMakeLists.txt +104 -0
  1011. data/ext/facter/leatherman/vendor/nowide/standalone/MinGW.cmake +9 -0
  1012. data/ext/facter/leatherman/vendor/nowide/standalone/config.hpp +37 -0
  1013. data/ext/facter/leatherman/vendor/nowide/standalone/convert +34 -0
  1014. data/ext/facter/leatherman/vendor/nowide/standalone/encoding_errors.hpp +58 -0
  1015. data/ext/facter/leatherman/vendor/nowide/standalone/encoding_utf.hpp +84 -0
  1016. data/ext/facter/leatherman/vendor/nowide/standalone/run_convert_and_build.sh +17 -0
  1017. data/ext/facter/leatherman/vendor/nowide/standalone/scoped_ptr.hpp +93 -0
  1018. data/ext/facter/leatherman/vendor/nowide/standalone/utf.hpp +469 -0
  1019. data/ext/facter/leatherman/vendor/nowide/template.hpp +19 -0
  1020. data/ext/facter/leatherman/vendor/nowide/test/Jamfile.v2 +43 -0
  1021. data/ext/facter/leatherman/vendor/nowide/test/test.hpp +25 -0
  1022. data/ext/facter/leatherman/vendor/nowide/test/test_codecvt.cpp +254 -0
  1023. data/ext/facter/leatherman/vendor/nowide/test/test_convert.cpp +101 -0
  1024. data/ext/facter/leatherman/vendor/nowide/test/test_env.cpp +49 -0
  1025. data/ext/facter/leatherman/vendor/nowide/test/test_fs.cpp +48 -0
  1026. data/ext/facter/leatherman/vendor/nowide/test/test_fstream.cpp +184 -0
  1027. data/ext/facter/leatherman/vendor/nowide/test/test_iostream.cpp +52 -0
  1028. data/ext/facter/leatherman/vendor/nowide/test/test_stdio.cpp +60 -0
  1029. data/ext/facter/leatherman/vendor/nowide/test/test_system.cpp +91 -0
  1030. data/ext/facter/leatherman/vendor/rapidjson-1.0.2.zip +0 -0
  1031. data/ext/facter/leatherman/windows/CMakeLists.txt +27 -0
  1032. data/ext/facter/leatherman/windows/inc/leatherman/windows/file_util.hpp +23 -0
  1033. data/ext/facter/leatherman/windows/inc/leatherman/windows/process.hpp +22 -0
  1034. data/ext/facter/leatherman/windows/inc/leatherman/windows/registry.hpp +56 -0
  1035. data/ext/facter/leatherman/windows/inc/leatherman/windows/system_error.hpp +23 -0
  1036. data/ext/facter/leatherman/windows/inc/leatherman/windows/user.hpp +30 -0
  1037. data/ext/facter/leatherman/windows/inc/leatherman/windows/windows.hpp +10 -0
  1038. data/ext/facter/leatherman/windows/inc/leatherman/windows/wmi.hpp +188 -0
  1039. data/ext/facter/leatherman/windows/src/file_util.cc +28 -0
  1040. data/ext/facter/leatherman/windows/src/process.cc +42 -0
  1041. data/ext/facter/leatherman/windows/src/registry.cc +96 -0
  1042. data/ext/facter/leatherman/windows/src/system_error.cc +33 -0
  1043. data/ext/facter/leatherman/windows/src/user.cc +76 -0
  1044. data/ext/facter/leatherman/windows/src/wmi.cc +208 -0
  1045. data/ext/facter/leatherman/windows/tests/file_utils_test.cc +13 -0
  1046. metadata +1089 -0
@@ -0,0 +1,382 @@
1
+ #include <internal/ruby/fact.hpp>
2
+ #include <internal/ruby/aggregate_resolution.hpp>
3
+ #include <internal/ruby/module.hpp>
4
+ #include <internal/ruby/simple_resolution.hpp>
5
+ #include <internal/ruby/ruby_value.hpp>
6
+ #include <facter/facts/collection.hpp>
7
+ #include <leatherman/util/environment.hpp>
8
+ #include <leatherman/logging/logging.hpp>
9
+ #include <leatherman/locale/locale.hpp>
10
+ #include <algorithm>
11
+
12
+ // Mark string for translation (alias for leatherman::locale::format)
13
+ using leatherman::locale::_;
14
+
15
+ using namespace std;
16
+ using namespace facter::facts;
17
+ using namespace leatherman::util;
18
+ using namespace leatherman::ruby;
19
+
20
+ namespace facter { namespace ruby {
21
+
22
+ // The maximum number of resolutions allowed for a fact
23
+ static const size_t MAXIMUM_RESOLUTIONS = 100;
24
+
25
+ fact::fact() :
26
+ _resolved(false),
27
+ _resolving(false),
28
+ _weight(0)
29
+ {
30
+ auto const& ruby = api::instance();
31
+ _self = ruby.nil_value();
32
+ _name = ruby.nil_value();
33
+ _value = ruby.nil_value();
34
+ }
35
+
36
+ VALUE fact::define()
37
+ {
38
+ auto const& ruby = api::instance();
39
+
40
+ VALUE klass = ruby.rb_define_class_under(ruby.lookup({ "Facter", "Util" }), "Fact", *ruby.rb_cObject);
41
+ ruby.rb_define_alloc_func(klass, alloc);
42
+ ruby.rb_define_method(klass, "initialize", RUBY_METHOD_FUNC(ruby_initialize), 1);
43
+ ruby.rb_define_method(klass, "name", RUBY_METHOD_FUNC(ruby_name), 0);
44
+ ruby.rb_define_method(klass, "value", RUBY_METHOD_FUNC(ruby_value), 0);
45
+ ruby.rb_define_method(klass, "resolution", RUBY_METHOD_FUNC(ruby_resolution), 1);
46
+ ruby.rb_define_method(klass, "define_resolution", RUBY_METHOD_FUNC(ruby_define_resolution), -1);
47
+ ruby.rb_define_method(klass, "flush", RUBY_METHOD_FUNC(ruby_flush), 0);
48
+ return klass;
49
+ }
50
+
51
+ VALUE fact::create(VALUE name)
52
+ {
53
+ auto const& ruby = api::instance();
54
+ return ruby.rb_class_new_instance(1, &name, ruby.lookup({"Facter", "Util", "Fact"}));
55
+ }
56
+
57
+ VALUE fact::name() const
58
+ {
59
+ return _name;
60
+ }
61
+
62
+ VALUE fact::value()
63
+ {
64
+ auto const& ruby = api::instance();
65
+ auto facter = module::current();
66
+
67
+ collection& facts = facter->facts();
68
+
69
+ // Prevent cycles by raising an exception
70
+ if (_resolving) {
71
+ ruby.rb_raise(*ruby.rb_eRuntimeError, _("cycle detected while requesting value of fact \"{1}\"", ruby.rb_string_value_ptr(&_name)).c_str());
72
+ }
73
+
74
+ if (_resolved) {
75
+ return _value;
76
+ }
77
+
78
+ // Sort the resolutions by weight (descending)
79
+ sort(_resolutions.begin(), _resolutions.end(), [&](VALUE first, VALUE second) {
80
+ auto res_first = ruby.to_native<resolution>(first);
81
+ auto res_second = ruby.to_native<resolution>(second);
82
+ return res_first->weight() > res_second->weight();
83
+ });
84
+
85
+ _resolving = true;
86
+
87
+ // If no resolutions or the top resolution has a weight of 0, first check the native collection for the fact
88
+ // This way we treat the "built-in" as implicitly having a resolution with weight 0
89
+ bool add = true;
90
+ if (_resolutions.empty() || ruby.to_native<resolution>(_resolutions.front())->weight() == 0) {
91
+ // Check to see the value is in the collection
92
+ auto value = facts[ruby.to_string(_name)];
93
+ if (value) {
94
+ // Already in collection, do not add
95
+ add = false;
96
+ _value = facter->to_ruby(value);
97
+ _weight = value->weight();
98
+ }
99
+ }
100
+
101
+ if (ruby.is_nil(_value)) {
102
+ vector<VALUE>::iterator it;
103
+ ruby.rescue([&]() {
104
+ volatile VALUE value = ruby.nil_value();
105
+ size_t weight = 0;
106
+
107
+ // Look through the resolutions and find the first allowed resolution that resolves
108
+ for (it = _resolutions.begin(); it != _resolutions.end(); ++it) {
109
+ auto res = ruby.to_native<resolution>(*it);
110
+ if (!res->suitable(*facter)) {
111
+ continue;
112
+ }
113
+ value = res->value();
114
+ if (!ruby.is_nil(value)) {
115
+ weight = res->weight();
116
+ break;
117
+ }
118
+ }
119
+
120
+ // Set the value to what was resolved
121
+ _value = value;
122
+ _weight = weight;
123
+ return 0;
124
+ }, [&](VALUE ex) {
125
+ LOG_ERROR("error while resolving custom fact \"{1}\": {2}", ruby.rb_string_value_ptr(&_name), ruby.exception_to_string(ex));
126
+
127
+ // Failed, so set to nil
128
+ _value = ruby.nil_value();
129
+ _weight = 0;
130
+ return 0;
131
+ });
132
+ }
133
+
134
+ if (add) {
135
+ facts.add_custom(ruby.to_string(_name), ruby.is_nil(_value) ? nullptr : make_value<ruby::ruby_value>(_value), _weight);
136
+ }
137
+
138
+ _resolved = true;
139
+ _resolving = false;
140
+ return _value;
141
+ }
142
+
143
+ void fact::value(VALUE v)
144
+ {
145
+ _value = v;
146
+ _resolved = true;
147
+ }
148
+
149
+ VALUE fact::find_resolution(VALUE name) const
150
+ {
151
+ auto const& ruby = api::instance();
152
+
153
+ if (ruby.is_nil(name)) {
154
+ return ruby.nil_value();
155
+ }
156
+
157
+ if (!ruby.is_string(name)) {
158
+ ruby.rb_raise(*ruby.rb_eTypeError, _("expected resolution name to be a String").c_str());
159
+ }
160
+
161
+ // Search for the resolution by name
162
+ auto it = find_if(_resolutions.begin(), _resolutions.end(), [&](VALUE self) {
163
+ return ruby.equals(ruby.to_native<resolution>(self)->name(), name);
164
+ });
165
+ if (it == _resolutions.end()) {
166
+ return ruby.nil_value();
167
+ }
168
+ return *it;
169
+ }
170
+
171
+ VALUE fact::define_resolution(VALUE name, VALUE options)
172
+ {
173
+ // Do not declare types with destructors; if you do, wrap below in a api::protect call
174
+ auto const& ruby = api::instance();
175
+
176
+ if (!ruby.is_nil(name) && !ruby.is_string(name) && !ruby.is_symbol(name)) {
177
+ ruby.rb_raise(*ruby.rb_eTypeError, _("expected resolution name to be a Symbol or String").c_str());
178
+ }
179
+
180
+ if (ruby.is_symbol(name)) {
181
+ name = ruby.rb_sym_to_s(name);
182
+ }
183
+
184
+ bool aggregate = false;
185
+ bool has_weight = false;
186
+ size_t weight = 0;
187
+ volatile VALUE resolution_value = ruby.nil_value();
188
+
189
+ // Read the options if provided
190
+ if (!ruby.is_nil(options)) {
191
+ ID simple_id = ruby.rb_intern("simple");
192
+ ID aggregate_id = ruby.rb_intern("aggregate");
193
+ ID type_id = ruby.rb_intern("type");
194
+ ID value_id = ruby.rb_intern("value");
195
+ ID weight_id = ruby.rb_intern("weight");
196
+ ID timeout_id = ruby.rb_intern("timeout");
197
+
198
+ if (!ruby.is_hash(options)) {
199
+ ruby.rb_raise(*ruby.rb_eTypeError, _("expected a Hash for the options").c_str());
200
+ }
201
+
202
+ ruby.hash_for_each(options, [&](VALUE key, VALUE value) {
203
+ if (!ruby.is_symbol(key)) {
204
+ ruby.rb_raise(*ruby.rb_eTypeError, _("expected a Symbol for options key").c_str());
205
+ }
206
+ ID key_id = ruby.rb_to_id(key);
207
+ if (key_id == type_id) {
208
+ // Handle the type option
209
+ if (!ruby.is_symbol(value)) {
210
+ ruby.rb_raise(*ruby.rb_eTypeError, _("expected a Symbol for type option").c_str());
211
+ }
212
+ ID type_id = ruby.rb_to_id(value);
213
+ if (type_id != simple_id && type_id != aggregate_id) {
214
+ ruby.rb_raise(*ruby.rb_eArgError, _("expected simple or aggregate for resolution type but was given {1}", ruby.rb_id2name(type_id)).c_str());
215
+ }
216
+ aggregate = (type_id == aggregate_id);
217
+ } else if (key_id == value_id) {
218
+ // Handle the value option
219
+ resolution_value = value;
220
+ } else if (key_id == weight_id) {
221
+ // Handle the weight option
222
+ has_weight = true;
223
+ weight = ruby.num2size_t(value);
224
+ } else if (key_id == timeout_id) {
225
+ // Ignore timeout as it isn't supported
226
+ static bool timeout_warning = true;
227
+ if (timeout_warning) {
228
+ LOG_WARNING("timeout option is not supported for custom facts and will be ignored.")
229
+ timeout_warning = false;
230
+ }
231
+ } else {
232
+ ruby.rb_raise(*ruby.rb_eArgError, _("unexpected option {1}", ruby.rb_id2name(key_id)).c_str());
233
+ }
234
+ return true;
235
+ });
236
+ }
237
+
238
+ // Find or create the resolution
239
+ VALUE resolution_self = find_resolution(name);
240
+ if (ruby.is_nil(resolution_self)) {
241
+ if (_resolutions.size() == MAXIMUM_RESOLUTIONS) {
242
+ ruby.rb_raise(*ruby.rb_eRuntimeError, _("fact \"{1}\" already has the maximum number of resolutions allowed ({2}).", ruby.rb_string_value_ptr(&_name), MAXIMUM_RESOLUTIONS).c_str());
243
+ }
244
+
245
+ if (aggregate) {
246
+ _resolutions.push_back(aggregate_resolution::create());
247
+ } else {
248
+ _resolutions.push_back(simple_resolution::create());
249
+ }
250
+ resolution_self = _resolutions.back();
251
+ } else {
252
+ if (aggregate && !ruby.is_a(resolution_self, ruby.lookup({ "Facter", "Core", "Aggregate"}))) {
253
+ ruby.rb_raise(*ruby.rb_eArgError,
254
+ _("cannot define an aggregate resolution with name \"{1}\": a simple resolution with the same name already exists",
255
+ ruby.rb_string_value_ptr(&name)).c_str());
256
+ } else if (!aggregate && !ruby.is_a(resolution_self, ruby.lookup({ "Facter", "Util", "Resolution"}))) {
257
+ ruby.rb_raise(*ruby.rb_eArgError,
258
+ _("cannot define a simple resolution with name \"{1}\": an aggregate resolution with the same name already exists",
259
+ ruby.rb_string_value_ptr(&name)).c_str());
260
+ }
261
+ }
262
+
263
+ // Set the name, value, and weight
264
+ auto res = ruby.to_native<resolution>(resolution_self);
265
+ res->name(name);
266
+ res->value(resolution_value);
267
+ if (has_weight) {
268
+ res->weight(weight);
269
+ }
270
+
271
+ // Call the block if one was given
272
+ if (ruby.rb_block_given_p()) {
273
+ ruby.rb_funcall_passing_block(resolution_self, ruby.rb_intern("instance_eval"), 0, nullptr);
274
+ }
275
+ return resolution_self;
276
+ }
277
+
278
+ void fact::flush()
279
+ {
280
+ auto const& ruby = api::instance();
281
+
282
+ // Call flush on every resolution
283
+ for (auto r : _resolutions) {
284
+ ruby.to_native<resolution>(r)->flush();
285
+ }
286
+
287
+ // Reset the value
288
+ _resolved = false;
289
+ _value = ruby.nil_value();
290
+ }
291
+
292
+ VALUE fact::alloc(VALUE klass)
293
+ {
294
+ auto const& ruby = api::instance();
295
+
296
+ // Create a fact and wrap with a Ruby data object
297
+ unique_ptr<fact> f(new fact());
298
+ VALUE self = f->_self = ruby.rb_data_object_alloc(klass, f.get(), mark, free);
299
+ ruby.register_data_object(self);
300
+
301
+ // Release the smart pointer; ownership is now with Ruby's GC
302
+ f.release();
303
+ return self;
304
+ }
305
+
306
+ void fact::mark(void* data)
307
+ {
308
+ // Mark all VALUEs contained in the fact
309
+ auto const& ruby = api::instance();
310
+ auto instance = reinterpret_cast<fact*>(data);
311
+
312
+ // Mark the name and value
313
+ ruby.rb_gc_mark(instance->_name);
314
+ ruby.rb_gc_mark(instance->_value);
315
+
316
+ // Mark the resolutions
317
+ for (auto v : instance->_resolutions) {
318
+ ruby.rb_gc_mark(v);
319
+ }
320
+ }
321
+
322
+ void fact::free(void* data)
323
+ {
324
+ auto instance = reinterpret_cast<fact*>(data);
325
+
326
+ // Unregister the data object
327
+ auto const& ruby = api::instance();
328
+ ruby.unregister_data_object(instance->_self);
329
+
330
+ // Delete the fact
331
+ delete instance;
332
+ }
333
+
334
+ VALUE fact::ruby_initialize(VALUE self, VALUE name)
335
+ {
336
+ auto const& ruby = api::instance();
337
+
338
+ if (!ruby.is_string(name) && !ruby.is_symbol(name)) {
339
+ ruby.rb_raise(*ruby.rb_eTypeError, _("expected a String or Symbol for fact name").c_str());
340
+ }
341
+
342
+ ruby.to_native<fact>(self)->_name = name;
343
+ return self;
344
+ }
345
+
346
+ VALUE fact::ruby_name(VALUE self)
347
+ {
348
+ auto const& ruby = api::instance();
349
+ return ruby.to_native<fact>(self)->name();
350
+ }
351
+
352
+ VALUE fact::ruby_value(VALUE self)
353
+ {
354
+ auto const& ruby = api::instance();
355
+ return ruby.to_native<fact>(self)->value();
356
+ }
357
+
358
+ VALUE fact::ruby_resolution(VALUE self, VALUE name)
359
+ {
360
+ auto const& ruby = api::instance();
361
+ return ruby.to_native<fact>(self)->find_resolution(name);
362
+ }
363
+
364
+ VALUE fact::ruby_define_resolution(int argc, VALUE* argv, VALUE self)
365
+ {
366
+ auto const& ruby = api::instance();
367
+
368
+ if (argc == 0 || argc > 2) {
369
+ ruby.rb_raise(*ruby.rb_eArgError, _("wrong number of arguments ({1} for 2)", argc).c_str());
370
+ }
371
+
372
+ return ruby.to_native<fact>(self)->define_resolution(argv[0], argc > 1 ? argv[1] : ruby.nil_value());
373
+ }
374
+
375
+ VALUE fact::ruby_flush(VALUE self)
376
+ {
377
+ auto const& ruby = api::instance();
378
+ ruby.to_native<fact>(self)->flush();
379
+ return ruby.nil_value();
380
+ }
381
+
382
+ }} // namespace facter::ruby
@@ -0,0 +1,1130 @@
1
+ #include <internal/ruby/module.hpp>
2
+ #include <internal/ruby/aggregate_resolution.hpp>
3
+ #include <internal/ruby/confine.hpp>
4
+ #include <internal/ruby/simple_resolution.hpp>
5
+ #include <facter/facts/collection.hpp>
6
+ #include <facter/logging/logging.hpp>
7
+ #include <facter/util/config.hpp>
8
+ #include <facter/version.h>
9
+ #include <facter/export.h>
10
+ #include <leatherman/util/environment.hpp>
11
+ #include <leatherman/execution/execution.hpp>
12
+ #include <leatherman/file_util/directory.hpp>
13
+ #include <leatherman/logging/logging.hpp>
14
+ #include <leatherman/locale/locale.hpp>
15
+ #include <boost/filesystem.hpp>
16
+ #include <boost/algorithm/string.hpp>
17
+ #include <boost/nowide/iostream.hpp>
18
+ #include <boost/nowide/convert.hpp>
19
+ #include <stdexcept>
20
+ #include <functional>
21
+ #include <facter/facts/scalar_value.hpp>
22
+ #include <facter/facts/array_value.hpp>
23
+ #include <facter/facts/map_value.hpp>
24
+ #include <internal/ruby/ruby_value.hpp>
25
+
26
+ // Mark string for translation (alias for leatherman::locale::format)
27
+ using leatherman::locale::_;
28
+
29
+ using namespace std;
30
+ using namespace facter::facts;
31
+ using namespace facter::util::config;
32
+ using namespace leatherman::execution;
33
+ using namespace leatherman::file_util;
34
+ using namespace leatherman::util;
35
+ using namespace boost::filesystem;
36
+ using namespace leatherman::logging;
37
+ using namespace leatherman::ruby;
38
+
39
+ namespace facter { namespace ruby {
40
+
41
+ /**
42
+ * Helper for maintaining context when initialized via a Ruby require.
43
+ */
44
+ struct require_context
45
+ {
46
+ /**
47
+ * Constructs a new require context.
48
+ */
49
+ require_context()
50
+ {
51
+ // Create a collection and a facter module
52
+ boost::program_options::variables_map vm;
53
+ auto hocon_conf = load_default_config_file();
54
+ load_fact_settings(hocon_conf, vm);
55
+ set<string> blocklist;
56
+ if (vm.count("blocklist")) {
57
+ auto facts_to_block = vm["blocklist"].as<vector<string>>();
58
+ blocklist.insert(facts_to_block.begin(), facts_to_block.end());
59
+ }
60
+ auto ttls = load_ttls(hocon_conf);
61
+ _facts.reset(new collection(blocklist, ttls));
62
+ _module.reset(new module(*_facts));
63
+
64
+ // Ruby doesn't have a proper way of notifying extensions that the VM is shutting down
65
+ // The easiest way to get notified is to have a global data object that never gets collected
66
+ // until the VM shuts down
67
+ auto const& ruby = api::instance();
68
+ _canary = ruby.rb_data_object_alloc(*ruby.rb_cObject, this, nullptr, cleanup);
69
+ ruby.rb_gc_register_address(&_canary);
70
+ ruby.register_data_object(_canary);
71
+ }
72
+
73
+ /**
74
+ * Destructs the require context.
75
+ */
76
+ ~require_context()
77
+ {
78
+ _module.reset();
79
+ _facts.reset();
80
+
81
+ // Remove the finalizer and let Ruby collect the object
82
+ auto const& ruby = api::instance();
83
+ ruby.rb_gc_unregister_address(&_canary);
84
+ ruby.unregister_data_object(_canary);
85
+ }
86
+
87
+ /**
88
+ * Creates the require context.
89
+ */
90
+ static void create()
91
+ {
92
+ // Reset first before allocating a new context
93
+ reset();
94
+
95
+ _instance.reset(new require_context());
96
+ }
97
+
98
+ /**
99
+ * Resets the require context.
100
+ */
101
+ static void reset()
102
+ {
103
+ _instance.reset();
104
+ }
105
+
106
+ private:
107
+ static void cleanup(void* ptr)
108
+ {
109
+ if (ptr == _instance.get()) {
110
+ reset();
111
+ }
112
+ }
113
+
114
+ unique_ptr<collection> _facts;
115
+ unique_ptr<module> _module;
116
+ VALUE _canary;
117
+
118
+ static unique_ptr<require_context> _instance;
119
+ };
120
+
121
+ unique_ptr<require_context> require_context::_instance;
122
+ }}
123
+
124
+ // Exports for a Ruby extension.
125
+ extern "C" {
126
+ /**
127
+ * Called by the Ruby VM when native facter is required.
128
+ */
129
+ void LIBFACTER_EXPORT Init_libfacter()
130
+ {
131
+ bool logging_init_failed = false;
132
+ string logging_init_error_msg;
133
+ try {
134
+ facter::logging::setup_logging(boost::nowide::cerr);
135
+ set_level(log_level::warning);
136
+ } catch(facter::logging::locale_error const& e) {
137
+ logging_init_failed = true;
138
+ logging_init_error_msg = e.what();
139
+ }
140
+
141
+ // Initialize ruby
142
+ api* ruby = nullptr;
143
+ try {
144
+ ruby = &api::instance();
145
+ } catch (runtime_error& ex) {
146
+ if (!logging_init_failed) {
147
+ LOG_WARNING("{1}: facts requiring Ruby will not be resolved.", ex.what());
148
+ } else {
149
+ // This could only happen if some non-ruby library
150
+ // consumer called this function for some reason and
151
+ // we didn't have a libruby loaded. AND the locales
152
+ // are messed up so badly that even resetting locale
153
+ // environment variables fails. This seems so
154
+ // astronomically unlikely that I don't really think
155
+ // it's worth figuring out what we should do in this
156
+ // case - I'm honestly not even sure there's a correct
157
+ // behavior at this point.
158
+ // -- Branan
159
+ }
160
+ return;
161
+ }
162
+
163
+ ruby->initialize();
164
+
165
+ // If logging init failed, we'll raise a load error
166
+ // here. Otherwise we Create the context
167
+ if (logging_init_failed) {
168
+ ruby->rb_raise(*ruby->rb_eLoadError, _("could not initialize facter due to a locale error: {1}", logging_init_error_msg).c_str());
169
+ } else {
170
+ facter::ruby::require_context::create();
171
+ }
172
+ }
173
+ }
174
+
175
+ namespace facter { namespace ruby {
176
+
177
+ static string canonicalize(string p)
178
+ {
179
+ // Get the canonical/absolute directory name
180
+ // If it can be resolved, use canonical to avoid duplicate search paths.
181
+ // Fall back to absolute because canonical on Windows won't recognize paths as valid if
182
+ // they resolve to symlinks to non-NTFS volumes.
183
+ boost::system::error_code ec;
184
+ auto directory = canonical(p, ec);
185
+ if (ec) {
186
+ return absolute(p).string();
187
+ }
188
+ return directory.string();
189
+ }
190
+
191
+ map<VALUE, module*> module::_instances;
192
+
193
+ module::module(collection& facts, vector<string> const& paths, bool logging_hooks) :
194
+ _collection(facts),
195
+ _loaded_all(false)
196
+ {
197
+ auto const& ruby = api::instance();
198
+ if (!ruby.initialized()) {
199
+ throw runtime_error(_("Ruby API is not initialized.").c_str());
200
+ }
201
+
202
+ // Load global settigs from config file
203
+ load_global_settings(load_default_config_file(), _config_file_settings);
204
+
205
+ initialize_search_paths(paths);
206
+
207
+ // Register the block for logging callback with the GC
208
+ _on_message_block = ruby.nil_value();
209
+ ruby.rb_gc_register_address(&_on_message_block);
210
+
211
+ // Install a logging message handler
212
+ on_message([this](log_level level, string const& message) {
213
+ auto const& ruby = api::instance();
214
+
215
+ if (ruby.is_nil(_on_message_block)) {
216
+ return true;
217
+ }
218
+
219
+ // Call the block and don't log messages
220
+ ruby.rescue([&]() {
221
+ ruby.rb_funcall(_on_message_block, ruby.rb_intern("call"), 2, level_to_symbol(level), ruby.utf8_value(message));
222
+ return ruby.nil_value();
223
+ }, [&](VALUE) {
224
+ // Logging can take place from locations where we do not expect Ruby exceptions to be raised
225
+ // Therefore, intentionally swallow any exceptions.
226
+ return ruby.nil_value();
227
+ });
228
+ return false;
229
+ });
230
+
231
+ // Define the Facter module
232
+ _self = ruby.rb_define_module("Facter");
233
+ _instances[_self] = this;
234
+
235
+ VALUE core = ruby.rb_define_module_under(_self, "Core");
236
+ VALUE execution = ruby.rb_define_module_under(core, "Execution");
237
+ ruby.rb_define_module_under(_self, "Util");
238
+
239
+ // Define the methods on the Facter module
240
+ volatile VALUE version = ruby.utf8_value(LIBFACTER_VERSION);
241
+ ruby.rb_const_set(_self, ruby.rb_intern("FACTERVERSION"), version);
242
+ ruby.rb_define_singleton_method(_self, "version", RUBY_METHOD_FUNC(ruby_version), 0);
243
+ ruby.rb_define_singleton_method(_self, "add", RUBY_METHOD_FUNC(ruby_add), -1);
244
+ ruby.rb_define_singleton_method(_self, "define_fact", RUBY_METHOD_FUNC(ruby_define_fact), -1);
245
+ ruby.rb_define_singleton_method(_self, "value", RUBY_METHOD_FUNC(ruby_value), 1);
246
+ ruby.rb_define_singleton_method(_self, "[]", RUBY_METHOD_FUNC(ruby_fact), 1);
247
+ ruby.rb_define_singleton_method(_self, "fact", RUBY_METHOD_FUNC(ruby_fact), 1);
248
+ ruby.rb_define_singleton_method(_self, "debug", RUBY_METHOD_FUNC(ruby_debug), 1);
249
+ ruby.rb_define_singleton_method(_self, "debugonce", RUBY_METHOD_FUNC(ruby_debugonce), 1);
250
+ ruby.rb_define_singleton_method(_self, "warn", RUBY_METHOD_FUNC(ruby_warn), 1);
251
+ ruby.rb_define_singleton_method(_self, "warnonce", RUBY_METHOD_FUNC(ruby_warnonce), 1);
252
+ ruby.rb_define_singleton_method(_self, "log_exception", RUBY_METHOD_FUNC(ruby_log_exception), -1);
253
+ ruby.rb_define_singleton_method(_self, "debugging?", RUBY_METHOD_FUNC(ruby_get_debugging), 0);
254
+ ruby.rb_define_singleton_method(_self, "trace?", RUBY_METHOD_FUNC(ruby_get_trace), 0);
255
+ ruby.rb_define_singleton_method(_self, "flush", RUBY_METHOD_FUNC(ruby_flush), 0);
256
+ ruby.rb_define_singleton_method(_self, "list", RUBY_METHOD_FUNC(ruby_list), 0);
257
+ ruby.rb_define_singleton_method(_self, "to_hash", RUBY_METHOD_FUNC(ruby_to_hash), 0);
258
+ ruby.rb_define_singleton_method(_self, "each", RUBY_METHOD_FUNC(ruby_each), 0);
259
+ ruby.rb_define_singleton_method(_self, "clear", RUBY_METHOD_FUNC(ruby_clear), 0);
260
+ ruby.rb_define_singleton_method(_self, "reset", RUBY_METHOD_FUNC(ruby_reset), 0);
261
+ ruby.rb_define_singleton_method(_self, "loadfacts", RUBY_METHOD_FUNC(ruby_loadfacts), 0);
262
+ ruby.rb_define_singleton_method(_self, "search", RUBY_METHOD_FUNC(ruby_search), -1);
263
+ ruby.rb_define_singleton_method(_self, "search_path", RUBY_METHOD_FUNC(ruby_search_path), 0);
264
+ ruby.rb_define_singleton_method(_self, "search_external", RUBY_METHOD_FUNC(ruby_search_external), 1);
265
+ ruby.rb_define_singleton_method(_self, "search_external_path", RUBY_METHOD_FUNC(ruby_search_external_path), 0);
266
+
267
+ // Only define these if requested to do so
268
+ // This prevents consumers of Facter from altering the logging behavior
269
+ if (logging_hooks) {
270
+ ruby.rb_define_singleton_method(_self, "debugging", RUBY_METHOD_FUNC(ruby_set_debugging), 1);
271
+ ruby.rb_define_singleton_method(_self, "trace", RUBY_METHOD_FUNC(ruby_set_trace), 1);
272
+ ruby.rb_define_singleton_method(_self, "on_message", RUBY_METHOD_FUNC(ruby_on_message), 0);
273
+ }
274
+
275
+ // Define the execution module
276
+ ruby.rb_define_singleton_method(execution, "which", RUBY_METHOD_FUNC(ruby_which), 1);
277
+ ruby.rb_define_singleton_method(execution, "exec", RUBY_METHOD_FUNC(ruby_exec), 1);
278
+ ruby.rb_define_singleton_method(execution, "execute", RUBY_METHOD_FUNC(ruby_execute), -1);
279
+ ruby.rb_define_class_under(execution, "ExecutionFailure", *ruby.rb_eStandardError);
280
+
281
+ // Define the Fact and resolution classes
282
+ fact::define();
283
+ simple_resolution::define();
284
+ aggregate_resolution::define();
285
+
286
+ // Custom facts may `require 'facter'`
287
+ // To allow those custom facts to still function, add facter.rb to loaded features using the first directory in the load path
288
+ // Note: use forward slashes in the path even on Windows because that's what Ruby expects in $LOADED_FEATURES
289
+ volatile VALUE first = ruby.rb_ary_entry(ruby.rb_gv_get("$LOAD_PATH"), 0);
290
+ if (!ruby.is_nil(first)) {
291
+ ruby.rb_ary_push(ruby.rb_gv_get("$LOADED_FEATURES"), ruby.utf8_value(ruby.to_string(first) + "/facter.rb"));
292
+ }
293
+ }
294
+
295
+ module::~module()
296
+ {
297
+ _instances.erase(_self);
298
+
299
+ clear_facts(false);
300
+
301
+ try {
302
+ api& ruby = api::instance();
303
+
304
+ // Unregister the on message block
305
+ ruby.rb_gc_unregister_address(&_on_message_block);
306
+ on_message(nullptr);
307
+
308
+ // Undefine the module
309
+ ruby.rb_const_remove(*ruby.rb_cObject, ruby.rb_intern("Facter"));
310
+ } catch (runtime_error& ex) {
311
+ LOG_WARNING("{1}: Ruby cleanup ended prematurely", ex.what());
312
+ return;
313
+ }
314
+ }
315
+
316
+ void module::search(vector<string> const& paths)
317
+ {
318
+ for (auto dir : paths) {
319
+ _additional_search_paths.emplace_back(dir);
320
+ _search_paths.emplace_back(canonicalize(_additional_search_paths.back()));
321
+ }
322
+ }
323
+
324
+ void module::load_facts()
325
+ {
326
+ if (_loaded_all) {
327
+ return;
328
+ }
329
+
330
+ LOG_DEBUG("loading all custom facts.");
331
+
332
+ LOG_DEBUG("loading custom fact directories from config file");
333
+ if (_config_file_settings.count("custom-dir")) {
334
+ auto config_paths = _config_file_settings["custom-dir"].as<vector<string>>();
335
+ _search_paths.insert(_search_paths.end(), config_paths.begin(), config_paths.end());
336
+ }
337
+
338
+ for (auto const& directory : _search_paths) {
339
+ LOG_DEBUG("searching for custom facts in {1}.", directory);
340
+ each_file(directory, [&](string const& file) {
341
+ load_file(file);
342
+ return true;
343
+ }, "\\.rb$");
344
+ }
345
+
346
+ _loaded_all = true;
347
+ }
348
+
349
+ void module::resolve_facts()
350
+ {
351
+ // Before we do anything, call facts to ensure the collection is populated
352
+ facts();
353
+
354
+ load_facts();
355
+
356
+ auto const& ruby = api::instance();
357
+
358
+ // Get the value from all facts
359
+ for (auto const& kvp : _facts) {
360
+ ruby.to_native<fact>(kvp.second)->value();
361
+ }
362
+ }
363
+
364
+ void module::clear_facts(bool clear_collection)
365
+ {
366
+ auto const& ruby = api::instance();
367
+
368
+ // Unregister all the facts
369
+ for (auto& kvp : _facts) {
370
+ ruby.rb_gc_unregister_address(&kvp.second);
371
+ }
372
+
373
+ // Clear the custom facts
374
+ _facts.clear();
375
+
376
+ // Clear the collection
377
+ if (clear_collection) {
378
+ _collection.clear();
379
+ }
380
+ }
381
+
382
+ VALUE module::fact_value(VALUE name)
383
+ {
384
+ auto const& ruby = api::instance();
385
+
386
+ VALUE fact_self = load_fact(name);
387
+ if (ruby.is_nil(fact_self)) {
388
+ return ruby.nil_value();
389
+ }
390
+
391
+ return ruby.to_native<fact>(fact_self)->value();
392
+ }
393
+
394
+ VALUE module::to_ruby(value const* val) const
395
+ {
396
+ auto const& ruby = api::instance();
397
+
398
+ if (!val) {
399
+ return ruby.nil_value();
400
+ }
401
+ if (auto ptr = dynamic_cast<facter::ruby::ruby_value const*>(val)) {
402
+ return ptr->value();
403
+ }
404
+ if (auto ptr = dynamic_cast<string_value const*>(val)) {
405
+ return ruby.utf8_value(ptr->value());
406
+ }
407
+ if (auto ptr = dynamic_cast<integer_value const*>(val)) {
408
+ return ruby.rb_ll2inum(static_cast<LONG_LONG>(ptr->value()));
409
+ }
410
+ if (auto ptr = dynamic_cast<boolean_value const*>(val)) {
411
+ return ptr->value() ? ruby.true_value() : ruby.false_value();
412
+ }
413
+ if (auto ptr = dynamic_cast<double_value const*>(val)) {
414
+ return ruby.rb_float_new_in_heap(ptr->value());
415
+ }
416
+ if (auto ptr = dynamic_cast<array_value const*>(val)) {
417
+ volatile VALUE array = ruby.rb_ary_new_capa(static_cast<long>(ptr->size()));
418
+ ptr->each([&](value const* element) {
419
+ ruby.rb_ary_push(array, to_ruby(element));
420
+ return true;
421
+ });
422
+ return array;
423
+ }
424
+ if (auto ptr = dynamic_cast<map_value const*>(val)) {
425
+ volatile VALUE hash = ruby.rb_hash_new();
426
+ ptr->each([&](string const& name, value const* element) {
427
+ ruby.rb_hash_aset(hash, ruby.utf8_value(name), to_ruby(element));
428
+ return true;
429
+ });
430
+ return hash;
431
+ }
432
+ return ruby.nil_value();
433
+ }
434
+
435
+ VALUE module::normalize(VALUE name) const
436
+ {
437
+ auto const& ruby = api::instance();
438
+
439
+ if (ruby.is_symbol(name)) {
440
+ name = ruby.rb_sym_to_s(name);
441
+ }
442
+ if (ruby.is_string(name)) {
443
+ name = ruby.rb_funcall(name, ruby.rb_intern("downcase"), 0);
444
+ }
445
+ return name;
446
+ }
447
+
448
+ collection& module::facts()
449
+ {
450
+ if (_collection.empty()) {
451
+ bool include_ruby_facts = true;
452
+ _collection.add_default_facts(include_ruby_facts);
453
+ _collection.add_external_facts(_external_search_paths);
454
+
455
+ auto const& ruby = api::instance();
456
+ _collection.add_environment_facts([&](string const& name) {
457
+ // Create a fact and explicitly set the value
458
+ // We honor environment variables above custom fact resolutions
459
+ ruby.to_native<fact>(create_fact(ruby.utf8_value(name)))->value(to_ruby(_collection[name]));
460
+ });
461
+ }
462
+ return _collection;
463
+ }
464
+
465
+ VALUE module::self() const
466
+ {
467
+ return _self;
468
+ }
469
+
470
+ module* module::current()
471
+ {
472
+ auto const& ruby = api::instance();
473
+ return from_self(ruby.lookup({"Facter"}));
474
+ }
475
+
476
+ static VALUE safe_eval(char const* scope, function<VALUE()> body)
477
+ {
478
+ try {
479
+ return body();
480
+ } catch (exception const& e) {
481
+ LOG_ERROR("{1} uncaught exception: {2}", scope, e.what());
482
+ }
483
+ return api::instance().nil_value();
484
+ }
485
+
486
+ VALUE module::ruby_version(VALUE self)
487
+ {
488
+ return safe_eval("Facter.version", [&]() {
489
+ auto const& ruby = api::instance();
490
+ return ruby.lookup({ "Facter", "FACTERVERSION" });
491
+ });
492
+ }
493
+
494
+ VALUE module::ruby_add(int argc, VALUE* argv, VALUE self)
495
+ {
496
+ return safe_eval("Facter.add", [&]() {
497
+ auto const& ruby = api::instance();
498
+
499
+ if (argc == 0 || argc > 2) {
500
+ ruby.rb_raise(*ruby.rb_eArgError, _("wrong number of arguments ({1} for 2)", argc).c_str());
501
+ }
502
+
503
+ VALUE fact_self = from_self(self)->create_fact(argv[0]);
504
+
505
+ // Read the resolution name from the options hash, if present
506
+ volatile VALUE name = ruby.nil_value();
507
+ VALUE options = argc == 2 ? argv[1] : ruby.nil_value();
508
+ if (!ruby.is_nil(options)) {
509
+ name = ruby.rb_funcall(options, ruby.rb_intern("delete"), 1, ruby.to_symbol("name"));
510
+ }
511
+
512
+ ruby.to_native<fact>(fact_self)->define_resolution(name, options);
513
+ return fact_self;
514
+ });
515
+ }
516
+
517
+ VALUE module::ruby_define_fact(int argc, VALUE* argv, VALUE self)
518
+ {
519
+ return safe_eval("Facter.define_fact", [&]() {
520
+ auto const& ruby = api::instance();
521
+
522
+ if (argc == 0 || argc > 2) {
523
+ ruby.rb_raise(*ruby.rb_eArgError, _("wrong number of arguments ({1} for 2)", argc).c_str());
524
+ }
525
+
526
+ VALUE fact_self = from_self(self)->create_fact(argv[0]);
527
+
528
+ // Call the block if one was given
529
+ if (ruby.rb_block_given_p()) {
530
+ ruby.rb_funcall_passing_block(fact_self, ruby.rb_intern("instance_eval"), 0, nullptr);
531
+ }
532
+ return fact_self;
533
+ });
534
+ }
535
+
536
+ VALUE module::ruby_value(VALUE self, VALUE name)
537
+ {
538
+ return safe_eval("Facter.value", [&]() {
539
+ return from_self(self)->fact_value(name);
540
+ });
541
+ }
542
+
543
+ VALUE module::ruby_fact(VALUE self, VALUE name)
544
+ {
545
+ return safe_eval("Facter.fact", [&]() {
546
+ return from_self(self)->load_fact(name);
547
+ });
548
+ }
549
+
550
+ VALUE module::ruby_debug(VALUE self, VALUE message)
551
+ {
552
+ return safe_eval("Facter.debug", [&]() {
553
+ auto const& ruby = api::instance();
554
+ LOG_DEBUG(ruby.to_string(message));
555
+ return ruby.nil_value();
556
+ });
557
+ }
558
+
559
+ VALUE module::ruby_debugonce(VALUE self, VALUE message)
560
+ {
561
+ return safe_eval("Facter.debugonce", [&]() {
562
+ auto const& ruby = api::instance();
563
+
564
+ string msg = ruby.to_string(message);
565
+ if (from_self(self)->_debug_messages.insert(msg).second) {
566
+ LOG_DEBUG(msg);
567
+ }
568
+ return ruby.nil_value();
569
+ });
570
+ }
571
+
572
+ VALUE module::ruby_warn(VALUE self, VALUE message)
573
+ {
574
+ return safe_eval("Facter.warn", [&]() {
575
+ auto const& ruby = api::instance();
576
+ LOG_WARNING(ruby.to_string(message));
577
+ return ruby.nil_value();
578
+ });
579
+ }
580
+
581
+ VALUE module::ruby_warnonce(VALUE self, VALUE message)
582
+ {
583
+ return safe_eval("Facter.warnonce", [&]() {
584
+ auto const& ruby = api::instance();
585
+
586
+ string msg = ruby.to_string(message);
587
+ if (from_self(self)->_warning_messages.insert(msg).second) {
588
+ LOG_WARNING(msg);
589
+ }
590
+ return ruby.nil_value();
591
+ });
592
+ }
593
+
594
+ VALUE module::ruby_set_debugging(VALUE self, VALUE value)
595
+ {
596
+ return safe_eval("Facter.debugging", [&]() {
597
+ auto const& ruby = api::instance();
598
+
599
+ if (ruby.is_true(value)) {
600
+ set_level(log_level::debug);
601
+ } else {
602
+ set_level(log_level::warning);
603
+ }
604
+ return ruby_get_debugging(self);
605
+ });
606
+ }
607
+
608
+ VALUE module::ruby_get_debugging(VALUE self)
609
+ {
610
+ return safe_eval("Facter.debugging?", [&]() {
611
+ auto const& ruby = api::instance();
612
+ return is_enabled(log_level::debug) ? ruby.true_value() : ruby.false_value();
613
+ });
614
+ }
615
+
616
+ VALUE module::ruby_set_trace(VALUE self, VALUE value)
617
+ {
618
+ return safe_eval("Facter.trace", [&]() {
619
+ auto& ruby = api::instance();
620
+ ruby.include_stack_trace(ruby.is_true(value));
621
+ return ruby_get_trace(self);
622
+ });
623
+ }
624
+
625
+ VALUE module::ruby_get_trace(VALUE self)
626
+ {
627
+ return safe_eval("Facter.trace?", [&]() {
628
+ auto const& ruby = api::instance();
629
+ return ruby.include_stack_trace() ? ruby.true_value() : ruby.false_value();
630
+ });
631
+ }
632
+
633
+ VALUE module::ruby_log_exception(int argc, VALUE* argv, VALUE self)
634
+ {
635
+ return safe_eval("Facter.log_exception", [&]() {
636
+ auto const& ruby = api::instance();
637
+
638
+ if (argc == 0 || argc > 2) {
639
+ ruby.rb_raise(*ruby.rb_eArgError, _("wrong number of arguments ({1} for 2)", argc).c_str());
640
+ }
641
+
642
+ string message;
643
+ if (argc == 2) {
644
+ // Use the given argument provided it is not a symbol equal to :default
645
+ if (!ruby.is_symbol(argv[1]) || ruby.rb_to_id(argv[1]) != ruby.rb_intern("default")) {
646
+ message = ruby.to_string(argv[1]);
647
+ }
648
+ }
649
+
650
+ LOG_ERROR(ruby.exception_to_string(argv[0], message));
651
+ return ruby.nil_value();
652
+ });
653
+ }
654
+
655
+ VALUE module::ruby_flush(VALUE self)
656
+ {
657
+ return safe_eval("Facter.flush", [&]() {
658
+ auto const& ruby = api::instance();
659
+
660
+ for (auto& kvp : from_self(self)->_facts)
661
+ {
662
+ ruby.to_native<fact>(kvp.second)->flush();
663
+ }
664
+ return ruby.nil_value();
665
+ });
666
+ }
667
+
668
+ VALUE module::ruby_list(VALUE self)
669
+ {
670
+ return safe_eval("Facter.list", [&]() {
671
+ auto const& ruby = api::instance();
672
+ module* instance = from_self(self);
673
+
674
+ instance->resolve_facts();
675
+
676
+ volatile VALUE array = ruby.rb_ary_new_capa(instance->facts().size());
677
+
678
+ instance->facts().each([&](string const& name, value const*) {
679
+ ruby.rb_ary_push(array, ruby.utf8_value(name));
680
+ return true;
681
+ });
682
+
683
+ return array;
684
+ });
685
+ }
686
+
687
+ VALUE module::ruby_to_hash(VALUE self)
688
+ {
689
+ return safe_eval("Facter.to_hash", [&]() {
690
+ auto const& ruby = api::instance();
691
+ module* instance = from_self(self);
692
+
693
+ instance->resolve_facts();
694
+
695
+ volatile VALUE hash = ruby.rb_hash_new();
696
+
697
+ instance->facts().each([&](string const& name, value const* val) {
698
+ ruby.rb_hash_aset(hash, ruby.utf8_value(name), instance->to_ruby(val));
699
+ return true;
700
+ });
701
+
702
+ return hash;
703
+ });
704
+ }
705
+
706
+ VALUE module::ruby_each(VALUE self)
707
+ {
708
+ return safe_eval("Facter.each", [&]() {
709
+ auto const& ruby = api::instance();
710
+ module* instance = from_self(self);
711
+
712
+ instance->resolve_facts();
713
+
714
+ instance->facts().each([&](string const& name, value const* val) {
715
+ ruby.rb_yield_values(2, ruby.utf8_value(name), instance->to_ruby(val));
716
+ return true;
717
+ });
718
+
719
+ return self;
720
+ });
721
+ }
722
+
723
+ VALUE module::ruby_clear(VALUE self)
724
+ {
725
+ return safe_eval("Facter.clear", [&]() {
726
+ auto const& ruby = api::instance();
727
+
728
+ ruby_flush(self);
729
+ ruby_reset(self);
730
+
731
+ return ruby.nil_value();
732
+ });
733
+ }
734
+
735
+ VALUE module::ruby_reset(VALUE self)
736
+ {
737
+ return safe_eval("Facter.reset", [&]() {
738
+ auto const& ruby = api::instance();
739
+ module* instance = from_self(self);
740
+
741
+ instance->clear_facts();
742
+ instance->initialize_search_paths({});
743
+ instance->_external_search_paths.clear();
744
+ instance->_loaded_all = false;
745
+ instance->_loaded_files.clear();
746
+
747
+ return ruby.nil_value();
748
+ });
749
+ }
750
+
751
+ VALUE module::ruby_loadfacts(VALUE self)
752
+ {
753
+ return safe_eval("Facter.loadfacts", [&]() {
754
+ auto const& ruby = api::instance();
755
+
756
+ from_self(self)->load_facts();
757
+ return ruby.nil_value();
758
+ });
759
+ }
760
+
761
+ VALUE module::ruby_search(int argc, VALUE* argv, VALUE self)
762
+ {
763
+ return safe_eval("Facter.search", [&]() {
764
+ auto const& ruby = api::instance();
765
+ module* instance = from_self(self);
766
+
767
+ for (int i = 0; i < argc; ++i) {
768
+ if (!ruby.is_string(argv[i])) {
769
+ continue;
770
+ }
771
+
772
+ instance->_additional_search_paths.emplace_back(ruby.to_string(argv[i]));
773
+ instance->_search_paths.emplace_back(canonicalize(instance->_additional_search_paths.back()));
774
+ }
775
+ return ruby.nil_value();
776
+ });
777
+ }
778
+
779
+ VALUE module::ruby_search_path(VALUE self)
780
+ {
781
+ return safe_eval("Facter.search_path", [&]() {
782
+ auto const& ruby = api::instance();
783
+ module* instance = from_self(self);
784
+
785
+ volatile VALUE array = ruby.rb_ary_new_capa(instance->_additional_search_paths.size());
786
+
787
+ for (auto const& path : instance->_additional_search_paths) {
788
+ ruby.rb_ary_push(array, ruby.utf8_value(path));
789
+ }
790
+ return array;
791
+ });
792
+ }
793
+
794
+ VALUE module::ruby_search_external(VALUE self, VALUE paths)
795
+ {
796
+ return safe_eval("Facter.search_external", [&]() {
797
+ auto const& ruby = api::instance();
798
+ module* instance = from_self(self);
799
+
800
+ ruby.array_for_each(paths, [&](VALUE element) {
801
+ if (!ruby.is_string(element)) {
802
+ return true;
803
+ }
804
+ instance->_external_search_paths.emplace_back(ruby.to_string(element));
805
+ return true;
806
+ });
807
+
808
+ // Add external path from config file
809
+ LOG_DEBUG(_("loading external fact directories from config file"));
810
+ if (instance->_config_file_settings.count("external-dir")) {
811
+ auto config_paths = instance->_config_file_settings["external-dir"].as<vector<string>>();
812
+ instance->_external_search_paths.insert(instance->_external_search_paths.end(), config_paths.begin(), config_paths.end());
813
+ }
814
+ return ruby.nil_value();
815
+ });
816
+ }
817
+
818
+ VALUE module::ruby_search_external_path(VALUE self)
819
+ {
820
+ return safe_eval("Facter.search_external_path", [&]() {
821
+ auto const& ruby = api::instance();
822
+ module* instance = from_self(self);
823
+
824
+ volatile VALUE array = ruby.rb_ary_new_capa(instance->_external_search_paths.size());
825
+
826
+ for (auto const& path : instance->_external_search_paths) {
827
+ ruby.rb_ary_push(array, ruby.utf8_value(path));
828
+ }
829
+ return array;
830
+ });
831
+ }
832
+
833
+ VALUE module::ruby_which(VALUE self, VALUE binary)
834
+ {
835
+ return safe_eval("Facter::Core::Execution::which", [&]() {
836
+ // Note: self is Facter::Core::Execution
837
+ auto const& ruby = api::instance();
838
+
839
+ string path = which(ruby.to_string(binary));
840
+ if (path.empty()) {
841
+ return ruby.nil_value();
842
+ }
843
+
844
+ return ruby.utf8_value(path);
845
+ });
846
+ }
847
+
848
+ VALUE module::ruby_exec(VALUE self, VALUE command)
849
+ {
850
+ return safe_eval("Facter::Core::Execution::exec", [&]() {
851
+ // Note: self is Facter::Core::Execution
852
+ auto const& ruby = api::instance();
853
+ return execute_command(ruby.to_string(command), ruby.nil_value(), false);
854
+ });
855
+ }
856
+
857
+ VALUE module::ruby_execute(int argc, VALUE* argv, VALUE self)
858
+ {
859
+ return safe_eval("Facter::Core::Execution::execute", [&]() {
860
+ // Note: self is Facter::Core::Execution
861
+ auto const& ruby = api::instance();
862
+
863
+ if (argc == 0 || argc > 2) {
864
+ ruby.rb_raise(*ruby.rb_eArgError, _("wrong number of arguments ({1} for 2)", argc).c_str());
865
+ }
866
+
867
+ if (argc == 1) {
868
+ return execute_command(ruby.to_string(argv[0]), ruby.nil_value(), true);
869
+ }
870
+
871
+ // Unfortunately we have to call to_sym rather than using ID2SYM, which is Ruby version dependent
872
+ uint32_t timeout = 0;
873
+ volatile VALUE timeout_option = ruby.rb_hash_lookup(argv[1], ruby.to_symbol("timeout"));
874
+ if (ruby.is_integer(timeout_option)) {
875
+ timeout = ruby.num2size_t(timeout_option);
876
+ }
877
+
878
+ // Get the on_fail option (defaults to :raise)
879
+ bool raise = false;
880
+ volatile VALUE raise_value = ruby.to_symbol("raise");
881
+ volatile VALUE fail_option = ruby.rb_hash_lookup2(argv[1], ruby.to_symbol("on_fail"), raise_value);
882
+ if (ruby.equals(fail_option, raise_value)) {
883
+ raise = true;
884
+ fail_option = ruby.nil_value();
885
+ }
886
+ return execute_command(ruby.to_string(argv[0]), fail_option, raise, timeout);
887
+ });
888
+ }
889
+
890
+ VALUE module::ruby_on_message(VALUE self)
891
+ {
892
+ return safe_eval("Facter.on_message", [&]() {
893
+ auto const& ruby = api::instance();
894
+
895
+ from_self(self)->_on_message_block = ruby.rb_block_given_p() ? ruby.rb_block_proc() : ruby.nil_value();
896
+ return ruby.nil_value();
897
+ });
898
+ }
899
+
900
+ module* module::from_self(VALUE self)
901
+ {
902
+ auto it = _instances.find(self);
903
+ if (it == _instances.end()) {
904
+ auto const& ruby = api::instance();
905
+ ruby.rb_raise(*ruby.rb_eArgError, _("unexpected self value {1}", self).c_str());
906
+ return nullptr;
907
+ }
908
+ return it->second;
909
+ }
910
+
911
+ VALUE module::execute_command(std::string const& command, VALUE failure_default, bool raise, uint32_t timeout)
912
+ {
913
+ auto const& ruby = api::instance();
914
+
915
+ // Expand the command
916
+ auto expanded = expand_command(command);
917
+
918
+ if (!expanded.empty()) {
919
+ try {
920
+ auto exec = execute(
921
+ command_shell,
922
+ {
923
+ command_args,
924
+ expanded
925
+ },
926
+ timeout,
927
+ {
928
+ execution_options::trim_output,
929
+ execution_options::merge_environment,
930
+ execution_options::redirect_stderr_to_null,
931
+ execution_options::preserve_arguments
932
+ });
933
+ // Ruby can encode some additional information in the
934
+ // lower 8 bits. None of those set means "process exited normally"
935
+ ruby.rb_last_status_set(exec.exit_code << 8, static_cast<rb_pid_t>(exec.pid));
936
+ return ruby.utf8_value(exec.output);
937
+ } catch (timeout_exception const& ex) {
938
+ // Always raise for timeouts
939
+ ruby.rb_raise(ruby.lookup({ "Facter", "Core", "Execution", "ExecutionFailure"}), ex.what());
940
+ }
941
+ }
942
+ // Command was not found
943
+ if (raise) {
944
+ if (expanded.empty()) {
945
+ ruby.rb_raise(ruby.lookup({ "Facter", "Core", "Execution", "ExecutionFailure"}), _("execution of command \"{1}\" failed: command not found.", command).c_str());
946
+ }
947
+ ruby.rb_raise(ruby.lookup({ "Facter", "Core", "Execution", "ExecutionFailure"}), _("execution of command \"{1}\" failed.", command).c_str());
948
+ }
949
+ return failure_default;
950
+ }
951
+
952
+ void module::initialize_search_paths(vector<string> const& paths)
953
+ {
954
+ auto const& ruby = api::instance();
955
+
956
+ _search_paths.clear();
957
+ _additional_search_paths.clear();
958
+
959
+ // Look for "facter" subdirectories on the load path
960
+ for (auto const& directory : ruby.get_load_path()) {
961
+ boost::system::error_code ec;
962
+ // Use forward-slash to keep this consistent with Ruby conventions.
963
+ auto dir = canonicalize(directory) + "/facter";
964
+
965
+ // Ignore facter itself if it's on the load path
966
+ if (is_regular_file(dir, ec)) {
967
+ continue;
968
+ }
969
+
970
+ if (!is_directory(dir, ec)) {
971
+ continue;
972
+ }
973
+ _search_paths.push_back(dir);
974
+ }
975
+
976
+ // Append the FACTERLIB paths
977
+ string variable;
978
+ if (environment::get("FACTERLIB", variable)) {
979
+ vector<string> env_paths;
980
+ boost::split(env_paths, variable, bind(equal_to<char>(), placeholders::_1, environment::get_path_separator()), boost::token_compress_on);
981
+ _search_paths.insert(_search_paths.end(), make_move_iterator(env_paths.begin()), make_move_iterator(env_paths.end()));
982
+ }
983
+
984
+ // Insert the given paths last
985
+ _search_paths.insert(_search_paths.end(), paths.begin(), paths.end());
986
+
987
+ // Do a canonical/absolute transform
988
+ transform(_search_paths.begin(), _search_paths.end(), _search_paths.begin(), [](string const& directory) -> string {
989
+ return canonicalize(directory);
990
+ });
991
+
992
+ // Remove anything that is empty using the erase-remove idiom.
993
+ _search_paths.erase(
994
+ remove_if(begin(_search_paths), end(_search_paths), [](string const& path) { return path.empty(); }),
995
+ end(_search_paths));
996
+ }
997
+
998
+ VALUE module::load_fact(VALUE name)
999
+ {
1000
+ auto const& ruby = api::instance();
1001
+
1002
+ name = normalize(name);
1003
+ string fact_name = ruby.to_string(name);
1004
+
1005
+ // First check to see if we have that fact already
1006
+ auto it = _facts.find(fact_name);
1007
+ if (it != _facts.end()) {
1008
+ return it->second;
1009
+ }
1010
+
1011
+ // Try to load it by file name
1012
+ if (!_loaded_all) {
1013
+ // Next, attempt to load it by file
1014
+ string filename = fact_name + ".rb";
1015
+ LOG_DEBUG("searching for custom fact \"{1}\".", fact_name);
1016
+
1017
+ for (auto const& directory : _search_paths) {
1018
+ LOG_DEBUG("searching for {1} in {2}.", filename, directory);
1019
+
1020
+ // Check to see if there's a file of a matching name in this directory
1021
+ path full_path = path(directory) / filename;
1022
+ boost::system::error_code ec;
1023
+ if (!is_regular_file(full_path, ec)) {
1024
+ continue;
1025
+ }
1026
+
1027
+ // Load the fact file
1028
+ load_file(full_path.string());
1029
+ }
1030
+
1031
+ // Check to see if we now have the fact
1032
+ it = _facts.find(fact_name);
1033
+ if (it != _facts.end()) {
1034
+ return it->second;
1035
+ }
1036
+ }
1037
+
1038
+ // Otherwise, check to see if it's already in the collection
1039
+ auto value = facts()[fact_name];
1040
+ if (value) {
1041
+ return create_fact(name);
1042
+ }
1043
+
1044
+ // Couldn't load the fact by file name, load all facts to try to find it
1045
+ load_facts();
1046
+
1047
+ // Check to see if we now have the fact
1048
+ it = _facts.find(fact_name);
1049
+ if (it != _facts.end()) {
1050
+ return it->second;
1051
+ }
1052
+
1053
+ // Couldn't find the fact
1054
+ LOG_DEBUG("custom fact \"{1}\" was not found.", fact_name);
1055
+ return ruby.nil_value();
1056
+ }
1057
+
1058
+ void module::load_file(std::string const& path)
1059
+ {
1060
+ // Only load the file if we haven't done so before
1061
+ if (!_loaded_files.insert(path).second) {
1062
+ return;
1063
+ }
1064
+
1065
+ auto const& ruby = api::instance();
1066
+
1067
+ LOG_INFO("loading custom facts from {1}.", path);
1068
+ ruby.rescue([&]() {
1069
+ // Do not construct C++ objects in a rescue callback
1070
+ // C++ stack unwinding will not take place if a Ruby exception is thrown!
1071
+ ruby.rb_load(ruby.utf8_value(path), 0);
1072
+ return 0;
1073
+ }, [&](VALUE ex) {
1074
+ LOG_ERROR("error while resolving custom facts in {1}: {2}", path, ruby.exception_to_string(ex));
1075
+ return 0;
1076
+ });
1077
+ }
1078
+
1079
+ VALUE module::create_fact(VALUE name)
1080
+ {
1081
+ auto const& ruby = api::instance();
1082
+
1083
+ if (!ruby.is_string(name) && !ruby.is_symbol(name)) {
1084
+ ruby.rb_raise(*ruby.rb_eTypeError, _("expected a String or Symbol for fact name").c_str());
1085
+ }
1086
+
1087
+ name = normalize(name);
1088
+ string fact_name = ruby.to_string(name);
1089
+
1090
+ // First check to see if we have that fact already
1091
+ auto it = _facts.find(fact_name);
1092
+ if (it == _facts.end()) {
1093
+ // Before adding the first fact, call facts to ensure the collection is populated
1094
+ facts();
1095
+ // facts() may add entries to _facts, so check again to ensure entry has not already been added (avoid duplicate Ruby GC registration)
1096
+ it = _facts.find(fact_name);
1097
+ if (it == _facts.end()) {
1098
+ it = _facts.insert(make_pair(fact_name, fact::create(name))).first;
1099
+ ruby.rb_gc_register_address(&it->second);
1100
+ }
1101
+ }
1102
+ return it->second;
1103
+ }
1104
+
1105
+ VALUE module::level_to_symbol(log_level level)
1106
+ {
1107
+ auto const& ruby = api::instance();
1108
+
1109
+ char const* name = nullptr;
1110
+
1111
+ if (level == log_level::trace) {
1112
+ name = "trace";
1113
+ } else if (level == log_level::debug) {
1114
+ name = "debug";
1115
+ } else if (level == log_level::info) {
1116
+ name = "info";
1117
+ } else if (level == log_level::warning) {
1118
+ name = "warn";
1119
+ } else if (level == log_level::error) {
1120
+ name = "error";
1121
+ } else if (level == log_level::fatal) {
1122
+ name = "fatal";
1123
+ }
1124
+ if (!name) {
1125
+ ruby.rb_raise(*ruby.rb_eArgError, _("invalid log level specified.").c_str(), 0);
1126
+ }
1127
+ return ruby.to_symbol(name);
1128
+ }
1129
+
1130
+ }} // namespace facter::ruby