facter 4.0.43 → 4.0.49

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 (291) hide show
  1. checksums.yaml +4 -4
  2. data/lib/docs/generate.rb +32 -0
  3. data/lib/docs/template.erb +34 -0
  4. data/lib/facter.rb +65 -9
  5. data/lib/facter/config.rb +385 -0
  6. data/lib/facter/custom_facts/core/aggregate.rb +7 -0
  7. data/lib/facter/custom_facts/core/execution.rb +28 -4
  8. data/lib/facter/custom_facts/core/execution/base.rb +33 -33
  9. data/lib/facter/custom_facts/util/collection.rb +1 -2
  10. data/lib/facter/custom_facts/util/directory_loader.rb +1 -1
  11. data/lib/facter/custom_facts/util/fact.rb +39 -3
  12. data/lib/facter/custom_facts/util/loader.rb +1 -1
  13. data/lib/facter/custom_facts/util/parser.rb +17 -3
  14. data/lib/facter/custom_facts/util/resolution.rb +2 -2
  15. data/lib/facter/facts/aix/disks.rb +1 -1
  16. data/lib/facter/facts/aix/interfaces.rb +1 -0
  17. data/lib/facter/facts/aix/memory/swap/available.rb +1 -1
  18. data/lib/facter/facts/aix/memory/swap/available_bytes.rb +1 -1
  19. data/lib/facter/facts/aix/memory/swap/total.rb +1 -1
  20. data/lib/facter/facts/aix/memory/swap/total_bytes.rb +1 -1
  21. data/lib/facter/facts/aix/memory/swap/used.rb +1 -1
  22. data/lib/facter/facts/aix/memory/system/available.rb +1 -1
  23. data/lib/facter/facts/aix/memory/system/available_bytes.rb +1 -1
  24. data/lib/facter/facts/aix/memory/system/total.rb +1 -1
  25. data/lib/facter/facts/aix/memory/system/total_bytes.rb +1 -1
  26. data/lib/facter/facts/aix/memory/system/used.rb +1 -1
  27. data/lib/facter/facts/aix/processors/speed.rb +1 -1
  28. data/lib/facter/facts/aix/ssh.rb +1 -1
  29. data/lib/facter/facts/aix/sshalgorithmkey.rb +1 -1
  30. data/lib/facter/facts/aix/sshfp_algorithm.rb +1 -1
  31. data/lib/facter/facts/bsd/processors/speed.rb +1 -1
  32. data/lib/facter/facts/freebsd/is_virtual.rb +25 -0
  33. data/lib/facter/facts/freebsd/memory/swap/available.rb +1 -1
  34. data/lib/facter/facts/freebsd/memory/swap/available_bytes.rb +1 -1
  35. data/lib/facter/facts/freebsd/memory/swap/total.rb +1 -1
  36. data/lib/facter/facts/freebsd/memory/swap/total_bytes.rb +1 -1
  37. data/lib/facter/facts/freebsd/memory/swap/used.rb +1 -1
  38. data/lib/facter/facts/freebsd/memory/system/available.rb +1 -1
  39. data/lib/facter/facts/freebsd/memory/system/available_bytes.rb +1 -1
  40. data/lib/facter/facts/freebsd/memory/system/total.rb +1 -1
  41. data/lib/facter/facts/freebsd/memory/system/total_bytes.rb +1 -1
  42. data/lib/facter/facts/freebsd/memory/system/used.rb +1 -1
  43. data/lib/facter/facts/freebsd/processors/speed.rb +1 -1
  44. data/lib/facter/facts/freebsd/ssh.rb +1 -1
  45. data/lib/facter/facts/freebsd/sshalgorithmkey.rb +1 -1
  46. data/lib/facter/facts/freebsd/sshfp_algorithm.rb +1 -1
  47. data/lib/facter/facts/freebsd/virtual.rb +22 -0
  48. data/lib/facter/facts/linux/dhcp_servers.rb +1 -0
  49. data/lib/facter/facts/linux/disks.rb +1 -1
  50. data/lib/facter/facts/linux/ec2_metadata.rb +1 -1
  51. data/lib/facter/facts/linux/ec2_userdata.rb +1 -1
  52. data/lib/facter/facts/linux/hypervisors/kvm.rb +1 -1
  53. data/lib/facter/facts/linux/hypervisors/xen.rb +1 -1
  54. data/lib/facter/facts/linux/interfaces.rb +1 -0
  55. data/lib/facter/facts/linux/is_virtual.rb +2 -2
  56. data/lib/facter/facts/linux/memory/swap/available.rb +1 -1
  57. data/lib/facter/facts/linux/memory/swap/available_bytes.rb +1 -1
  58. data/lib/facter/facts/linux/memory/swap/total.rb +1 -1
  59. data/lib/facter/facts/linux/memory/swap/total_bytes.rb +1 -1
  60. data/lib/facter/facts/linux/memory/swap/used.rb +1 -1
  61. data/lib/facter/facts/linux/memory/system/available.rb +1 -1
  62. data/lib/facter/facts/linux/memory/system/available_bytes.rb +1 -1
  63. data/lib/facter/facts/linux/memory/system/total.rb +1 -1
  64. data/lib/facter/facts/linux/memory/system/total_bytes.rb +1 -1
  65. data/lib/facter/facts/linux/memory/system/used.rb +1 -1
  66. data/lib/facter/facts/linux/os/family.rb +4 -2
  67. data/lib/facter/facts/linux/processors/speed.rb +1 -1
  68. data/lib/facter/facts/linux/ssh.rb +1 -1
  69. data/lib/facter/facts/linux/sshalgorithmkey.rb +1 -1
  70. data/lib/facter/facts/linux/sshfp_algorithm.rb +1 -1
  71. data/lib/facter/facts/linux/virtual.rb +1 -1
  72. data/lib/facter/facts/macosx/dhcp_servers.rb +1 -0
  73. data/lib/facter/facts/macosx/interfaces.rb +1 -0
  74. data/lib/facter/facts/macosx/memory/swap/available.rb +1 -1
  75. data/lib/facter/facts/macosx/memory/swap/available_bytes.rb +1 -1
  76. data/lib/facter/facts/macosx/memory/swap/total.rb +1 -1
  77. data/lib/facter/facts/macosx/memory/swap/total_bytes.rb +1 -1
  78. data/lib/facter/facts/macosx/memory/swap/used.rb +1 -1
  79. data/lib/facter/facts/macosx/memory/system/available.rb +1 -1
  80. data/lib/facter/facts/macosx/memory/system/available_bytes.rb +1 -1
  81. data/lib/facter/facts/macosx/memory/system/total.rb +1 -1
  82. data/lib/facter/facts/macosx/memory/system/total_bytes.rb +1 -1
  83. data/lib/facter/facts/macosx/memory/system/used.rb +1 -1
  84. data/lib/facter/facts/macosx/processors/speed.rb +1 -1
  85. data/lib/facter/facts/macosx/ssh.rb +1 -1
  86. data/lib/facter/facts/macosx/sshalgorithmkey.rb +1 -1
  87. data/lib/facter/facts/macosx/sshfp_algorithm.rb +1 -1
  88. data/lib/facter/facts/rhel/os/release.rb +1 -1
  89. data/lib/facter/facts/solaris/dhcp_servers.rb +1 -0
  90. data/lib/facter/facts/solaris/disks.rb +1 -1
  91. data/lib/facter/facts/solaris/hypervisors/ldom.rb +3 -0
  92. data/lib/facter/facts/solaris/interfaces.rb +1 -0
  93. data/lib/facter/facts/solaris/is_virtual.rb +2 -2
  94. data/lib/facter/facts/solaris/ldom.rb +34 -4
  95. data/lib/facter/facts/solaris/memory/swap/available.rb +1 -1
  96. data/lib/facter/facts/solaris/memory/swap/available_bytes.rb +1 -1
  97. data/lib/facter/facts/solaris/memory/swap/total.rb +1 -1
  98. data/lib/facter/facts/solaris/memory/swap/total_bytes.rb +1 -1
  99. data/lib/facter/facts/solaris/memory/swap/used.rb +1 -1
  100. data/lib/facter/facts/solaris/memory/system/available.rb +1 -1
  101. data/lib/facter/facts/solaris/memory/system/available_bytes.rb +1 -1
  102. data/lib/facter/facts/solaris/memory/system/total.rb +1 -1
  103. data/lib/facter/facts/solaris/memory/system/total_bytes.rb +1 -1
  104. data/lib/facter/facts/solaris/memory/system/used.rb +1 -1
  105. data/lib/facter/facts/solaris/processors/speed.rb +1 -1
  106. data/lib/facter/facts/solaris/ssh.rb +1 -1
  107. data/lib/facter/facts/solaris/sshalgorithmkey.rb +1 -1
  108. data/lib/facter/facts/solaris/sshfp_algorithm.rb +1 -1
  109. data/lib/facter/facts/solaris/virtual.rb +1 -1
  110. data/lib/facter/facts/windows/dhcp_servers.rb +1 -0
  111. data/lib/facter/facts/windows/interfaces.rb +1 -0
  112. data/lib/facter/facts/windows/memory/system/available.rb +1 -1
  113. data/lib/facter/facts/windows/memory/system/available_bytes.rb +1 -1
  114. data/lib/facter/facts/windows/memory/system/total.rb +1 -1
  115. data/lib/facter/facts/windows/memory/system/total_bytes.rb +1 -1
  116. data/lib/facter/facts/windows/memory/system/used.rb +1 -1
  117. data/lib/facter/facts/windows/networking/fqdn.rb +1 -1
  118. data/lib/facter/facts/windows/os/release.rb +1 -1
  119. data/lib/facter/framework/benchmarking/timer.rb +4 -2
  120. data/lib/facter/framework/cli/cli.rb +20 -6
  121. data/lib/facter/framework/config/fact_groups.rb +10 -8
  122. data/lib/facter/framework/core/cache_manager.rb +62 -17
  123. data/lib/facter/framework/core/fact/internal/core_fact.rb +6 -1
  124. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +38 -4
  125. data/lib/facter/framework/core/fact_augmenter.rb +1 -1
  126. data/lib/facter/framework/core/fact_loaders/external_fact_loader.rb +4 -2
  127. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +17 -1
  128. data/lib/facter/framework/core/fact_manager.rb +15 -3
  129. data/lib/facter/framework/core/file_loader.rb +6 -2
  130. data/lib/facter/framework/core/options/config_file_options.rb +16 -5
  131. data/lib/facter/framework/core/options/option_store.rb +42 -20
  132. data/lib/facter/framework/detector/os_detector.rb +1 -0
  133. data/lib/facter/framework/detector/os_hierarchy.rb +5 -9
  134. data/lib/facter/framework/logging/logger.rb +3 -3
  135. data/lib/facter/models/fact_collection.rb +11 -1
  136. data/lib/facter/models/loaded_fact.rb +2 -1
  137. data/lib/facter/resolvers/aio_agent_version.rb +2 -2
  138. data/lib/facter/resolvers/aix/{architecture_resolver.rb → architecture.rb} +19 -4
  139. data/lib/facter/resolvers/aix/disks.rb +6 -5
  140. data/lib/facter/resolvers/aix/{filesystem_resolver.rb → filesystem.rb} +2 -2
  141. data/lib/facter/resolvers/aix/{hardware_resolver.rb → hardware.rb} +4 -3
  142. data/lib/facter/resolvers/aix/{load_averages_resolver.rb → load_averages.rb} +2 -1
  143. data/lib/facter/resolvers/aix/memory.rb +4 -3
  144. data/lib/facter/resolvers/aix/mountpoints.rb +6 -5
  145. data/lib/facter/resolvers/aix/{networking_resolver.rb → networking.rb} +4 -3
  146. data/lib/facter/resolvers/aix/nim.rb +1 -1
  147. data/lib/facter/resolvers/aix/os_level.rb +1 -1
  148. data/lib/facter/resolvers/aix/partitions.rb +7 -6
  149. data/lib/facter/resolvers/aix/processors.rb +5 -4
  150. data/lib/facter/resolvers/aix/serialnumber.rb +2 -2
  151. data/lib/facter/resolvers/{augeas_resolver.rb → augeas.rb} +8 -2
  152. data/lib/facter/resolvers/base_resolver.rb +14 -4
  153. data/lib/facter/resolvers/bsd/processors.rb +13 -8
  154. data/lib/facter/resolvers/cloud.rb +2 -2
  155. data/lib/facter/resolvers/containers.rb +5 -4
  156. data/lib/facter/resolvers/debian_version.rb +2 -2
  157. data/lib/facter/resolvers/{disk_resolver.rb → disk.rb} +17 -6
  158. data/lib/facter/resolvers/{dmi_resolver.rb → dmi.rb} +3 -2
  159. data/lib/facter/resolvers/dmi_decode.rb +1 -1
  160. data/lib/facter/resolvers/ec2.rb +5 -2
  161. data/lib/facter/resolvers/{eos_release_resolver.rb → eos_release.rb} +2 -2
  162. data/lib/facter/resolvers/{facterversion_resolver.rb → facterversion.rb} +1 -1
  163. data/lib/facter/resolvers/{filesystems_resolver.rb → filesystems.rb} +5 -2
  164. data/lib/facter/resolvers/{fips_enabled_resolver.rb → fips_enabled.rb} +5 -2
  165. data/lib/facter/resolvers/freebsd/{dmi_resolver.rb → dmi.rb} +1 -1
  166. data/lib/facter/resolvers/freebsd/{freebsd_version_resolver.rb → freebsd_version.rb} +9 -7
  167. data/lib/facter/resolvers/freebsd/{geom_resolver.rb → geom.rb} +15 -22
  168. data/lib/facter/resolvers/freebsd/processors.rb +13 -8
  169. data/lib/facter/resolvers/freebsd/{swap_memory_resolver.rb → swap_memory.rb} +5 -3
  170. data/lib/facter/resolvers/freebsd/{system_memory_resolver.rb → system_memory.rb} +4 -2
  171. data/lib/facter/resolvers/freebsd/virtual.rb +45 -0
  172. data/lib/facter/resolvers/gce.rb +3 -2
  173. data/lib/facter/resolvers/hostname.rb +92 -0
  174. data/lib/facter/resolvers/{identity_resolver.rb → identity.rb} +2 -1
  175. data/lib/facter/resolvers/linux/docker_uptime.rb +3 -2
  176. data/lib/facter/resolvers/linux/load_averages.rb +3 -2
  177. data/lib/facter/resolvers/load_averages.rb +5 -3
  178. data/lib/facter/resolvers/{lpar_resolver.rb → lpar.rb} +1 -1
  179. data/lib/facter/resolvers/{lsb_release_resolver.rb → lsb_release.rb} +1 -1
  180. data/lib/facter/resolvers/lspci.rb +1 -1
  181. data/lib/facter/resolvers/macosx/{dmi_resolver.rb → dmi.rb} +1 -1
  182. data/lib/facter/resolvers/macosx/{filesystems_resolver.rb → filesystems.rb} +1 -1
  183. data/lib/facter/resolvers/macosx/{load_averages_resolver.rb → load_averages.rb} +2 -1
  184. data/lib/facter/resolvers/macosx/{mountpoints_resolver.rb → mountpoints.rb} +9 -8
  185. data/lib/facter/resolvers/macosx/{processor_resolver.rb → processor.rb} +2 -1
  186. data/lib/facter/resolvers/macosx/{swap_memory_resolver.rb → swap_memory.rb} +2 -1
  187. data/lib/facter/resolvers/macosx/{system_memory_resolver.rb → system_memory.rb} +2 -1
  188. data/lib/facter/resolvers/macosx/{system_profiler_resolver.rb → system_profiler.rb} +4 -6
  189. data/lib/facter/resolvers/{memory_resolver.rb → memory.rb} +4 -2
  190. data/lib/facter/resolvers/mountpoints.rb +90 -0
  191. data/lib/facter/resolvers/{networking_resolver.rb → networking.rb} +9 -6
  192. data/lib/facter/resolvers/networking_linux.rb +296 -0
  193. data/lib/facter/resolvers/open_vz.rb +2 -4
  194. data/lib/facter/resolvers/{os_release_resolver.rb → os_release.rb} +2 -2
  195. data/lib/facter/resolvers/partitions.rb +67 -63
  196. data/lib/facter/resolvers/{path_resolver.rb → path.rb} +1 -1
  197. data/lib/facter/resolvers/{processors_resolver.rb → processors.rb} +6 -3
  198. data/lib/facter/resolvers/{redhat_release_resolver.rb → redhat_release.rb} +2 -2
  199. data/lib/facter/resolvers/{ruby_resolver.rb → ruby.rb} +1 -1
  200. data/lib/facter/resolvers/{selinux_resolver.rb → selinux.rb} +4 -4
  201. data/lib/facter/resolvers/solaris/disks.rb +2 -2
  202. data/lib/facter/resolvers/solaris/dmi.rb +3 -1
  203. data/lib/facter/resolvers/solaris/dmi_sparc.rb +1 -1
  204. data/lib/facter/resolvers/solaris/filesystems.rb +1 -1
  205. data/lib/facter/resolvers/solaris/ipaddress.rb +2 -1
  206. data/lib/facter/resolvers/solaris/ldom.rb +1 -3
  207. data/lib/facter/resolvers/solaris/memory.rb +4 -3
  208. data/lib/facter/resolvers/solaris/mountpoints.rb +13 -12
  209. data/lib/facter/resolvers/solaris/networking.rb +50 -43
  210. data/lib/facter/resolvers/solaris/os_release.rb +7 -5
  211. data/lib/facter/resolvers/solaris/processors.rb +2 -1
  212. data/lib/facter/resolvers/solaris/zone.rb +1 -1
  213. data/lib/facter/resolvers/solaris/zone_name.rb +1 -1
  214. data/lib/facter/resolvers/{ssh_resolver.rb → ssh.rb} +12 -8
  215. data/lib/facter/resolvers/{suse_release_resolver.rb → suse_release.rb} +2 -2
  216. data/lib/facter/resolvers/{sw_vers_resolver.rb → sw_vers.rb} +2 -2
  217. data/lib/facter/resolvers/{timezone_resolver.rb → timezone.rb} +1 -1
  218. data/lib/facter/resolvers/{uname_resolver.rb → uname.rb} +1 -1
  219. data/lib/facter/resolvers/{uptime_resolver.rb → uptime.rb} +3 -3
  220. data/lib/facter/resolvers/virt_what.rb +1 -1
  221. data/lib/facter/resolvers/vmware.rb +1 -1
  222. data/lib/facter/resolvers/windows/aio_agent_version.rb +2 -2
  223. data/lib/facter/resolvers/windows/{dmi_bios_resolver.rb → dmi_bios.rb} +2 -2
  224. data/lib/facter/resolvers/windows/{dmi_computersystem_resolver.rb → dmi_computersystem.rb} +2 -2
  225. data/lib/facter/resolvers/windows/{fips_resolver.rb → fips.rb} +2 -1
  226. data/lib/facter/resolvers/windows/{hardware_architecture_resolver.rb → hardware_architecture.rb} +2 -1
  227. data/lib/facter/resolvers/windows/{identity_resolver.rb → identity.rb} +2 -1
  228. data/lib/facter/resolvers/windows/{kernel_resolver.rb → kernel.rb} +3 -1
  229. data/lib/facter/resolvers/windows/{memory_resolver.rb → memory.rb} +7 -1
  230. data/lib/facter/resolvers/windows/{netkvm_resolver.rb → netkvm.rb} +2 -1
  231. data/lib/facter/resolvers/windows/{networking_resolver.rb → networking.rb} +18 -4
  232. data/lib/facter/resolvers/windows/{processors_resolver.rb → processors.rb} +3 -2
  233. data/lib/facter/resolvers/windows/{product_release_resolver.rb → product_release.rb} +2 -1
  234. data/lib/facter/resolvers/windows/ssh.rb +5 -3
  235. data/lib/facter/resolvers/windows/{system32_resolver.rb → system32.rb} +3 -1
  236. data/lib/facter/resolvers/windows/{uptime_resolver.rb → uptime.rb} +3 -2
  237. data/lib/facter/resolvers/windows/{virtualization_resolver.rb → virtualization.rb} +3 -2
  238. data/lib/facter/resolvers/windows/{win_os_description_resolver.rb → win_os_description.rb} +4 -2
  239. data/lib/facter/resolvers/{wpar_resolver.rb → wpar.rb} +1 -1
  240. data/lib/facter/resolvers/xen.rb +2 -2
  241. data/lib/facter/resolvers/zfs.rb +2 -1
  242. data/lib/facter/resolvers/zpool.rb +2 -1
  243. data/lib/facter/util/aix/info_extractor.rb +24 -0
  244. data/lib/facter/util/aix/odm_query.rb +46 -0
  245. data/lib/facter/util/api_debugger.rb +33 -29
  246. data/lib/facter/util/facts/facts_utils.rb +30 -0
  247. data/lib/facter/util/facts/unit_converter.rb +61 -0
  248. data/lib/facter/util/facts/uptime_parser.rb +128 -0
  249. data/lib/facter/util/facts/virtual_detector.rb +90 -0
  250. data/lib/facter/util/facts/windows_release_finder.rb +55 -0
  251. data/lib/facter/{resolvers/macosx/utils → util/macosx}/system_profile_executor.rb +1 -1
  252. data/lib/facter/util/resolvers/aws_token.rb +37 -0
  253. data/lib/facter/{resolvers/utils → util/resolvers}/ffi/load_averages.rb +2 -2
  254. data/lib/facter/util/resolvers/filesystem_helper.rb +47 -0
  255. data/lib/facter/util/resolvers/fingerprint.rb +15 -0
  256. data/lib/facter/{resolvers/utils → util/resolvers}/http.rb +17 -10
  257. data/lib/facter/util/resolvers/networking/dhcp.rb +21 -0
  258. data/lib/facter/util/resolvers/networking/networking.rb +109 -0
  259. data/lib/facter/util/resolvers/networking/primary_interface.rb +82 -0
  260. data/lib/facter/util/resolvers/ssh.rb +17 -0
  261. data/lib/facter/util/resolvers/ssh_helper.rb +31 -0
  262. data/lib/facter/{resolvers/utils → util/resolvers}/uptime_helper.rb +2 -2
  263. data/lib/facter/{framework/utils → util}/utils.rb +0 -0
  264. data/lib/facter/util/windows/win32ole.rb +30 -0
  265. data/lib/facter/version.rb +1 -1
  266. metadata +106 -119
  267. data/lib/facter/fact_groups.conf +0 -308
  268. data/lib/facter/facts/aix/puppet_version.rb +0 -15
  269. data/lib/facter/facts/freebsd/puppet_version.rb +0 -15
  270. data/lib/facter/facts/linux/puppet_version.rb +0 -15
  271. data/lib/facter/facts/macosx/puppet_version.rb +0 -15
  272. data/lib/facter/facts/solaris/puppet_version.rb +0 -15
  273. data/lib/facter/facts/windows/puppet_version.rb +0 -15
  274. data/lib/facter/facts_utils/facts_utils.rb +0 -12
  275. data/lib/facter/facts_utils/unit_converter.rb +0 -59
  276. data/lib/facter/facts_utils/uptime_parser.rb +0 -124
  277. data/lib/facter/facts_utils/virtual_detector.rb +0 -78
  278. data/lib/facter/facts_utils/windows_release_finder.rb +0 -51
  279. data/lib/facter/os_hierarchy.json +0 -36
  280. data/lib/facter/resolvers/aix/utils/info_extractor.rb +0 -20
  281. data/lib/facter/resolvers/aix/utils/odm_query.rb +0 -42
  282. data/lib/facter/resolvers/hostname_resolver.rb +0 -44
  283. data/lib/facter/resolvers/mountpoints_resolver.rb +0 -62
  284. data/lib/facter/resolvers/networking_linux_resolver.rb +0 -159
  285. data/lib/facter/resolvers/puppet_version_resolver.rb +0 -26
  286. data/lib/facter/resolvers/utils/filesystem_helper.rb +0 -43
  287. data/lib/facter/resolvers/utils/fingerprint.rb +0 -11
  288. data/lib/facter/resolvers/utils/networking.rb +0 -86
  289. data/lib/facter/resolvers/utils/ssh.rb +0 -13
  290. data/lib/facter/resolvers/utils/ssh_helper.rb +0 -27
  291. data/lib/facter/resolvers/windows/utils/win32ole.rb +0 -24
@@ -0,0 +1,296 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ class NetworkingLinux < BaseResolver
6
+ init_resolver
7
+
8
+ DIRS = ['/var/lib/dhclient/', '/var/lib/dhcp/', '/var/lib/dhcp3/', '/var/lib/NetworkManager/', '/var/db/'].freeze
9
+ ROUTE_TYPES = %w[anycast
10
+ unicast
11
+ broadcast
12
+ local
13
+ nat
14
+ unreachable
15
+ prohibit
16
+ blackhole
17
+ throw].freeze
18
+
19
+ class << self
20
+ private
21
+
22
+ def post_resolve(fact_name)
23
+ @fact_list.fetch(fact_name) { retrieve_network_info(fact_name) }
24
+
25
+ @fact_list[fact_name]
26
+ end
27
+
28
+ def retrieve_network_info(fact_name)
29
+ mtu_and_indexes = interfaces_mtu_and_index
30
+ retrieve_interfaces_with_socket(mtu_and_indexes)
31
+ add_info_from_routing_table
32
+ retrieve_primary_interface
33
+ Facter::Util::Resolvers::Networking.expand_main_bindings(@fact_list)
34
+ @fact_list[fact_name]
35
+ end
36
+
37
+ def interfaces_mtu_and_index
38
+ mtu_and_indexes = {}
39
+ output = Facter::Core::Execution.execute('ip link show', logger: log)
40
+ output.each_line do |line|
41
+ next unless line.include?('mtu')
42
+
43
+ parse_ip_command_line(line, mtu_and_indexes)
44
+ end
45
+ log.debug("Associated MTU and index in ip command: #{mtu_and_indexes}")
46
+ mtu_and_indexes
47
+ end
48
+
49
+ def parse_ip_command_line(line, mtu_and_indexes)
50
+ mtu = line.match(/mtu (\d+)/)&.captures&.first&.to_i
51
+ index_tokens = line.split(':')
52
+ index = index_tokens[0].strip
53
+ # vlans are displayed as <vlan_name>@<physical_interface>
54
+ name = index_tokens[1].split('@').first.strip
55
+ mtu_and_indexes[name] = { index: index, mtu: mtu }
56
+ end
57
+
58
+ def retrieve_interfaces_with_socket(mtu_and_indexes)
59
+ require 'socket'
60
+ interfaces = {}
61
+ Socket.getifaddrs.each do |ifaddr|
62
+ populate_interface_info(ifaddr, interfaces, mtu_and_indexes)
63
+ end
64
+
65
+ @fact_list[:interfaces] = interfaces
66
+ end
67
+
68
+ def populate_interface_info(ifaddr, interfaces, mtu_and_indexes)
69
+ interface_name = ifaddr.name
70
+ interfaces[interface_name] = {} if interfaces[interface_name].nil?
71
+ interface_data = interfaces[interface_name]
72
+
73
+ mac(ifaddr, interfaces)
74
+ mtu(ifaddr, interfaces, mtu_and_indexes)
75
+ ip, netmask, ipv4_type = ip_info_of(ifaddr)
76
+ add_binding(interface_data, interface_name, ip, netmask, ipv4_type)
77
+ dhcp(interface_name, mtu_and_indexes[interface_name], interface_data) if interface_data[:dhcp].nil?
78
+ log.debug("Found interface #{interface_name} with #{interface_data}")
79
+ end
80
+
81
+ def mac(ifaddr, interfaces)
82
+ return unless interfaces[ifaddr.name][:mac].nil?
83
+
84
+ mac = search_for_mac(ifaddr)
85
+ interfaces[ifaddr.name][:mac] = mac if mac
86
+ end
87
+
88
+ def search_for_mac(ifaddr)
89
+ mac = mac_from_bonded_interface(ifaddr.name)
90
+ mac ||= mac_from(ifaddr)
91
+ mac if !mac.nil? && mac != '00:00:00:00:00:00' && mac =~ /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/
92
+ end
93
+
94
+ def mac_from_bonded_interface(interface_name)
95
+ master = bond_master_of(interface_name)
96
+ return unless master
97
+
98
+ output = Facter::Util::FileHelper.safe_read("/proc/net/bonding/#{master}", nil)
99
+ return unless output
100
+
101
+ found_match = false
102
+ output.each_line do |line|
103
+ if line.strip == "Slave Interface: #{interface_name}"
104
+ found_match = true
105
+ elsif line.include? 'Slave Interface'
106
+ # if we reached the data block of another interface belonging to the bonded interface
107
+ found_match = false
108
+ end
109
+ return Regexp.last_match(1) if found_match && line =~ /Permanent HW addr: (\S*)/
110
+ end
111
+ end
112
+
113
+ def bond_master_of(interface_name)
114
+ content = Facter::Core::Execution.execute("ip link show #{interface_name}", logger: log)
115
+ content.match(/master (\S*) /)&.captures&.first
116
+ end
117
+
118
+ def mac_from(ifaddr)
119
+ if Socket.const_defined? :PF_LINK
120
+ ifaddr.addr&.getnameinfo&.first # sometimes it returns localhost or ip
121
+ elsif Socket.const_defined? :PF_PACKET
122
+ return if ifaddr.addr.nil?
123
+
124
+ search_mac_in_sockaddr(ifaddr)
125
+ end
126
+ rescue StandardError => e
127
+ log.debug("Could not read mac, got #{e}")
128
+ end
129
+
130
+ def search_mac_in_sockaddr(ifaddr)
131
+ result = ifaddr.addr.inspect_sockaddr
132
+ result&.match(/hwaddr=([\h:]+)/)&.captures&.first
133
+ end
134
+
135
+ def mtu(ifaddr, interfaces, mtu_and_indexes)
136
+ return unless interfaces[ifaddr.name][:mtu].nil?
137
+
138
+ mtu = mtu_and_indexes.dig(ifaddr.name, :mtu)
139
+ interfaces[ifaddr.name][:mtu] = mtu unless mtu.nil?
140
+ end
141
+
142
+ def ip_info_of(ifaddr)
143
+ return if ifaddr.addr.nil? || ifaddr.netmask.nil?
144
+
145
+ # ipv6 ips are retrieved as <ip>%<interface_name>
146
+ ip = ifaddr.addr.ip_address.split('%').first
147
+ netmask = ifaddr.netmask.ip_address
148
+ [ip, netmask, ifaddr.addr.ipv4?]
149
+ rescue StandardError => e
150
+ log.debug("Could not read binding data, got #{e}")
151
+ end
152
+
153
+ def add_binding(interface_data, interface_name, ip, netmask, ip_v4_type)
154
+ binding = Facter::Util::Resolvers::Networking.build_binding(ip, netmask)
155
+ return if binding.nil?
156
+
157
+ log.debug("Adding to interface #{interface_name}, binding:\n#{binding}")
158
+ binding_key = ip_v4_type == true ? :bindings : :bindings6
159
+ interface_data[binding_key] = [] if interface_data[binding_key].nil?
160
+ interface_data[binding_key] << binding
161
+ end
162
+
163
+ def add_info_from_routing_table
164
+ routes4, routes6 = read_routing_table
165
+ compare_ips(routes4, :bindings)
166
+ compare_ips(routes6, :bindings6)
167
+ end
168
+
169
+ def read_routing_table
170
+ ipv4_output = Facter::Core::Execution.execute('ip route show', logger: log)
171
+ ipv6_output = Facter::Core::Execution.execute('ip -6 route show', logger: log)
172
+ routes4 = parse_routes(ipv4_output, true)
173
+ routes6 = parse_routes(ipv6_output, false)
174
+ [routes4, routes6]
175
+ end
176
+
177
+ def parse_routes(output, ipv4_type)
178
+ routes = []
179
+ output.each_line do |line|
180
+ parts = line.split(' ').compact
181
+ next if parts.include?('linkdown')
182
+
183
+ delete_invalid_route_type(parts)
184
+ next if !ipv4_type && !parts[0].include?(':')
185
+
186
+ route = construct_route(parts)
187
+ routes << route unless route[:ip].nil?
188
+ end
189
+ routes.uniq
190
+ end
191
+
192
+ def delete_invalid_route_type(parts)
193
+ route_type = parts[0]
194
+ parts.delete_at(0) if ROUTE_TYPES.include?(route_type)
195
+ end
196
+
197
+ def construct_route(parts)
198
+ route = {}
199
+ dev_index = parts.find_index { |elem| elem == 'dev' }
200
+ src_index = parts.find_index { |elem| elem == 'src' }
201
+ route[:interface] = parts[dev_index + 1] if dev_index
202
+ route[:ip] = parts[src_index + 1] if src_index
203
+ route
204
+ end
205
+
206
+ def compare_ips(routes, binding_key)
207
+ routes.each do |route|
208
+ next unless @fact_list[:interfaces].key?(route[:interface])
209
+
210
+ interface_data = @fact_list[:interfaces][route[:interface]]
211
+ add_binding_if_missing(interface_data, binding_key, route)
212
+ end
213
+ end
214
+
215
+ def add_binding_if_missing(interface_data, binding_key, route)
216
+ interface_binding = interface_data[binding_key]
217
+
218
+ if interface_binding.nil?
219
+ interface_data[binding_key] = [{ address: route[:ip] }]
220
+ elsif interface_binding.none? { |binding| binding[:address] == route[:ip] }
221
+ interface_binding << { address: route[:ip] }
222
+ end
223
+ end
224
+
225
+ def dhcp(interface_name, index_and_mtu, interface_data)
226
+ log.debug("Get DHCP for interface #{interface_name}")
227
+
228
+ search_systemd_netif_leases(interface_data, index_and_mtu)
229
+ search_dhclient_leases(interface_data, interface_name)
230
+ search_internal_leases(interface_data, interface_name)
231
+ search_with_dhcpcd_command(interface_data, interface_name)
232
+ end
233
+
234
+ def search_systemd_netif_leases(interface_data, index_and_mtu)
235
+ return if index_and_mtu.nil?
236
+
237
+ index = index_and_mtu[:index]
238
+ file_content = Facter::Util::FileHelper.safe_read("/run/systemd/netif/leases/#{index}", nil)
239
+ dhcp = file_content.match(/SERVER_ADDRESS=(.*)/) if file_content
240
+ interface_data[:dhcp] = dhcp[1] if dhcp
241
+ end
242
+
243
+ def search_dhclient_leases(interface_data, interface_name)
244
+ return unless interface_data[:dhcp].nil?
245
+
246
+ DIRS.each do |dir|
247
+ next unless File.readable?(dir)
248
+
249
+ lease_files = Dir.entries(dir).select { |file| file =~ /dhclient.*\.lease/ }
250
+ next if lease_files.empty?
251
+
252
+ lease_files.select do |file|
253
+ content = Facter::Util::FileHelper.safe_read("#{dir}#{file}", nil)
254
+ next unless content =~ /interface.*#{interface_name}/
255
+
256
+ dhcp = content.match(/dhcp-server-identifier ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/)
257
+ return interface_data[:dhcp] = dhcp[1] if dhcp
258
+ end
259
+ end
260
+ end
261
+
262
+ def search_internal_leases(interface_data, interface_name)
263
+ return if !interface_data[:dhcp].nil? || !File.readable?('/var/lib/NetworkManager/')
264
+
265
+ files = Dir.entries('/var/lib/NetworkManager/').reject { |dir| dir =~ /^\.+$/ }
266
+ lease_file = files.find { |file| file =~ /internal.*#{interface_name}\.lease/ }
267
+ return unless lease_file
268
+
269
+ dhcp = Facter::Util::FileHelper.safe_read("/var/lib/NetworkManager/#{lease_file}", nil)
270
+
271
+ return unless dhcp
272
+
273
+ dhcp = dhcp.match(/SERVER_ADDRESS=(.*)/)
274
+ interface_data[:dhcp] = dhcp[1] if dhcp
275
+ end
276
+
277
+ def search_with_dhcpcd_command(interface_data, interface_name)
278
+ return unless interface_data[:dhcp].nil?
279
+
280
+ output = Facter::Core::Execution.execute("dhcpcd -U #{interface_name}", logger: log)
281
+ dhcp = output.match(/dhcp_server_identifier='(.*)'/)
282
+ interface_data[:dhcp] = dhcp[1] if dhcp
283
+ end
284
+
285
+ def retrieve_primary_interface
286
+ primary_helper = Facter::Util::Resolvers::Networking::PrimaryInterface
287
+ primary_interface = primary_helper.read_from_proc_route
288
+ primary_interface ||= primary_helper.read_from_ip_route
289
+ primary_interface ||= primary_helper.find_in_interfaces(@fact_list[:interfaces])
290
+
291
+ @fact_list[:primary_interface] = primary_interface
292
+ end
293
+ end
294
+ end
295
+ end
296
+ end
@@ -5,7 +5,7 @@ module Facter
5
5
  class OpenVz < BaseResolver
6
6
  # build
7
7
 
8
- @fact_list ||= {}
8
+ init_resolver
9
9
 
10
10
  class << self
11
11
  private
@@ -15,9 +15,7 @@ module Facter
15
15
  end
16
16
 
17
17
  def check_proc_vz(fact_name)
18
- if !Dir.exist?('/proc/vz') || !File.executable?('/proc/lve/list') || Dir.entries('/proc/vz').count.equal?(2)
19
- return
20
- end
18
+ return if !Dir.exist?('/proc/vz') || File.file?('/proc/lve/list') || Dir.entries('/proc/vz').count.equal?(2)
21
19
 
22
20
  @fact_list[:vm] = read_proc_status
23
21
  @fact_list[fact_name]
@@ -14,7 +14,7 @@ module Facter
14
14
  # :support_url
15
15
  # :bug_report_url
16
16
 
17
- @fact_list ||= {}
17
+ init_resolver
18
18
 
19
19
  class << self
20
20
  private
@@ -24,7 +24,7 @@ module Facter
24
24
  end
25
25
 
26
26
  def read_os_release_file(fact_name)
27
- output = Util::FileHelper.safe_readlines('/etc/os-release')
27
+ output = Facter::Util::FileHelper.safe_readlines('/etc/os-release')
28
28
  return @fact_list[:name] = nil if output.empty?
29
29
 
30
30
  pairs = []
@@ -3,7 +3,8 @@
3
3
  module Facter
4
4
  module Resolvers
5
5
  class Partitions < BaseResolver
6
- @fact_list ||= {}
6
+ init_resolver
7
+
7
8
  BLOCK_PATH = '/sys/block'
8
9
  BLOCK_SIZE = 512
9
10
 
@@ -15,98 +16,122 @@ module Facter
15
16
  end
16
17
 
17
18
  def read_partitions(fact_name)
18
- @fact_list[:partitions] = {}
19
- return {} unless File.readable?(BLOCK_PATH)
19
+ return unless File.readable?(BLOCK_PATH)
20
20
 
21
21
  block_devices = Dir.entries(BLOCK_PATH).reject { |dir| dir =~ /^\.+/ }
22
+ @fact_list[:partitions] = {} unless block_devices.empty?
23
+ blkid_and_lsblk = {}
24
+
22
25
  block_devices.each do |block_device|
23
26
  block_path = "#{BLOCK_PATH}/#{block_device}"
24
27
  if File.directory?("#{block_path}/device")
25
- extract_from_device(block_path)
28
+ extract_from_device(block_path, blkid_and_lsblk)
26
29
  elsif File.directory?("#{block_path}/dm")
27
- extract_from_dm(block_path)
30
+ extract_from_dm(block_path, block_device, blkid_and_lsblk)
28
31
  elsif File.directory?("#{block_path}/loop")
29
- extract_from_loop(block_path)
32
+ extract_from_loop(block_path, block_device, blkid_and_lsblk)
30
33
  end
31
34
  end
35
+
32
36
  @fact_list[fact_name]
33
37
  end
34
38
 
35
- def extract_from_device(block_path)
39
+ def extract_from_device(block_path, blkid_and_lsblk)
36
40
  subdirs = browse_subdirectories(block_path)
37
41
  subdirs.each do |subdir|
38
42
  name = "/dev/#{subdir.split('/').last}"
39
- populate_partitions(name, subdir)
43
+ populate_partitions(name, subdir, blkid_and_lsblk)
40
44
  end
41
45
  end
42
46
 
43
- def extract_from_dm(block_path)
44
- map_name = Util::FileHelper.safe_read("#{block_path}/dm/name").chomp
47
+ def extract_from_dm(block_path, block_device, blkid_and_lsblk)
48
+ map_name = Facter::Util::FileHelper.safe_read("#{block_path}/dm/name").chomp
45
49
  if map_name.empty?
46
- populate_partitions("/dev#{block_path}", block_path)
50
+ populate_partitions("/dev/#{block_device}", block_path, blkid_and_lsblk)
47
51
  else
48
- populate_partitions("/dev/mapper/#{map_name}", block_path)
52
+ populate_partitions("/dev/mapper/#{map_name}", block_path, blkid_and_lsblk)
49
53
  end
50
54
  end
51
55
 
52
- def extract_from_loop(block_path)
53
- backing_file = Util::FileHelper.safe_read("#{block_path}/loop/backing_file").chomp
56
+ def extract_from_loop(block_path, block_device, blkid_and_lsblk)
57
+ backing_file = Facter::Util::FileHelper.safe_read("#{block_path}/loop/backing_file").chomp
54
58
  if backing_file.empty?
55
- populate_partitions("/dev#{block_path}", block_path)
59
+ populate_partitions("/dev/#{block_device}", block_path, blkid_and_lsblk)
56
60
  else
57
- populate_partitions("/dev#{block_path}", block_path, backing_file)
61
+ populate_partitions("/dev/#{block_device}", block_path, blkid_and_lsblk, backing_file)
58
62
  end
59
63
  end
60
64
 
61
- def populate_partitions(partition_name, block_path, backing_file = nil)
62
- @fact_list[:partitions][partition_name] = {}
63
- size_bytes = Util::FileHelper.safe_read("#{block_path}/size", '0')
64
- .chomp.to_i * BLOCK_SIZE
65
+ def populate_partitions(partition_name, block_path, blkid_and_lsblk, backing_file = nil)
66
+ size_bytes = Facter::Util::FileHelper.safe_read("#{block_path}/size", '0')
67
+ .chomp.to_i * BLOCK_SIZE
65
68
  info_hash = { size_bytes: size_bytes,
66
- size: Facter::FactsUtils::UnitConverter.bytes_to_human_readable(size_bytes),
69
+ size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes),
67
70
  backing_file: backing_file }
68
- info_hash.merge!(populate_from_syscalls(partition_name))
71
+ info_hash.merge!(populate_from_syscalls(partition_name, blkid_and_lsblk))
69
72
  @fact_list[:partitions][partition_name] = info_hash.reject { |_key, value| value.nil? }
70
73
  end
71
74
 
72
- def populate_from_syscalls(partition_name)
73
- part_info = populate_from_blkid(partition_name)
75
+ def populate_from_syscalls(partition_name, blkid_and_lsblk)
76
+ part_info = populate_from_blkid(partition_name, blkid_and_lsblk)
74
77
 
75
- return pupulate_from_lsblk(partition_name) if part_info.empty?
78
+ return populate_from_lsblk(partition_name, blkid_and_lsblk) if part_info.empty?
76
79
 
77
80
  part_info
78
81
  end
79
82
 
80
- def populate_from_blkid(partition_name)
81
- return {} unless blkid_command?
83
+ def browse_subdirectories(path)
84
+ dirs = Dir[File.join(path, '**', '*')].select { |p| File.directory? p }
85
+ dirs.select { |subdir| subdir.split('/').last.include?(path.split('/').last) }.reject(&:nil?)
86
+ end
87
+
88
+ def populate_from_blkid(partition_name, blkid_and_lsblk)
89
+ return {} unless available?('blkid', blkid_and_lsblk)
90
+
91
+ blkid_and_lsblk[:blkid] ||= execute_and_extract_blkid_info
92
+
93
+ partition_data = blkid_and_lsblk[:blkid][partition_name]
94
+ return {} unless partition_data
82
95
 
83
- @blkid_content ||= execute_and_extract_blkid_info
84
- return {} unless @blkid_content[partition_name]
96
+ filesys = partition_data['TYPE']
97
+ uuid = partition_data['UUID']
98
+ label = partition_data['LABEL']
99
+ part_uuid = partition_data['PARTUUID']
100
+ part_label = partition_data['PARTLABEL']
85
101
 
86
- filesys = @blkid_content[partition_name]['TYPE']
87
- uuid = @blkid_content[partition_name]['UUID']
88
- label = @blkid_content[partition_name]['LABEL']
89
- part_uuid = @blkid_content[partition_name]['PARTUUID']
90
- part_label = @blkid_content[partition_name]['PARTLABEL']
91
102
  { filesystem: filesys, uuid: uuid, label: label, partuuid: part_uuid, partlabel: part_label }
92
103
  end
93
104
 
94
- def blkid_command?
95
- return @blkid_exists unless @blkid_exists.nil?
105
+ def available?(command, blkid_and_lsblk)
106
+ command_exists_key = command == 'blkid' ? :blkid_exists : :lsblk_exists
96
107
 
97
- output = Facter::Core::Execution.execute('which blkid', logger: log)
108
+ return blkid_and_lsblk[command_exists_key] unless blkid_and_lsblk[command_exists_key].nil?
98
109
 
99
- @blkid_exists = !output.empty?
110
+ output = Facter::Core::Execution.execute("which #{command}", logger: log)
111
+
112
+ blkid_and_lsblk[:command_exists_key] = !output.empty?
113
+ end
114
+
115
+ def execute_and_extract_blkid_info
116
+ stdout = Facter::Core::Execution.execute('blkid', logger: log)
117
+ output_hash = Hash[*stdout.split(/^([^:]+):/)[1..-1]]
118
+ output_hash.each do |key, value|
119
+ output_hash[key] = Hash[*value.delete('"').chomp.rstrip.split(/ ([^= ]+)=/)[1..-1]]
120
+ end
100
121
  end
101
122
 
102
- def pupulate_from_lsblk(partition_name)
103
- return {} unless lsblk_command?
123
+ def populate_from_lsblk(partition_name, blkid_and_lsblk)
124
+ return {} unless available?('lsblk', blkid_and_lsblk)
104
125
 
105
- @lsblk_content ||= Facter::Core::Execution.execute('lsblk -fp', logger: log)
126
+ blkid_and_lsblk[:lsblk] ||= Facter::Core::Execution.execute('lsblk -fp', logger: log)
106
127
 
107
- part_info = @lsblk_content.match(/#{partition_name}.*/).to_s.split(' ')
128
+ part_info = blkid_and_lsblk[:lsblk].match(/#{partition_name}.*/).to_s.split(' ')
108
129
  return {} if part_info.empty?
109
130
 
131
+ parse_part_info(part_info)
132
+ end
133
+
134
+ def parse_part_info(part_info)
110
135
  result = { filesystem: part_info[1] }
111
136
 
112
137
  if part_info.count.eql?(5)
@@ -118,27 +143,6 @@ module Facter
118
143
 
119
144
  result
120
145
  end
121
-
122
- def lsblk_command?
123
- return @lsblk_exists unless @lsblk_exists.nil?
124
-
125
- output = Facter::Core::Execution.execute('which lsblk', logger: log)
126
-
127
- @lsblk_exists = !output.empty?
128
- end
129
-
130
- def execute_and_extract_blkid_info
131
- stdout = Facter::Core::Execution.execute('blkid', logger: log)
132
- output_hash = Hash[*stdout.split(/^([^:]+):/)[1..-1]]
133
- output_hash.each do |key, value|
134
- output_hash[key] = Hash[*value.delete('"').chomp.rstrip.split(/ ([^= ]+)=/)[1..-1]]
135
- end
136
- end
137
-
138
- def browse_subdirectories(path)
139
- dirs = Dir[File.join(path, '**', '*')].select { |p| File.directory? p }
140
- dirs.select { |subdir| subdir.split('/').last.include?(path.split('/').last) }.reject(&:nil?)
141
- end
142
146
  end
143
147
  end
144
148
  end