facter 4.0.46 → 4.0.51

Sign up to get free protection for your applications and to get access to all the features.
Files changed (302) 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 +59 -7
  5. data/lib/facter/config.rb +53 -10
  6. data/lib/facter/custom_facts/core/aggregate.rb +7 -0
  7. data/lib/facter/custom_facts/core/execution/base.rb +3 -2
  8. data/lib/facter/custom_facts/core/execution/popen3.rb +47 -0
  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 +40 -4
  12. data/lib/facter/custom_facts/util/loader.rb +1 -1
  13. data/lib/facter/custom_facts/util/resolution.rb +2 -2
  14. data/lib/facter/facts/aix/disks.rb +1 -1
  15. data/lib/facter/facts/aix/interfaces.rb +1 -0
  16. data/lib/facter/facts/aix/memory/swap/available.rb +1 -1
  17. data/lib/facter/facts/aix/memory/swap/available_bytes.rb +1 -1
  18. data/lib/facter/facts/aix/memory/swap/total.rb +1 -1
  19. data/lib/facter/facts/aix/memory/swap/total_bytes.rb +1 -1
  20. data/lib/facter/facts/aix/memory/swap/used.rb +1 -1
  21. data/lib/facter/facts/aix/memory/system/available.rb +1 -1
  22. data/lib/facter/facts/aix/memory/system/available_bytes.rb +1 -1
  23. data/lib/facter/facts/aix/memory/system/total.rb +1 -1
  24. data/lib/facter/facts/aix/memory/system/total_bytes.rb +1 -1
  25. data/lib/facter/facts/aix/memory/system/used.rb +1 -1
  26. data/lib/facter/facts/aix/processors/speed.rb +1 -1
  27. data/lib/facter/facts/aix/ssh.rb +1 -1
  28. data/lib/facter/facts/aix/sshalgorithmkey.rb +1 -1
  29. data/lib/facter/facts/aix/sshfp_algorithm.rb +1 -1
  30. data/lib/facter/facts/alpine/os/release.rb +29 -0
  31. data/lib/facter/facts/amzn/os/release.rb +29 -0
  32. data/lib/facter/facts/bsd/processors/speed.rb +1 -1
  33. data/lib/facter/facts/devuan/os/distro/release.rb +36 -0
  34. data/lib/facter/facts/devuan/os/release.rb +29 -0
  35. data/lib/facter/facts/freebsd/is_virtual.rb +25 -0
  36. data/lib/facter/facts/freebsd/memory/swap/available.rb +1 -1
  37. data/lib/facter/facts/freebsd/memory/swap/available_bytes.rb +1 -1
  38. data/lib/facter/facts/freebsd/memory/swap/total.rb +1 -1
  39. data/lib/facter/facts/freebsd/memory/swap/total_bytes.rb +1 -1
  40. data/lib/facter/facts/freebsd/memory/swap/used.rb +1 -1
  41. data/lib/facter/facts/freebsd/memory/system/available.rb +1 -1
  42. data/lib/facter/facts/freebsd/memory/system/available_bytes.rb +1 -1
  43. data/lib/facter/facts/freebsd/memory/system/total.rb +1 -1
  44. data/lib/facter/facts/freebsd/memory/system/total_bytes.rb +1 -1
  45. data/lib/facter/facts/freebsd/memory/system/used.rb +1 -1
  46. data/lib/facter/facts/freebsd/processors/speed.rb +1 -1
  47. data/lib/facter/facts/freebsd/ssh.rb +1 -1
  48. data/lib/facter/facts/freebsd/sshalgorithmkey.rb +1 -1
  49. data/lib/facter/facts/freebsd/sshfp_algorithm.rb +1 -1
  50. data/lib/facter/facts/freebsd/virtual.rb +22 -0
  51. data/lib/facter/facts/gentoo/os/release.rb +29 -0
  52. data/lib/facter/facts/linux/dhcp_servers.rb +1 -0
  53. data/lib/facter/facts/linux/disks.rb +1 -1
  54. data/lib/facter/facts/linux/ec2_metadata.rb +1 -1
  55. data/lib/facter/facts/linux/ec2_userdata.rb +1 -1
  56. data/lib/facter/facts/linux/hypervisors/kvm.rb +1 -1
  57. data/lib/facter/facts/linux/hypervisors/xen.rb +1 -1
  58. data/lib/facter/facts/linux/interfaces.rb +1 -0
  59. data/lib/facter/facts/linux/is_virtual.rb +2 -2
  60. data/lib/facter/facts/linux/memory/swap/available.rb +1 -1
  61. data/lib/facter/facts/linux/memory/swap/available_bytes.rb +1 -1
  62. data/lib/facter/facts/linux/memory/swap/total.rb +1 -1
  63. data/lib/facter/facts/linux/memory/swap/total_bytes.rb +1 -1
  64. data/lib/facter/facts/linux/memory/swap/used.rb +1 -1
  65. data/lib/facter/facts/linux/memory/system/available.rb +1 -1
  66. data/lib/facter/facts/linux/memory/system/available_bytes.rb +1 -1
  67. data/lib/facter/facts/linux/memory/system/total.rb +1 -1
  68. data/lib/facter/facts/linux/memory/system/total_bytes.rb +1 -1
  69. data/lib/facter/facts/linux/memory/system/used.rb +1 -1
  70. data/lib/facter/facts/linux/os/family.rb +4 -2
  71. data/lib/facter/facts/linux/processors/speed.rb +1 -1
  72. data/lib/facter/facts/linux/ssh.rb +1 -1
  73. data/lib/facter/facts/linux/sshalgorithmkey.rb +1 -1
  74. data/lib/facter/facts/linux/sshfp_algorithm.rb +1 -1
  75. data/lib/facter/facts/linux/virtual.rb +1 -1
  76. data/lib/facter/facts/linuxmint/os/name.rb +18 -0
  77. data/lib/facter/facts/linuxmint/os/release.rb +35 -0
  78. data/lib/facter/facts/macosx/dhcp_servers.rb +1 -0
  79. data/lib/facter/facts/macosx/interfaces.rb +1 -0
  80. data/lib/facter/facts/macosx/memory/swap/available.rb +1 -1
  81. data/lib/facter/facts/macosx/memory/swap/available_bytes.rb +1 -1
  82. data/lib/facter/facts/macosx/memory/swap/total.rb +1 -1
  83. data/lib/facter/facts/macosx/memory/swap/total_bytes.rb +1 -1
  84. data/lib/facter/facts/macosx/memory/swap/used.rb +1 -1
  85. data/lib/facter/facts/macosx/memory/system/available.rb +1 -1
  86. data/lib/facter/facts/macosx/memory/system/available_bytes.rb +1 -1
  87. data/lib/facter/facts/macosx/memory/system/total.rb +1 -1
  88. data/lib/facter/facts/macosx/memory/system/total_bytes.rb +1 -1
  89. data/lib/facter/facts/macosx/memory/system/used.rb +1 -1
  90. data/lib/facter/facts/macosx/processors/speed.rb +1 -1
  91. data/lib/facter/facts/macosx/ssh.rb +1 -1
  92. data/lib/facter/facts/macosx/sshalgorithmkey.rb +1 -1
  93. data/lib/facter/facts/macosx/sshfp_algorithm.rb +1 -1
  94. data/lib/facter/facts/mageia/os/release.rb +36 -0
  95. data/lib/facter/facts/meego/os/release.rb +29 -0
  96. data/lib/facter/facts/oel/os/release.rb +29 -0
  97. data/lib/facter/facts/ol/os/release.rb +29 -0
  98. data/lib/facter/facts/openwrt/os/release.rb +35 -0
  99. data/lib/facter/facts/ovs/os/release.rb +29 -0
  100. data/lib/facter/facts/photon/os/release.rb +45 -0
  101. data/lib/facter/facts/rhel/os/release.rb +1 -8
  102. data/lib/facter/facts/slackware/os/release.rb +35 -0
  103. data/lib/facter/facts/solaris/dhcp_servers.rb +1 -0
  104. data/lib/facter/facts/solaris/disks.rb +1 -1
  105. data/lib/facter/facts/solaris/interfaces.rb +1 -0
  106. data/lib/facter/facts/solaris/is_virtual.rb +2 -2
  107. data/lib/facter/facts/solaris/ldom.rb +31 -4
  108. data/lib/facter/facts/solaris/memory/swap/available.rb +1 -1
  109. data/lib/facter/facts/solaris/memory/swap/available_bytes.rb +1 -1
  110. data/lib/facter/facts/solaris/memory/swap/total.rb +1 -1
  111. data/lib/facter/facts/solaris/memory/swap/total_bytes.rb +1 -1
  112. data/lib/facter/facts/solaris/memory/swap/used.rb +1 -1
  113. data/lib/facter/facts/solaris/memory/system/available.rb +1 -1
  114. data/lib/facter/facts/solaris/memory/system/available_bytes.rb +1 -1
  115. data/lib/facter/facts/solaris/memory/system/total.rb +1 -1
  116. data/lib/facter/facts/solaris/memory/system/total_bytes.rb +1 -1
  117. data/lib/facter/facts/solaris/memory/system/used.rb +1 -1
  118. data/lib/facter/facts/solaris/processors/speed.rb +1 -1
  119. data/lib/facter/facts/solaris/ssh.rb +1 -1
  120. data/lib/facter/facts/solaris/sshalgorithmkey.rb +1 -1
  121. data/lib/facter/facts/solaris/sshfp_algorithm.rb +1 -1
  122. data/lib/facter/facts/solaris/virtual.rb +1 -1
  123. data/lib/facter/facts/windows/dhcp_servers.rb +1 -0
  124. data/lib/facter/facts/windows/interfaces.rb +1 -0
  125. data/lib/facter/facts/windows/memory/system/available.rb +1 -1
  126. data/lib/facter/facts/windows/memory/system/available_bytes.rb +1 -1
  127. data/lib/facter/facts/windows/memory/system/total.rb +1 -1
  128. data/lib/facter/facts/windows/memory/system/total_bytes.rb +1 -1
  129. data/lib/facter/facts/windows/memory/system/used.rb +1 -1
  130. data/lib/facter/facts/windows/networking/fqdn.rb +1 -1
  131. data/lib/facter/facts/windows/os/release.rb +1 -1
  132. data/lib/facter/framework/cli/cli.rb +2 -4
  133. data/lib/facter/framework/config/config_reader.rb +7 -0
  134. data/lib/facter/framework/config/fact_groups.rb +3 -0
  135. data/lib/facter/framework/core/cache_manager.rb +1 -1
  136. data/lib/facter/framework/core/fact_loaders/external_fact_loader.rb +4 -6
  137. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +18 -0
  138. data/lib/facter/framework/core/fact_manager.rb +14 -2
  139. data/lib/facter/framework/core/file_loader.rb +6 -2
  140. data/lib/facter/framework/core/options/option_store.rb +12 -4
  141. data/lib/facter/framework/detector/os_detector.rb +8 -0
  142. data/lib/facter/framework/logging/logger.rb +7 -7
  143. data/lib/facter/models/fact_collection.rb +11 -1
  144. data/lib/facter/models/loaded_fact.rb +2 -1
  145. data/lib/facter/resolvers/aio_agent_version.rb +2 -2
  146. data/lib/facter/resolvers/aix/{architecture_resolver.rb → architecture.rb} +4 -4
  147. data/lib/facter/resolvers/aix/disks.rb +5 -5
  148. data/lib/facter/resolvers/aix/ffi/ffi.rb +63 -0
  149. data/lib/facter/resolvers/aix/ffi/ffi_helper.rb +146 -20
  150. data/lib/facter/resolvers/aix/ffi/structs.rb +69 -0
  151. data/lib/facter/resolvers/aix/{filesystem_resolver.rb → filesystem.rb} +2 -2
  152. data/lib/facter/resolvers/aix/{hardware_resolver.rb → hardware.rb} +3 -3
  153. data/lib/facter/resolvers/aix/{load_averages_resolver.rb → load_averages.rb} +2 -2
  154. data/lib/facter/resolvers/aix/memory.rb +3 -3
  155. data/lib/facter/resolvers/aix/mountpoints.rb +5 -5
  156. data/lib/facter/resolvers/aix/{networking_resolver.rb → networking.rb} +12 -18
  157. data/lib/facter/resolvers/aix/nim.rb +1 -1
  158. data/lib/facter/resolvers/aix/os_level.rb +1 -1
  159. data/lib/facter/resolvers/aix/partitions.rb +6 -6
  160. data/lib/facter/resolvers/aix/processors.rb +4 -4
  161. data/lib/facter/resolvers/aix/serialnumber.rb +2 -2
  162. data/lib/facter/resolvers/{augeas_resolver.rb → augeas.rb} +1 -1
  163. data/lib/facter/resolvers/base_resolver.rb +7 -4
  164. data/lib/facter/resolvers/bsd/processors.rb +1 -1
  165. data/lib/facter/resolvers/cloud.rb +2 -2
  166. data/lib/facter/resolvers/containers.rb +4 -4
  167. data/lib/facter/resolvers/debian_version.rb +2 -2
  168. data/lib/facter/resolvers/{disk_resolver.rb → disk.rb} +3 -3
  169. data/lib/facter/resolvers/{dmi_resolver.rb → dmi.rb} +2 -2
  170. data/lib/facter/resolvers/dmi_decode.rb +1 -1
  171. data/lib/facter/resolvers/ec2.rb +4 -2
  172. data/lib/facter/resolvers/{eos_release_resolver.rb → eos_release.rb} +2 -2
  173. data/lib/facter/resolvers/{facterversion_resolver.rb → facterversion.rb} +1 -1
  174. data/lib/facter/resolvers/{filesystems_resolver.rb → filesystems.rb} +2 -2
  175. data/lib/facter/resolvers/{fips_enabled_resolver.rb → fips_enabled.rb} +2 -2
  176. data/lib/facter/resolvers/freebsd/{dmi_resolver.rb → dmi.rb} +1 -1
  177. data/lib/facter/resolvers/freebsd/{freebsd_version_resolver.rb → freebsd_version.rb} +1 -1
  178. data/lib/facter/resolvers/freebsd/{geom_resolver.rb → geom.rb} +2 -2
  179. data/lib/facter/resolvers/freebsd/processors.rb +1 -1
  180. data/lib/facter/resolvers/freebsd/{swap_memory_resolver.rb → swap_memory.rb} +4 -3
  181. data/lib/facter/resolvers/freebsd/{system_memory_resolver.rb → system_memory.rb} +3 -2
  182. data/lib/facter/resolvers/freebsd/virtual.rb +45 -0
  183. data/lib/facter/resolvers/gce.rb +2 -2
  184. data/lib/facter/resolvers/hostname.rb +92 -0
  185. data/lib/facter/resolvers/{identity_resolver.rb → identity.rb} +1 -1
  186. data/lib/facter/resolvers/linux/docker_uptime.rb +2 -2
  187. data/lib/facter/resolvers/linux/load_averages.rb +2 -2
  188. data/lib/facter/resolvers/load_averages.rb +4 -3
  189. data/lib/facter/resolvers/{lpar_resolver.rb → lpar.rb} +1 -1
  190. data/lib/facter/resolvers/{lsb_release_resolver.rb → lsb_release.rb} +1 -1
  191. data/lib/facter/resolvers/lspci.rb +1 -1
  192. data/lib/facter/resolvers/macosx/{dmi_resolver.rb → dmi.rb} +1 -1
  193. data/lib/facter/resolvers/macosx/{filesystems_resolver.rb → filesystems.rb} +1 -1
  194. data/lib/facter/resolvers/macosx/{load_averages_resolver.rb → load_averages.rb} +1 -1
  195. data/lib/facter/resolvers/macosx/{mountpoints_resolver.rb → mountpoints.rb} +8 -8
  196. data/lib/facter/resolvers/macosx/{processor_resolver.rb → processor.rb} +1 -1
  197. data/lib/facter/resolvers/macosx/{swap_memory_resolver.rb → swap_memory.rb} +1 -1
  198. data/lib/facter/resolvers/macosx/{system_memory_resolver.rb → system_memory.rb} +1 -1
  199. data/lib/facter/resolvers/macosx/{system_profiler_resolver.rb → system_profiler.rb} +4 -4
  200. data/lib/facter/resolvers/{memory_resolver.rb → memory.rb} +2 -2
  201. data/lib/facter/resolvers/{mountpoints_resolver.rb → mountpoints.rb} +9 -9
  202. data/lib/facter/resolvers/{networking_resolver.rb → networking.rb} +9 -6
  203. data/lib/facter/resolvers/networking_linux.rb +296 -0
  204. data/lib/facter/resolvers/open_vz.rb +2 -4
  205. data/lib/facter/resolvers/{os_release_resolver.rb → os_release.rb} +2 -2
  206. data/lib/facter/resolvers/partitions.rb +6 -6
  207. data/lib/facter/resolvers/{path_resolver.rb → path.rb} +1 -1
  208. data/lib/facter/resolvers/{processors_resolver.rb → processors.rb} +3 -3
  209. data/lib/facter/resolvers/{redhat_release_resolver.rb → redhat_release.rb} +2 -2
  210. data/lib/facter/resolvers/release_from_first_line.rb +41 -0
  211. data/lib/facter/resolvers/{ruby_resolver.rb → ruby.rb} +1 -1
  212. data/lib/facter/resolvers/{selinux_resolver.rb → selinux.rb} +4 -4
  213. data/lib/facter/resolvers/solaris/disks.rb +2 -2
  214. data/lib/facter/resolvers/solaris/dmi.rb +1 -1
  215. data/lib/facter/resolvers/solaris/dmi_sparc.rb +1 -1
  216. data/lib/facter/resolvers/solaris/filesystems.rb +1 -1
  217. data/lib/facter/resolvers/solaris/ipaddress.rb +1 -1
  218. data/lib/facter/resolvers/solaris/ldom.rb +1 -1
  219. data/lib/facter/resolvers/solaris/memory.rb +3 -3
  220. data/lib/facter/resolvers/solaris/mountpoints.rb +12 -11
  221. data/lib/facter/resolvers/solaris/networking.rb +50 -42
  222. data/lib/facter/resolvers/solaris/os_release.rb +2 -2
  223. data/lib/facter/resolvers/solaris/processors.rb +1 -1
  224. data/lib/facter/resolvers/solaris/zone.rb +1 -1
  225. data/lib/facter/resolvers/solaris/zone_name.rb +1 -1
  226. data/lib/facter/resolvers/specific_release_file.rb +35 -0
  227. data/lib/facter/resolvers/{ssh_resolver.rb → ssh.rb} +5 -4
  228. data/lib/facter/resolvers/{suse_release_resolver.rb → suse_release.rb} +2 -2
  229. data/lib/facter/resolvers/{sw_vers_resolver.rb → sw_vers.rb} +1 -1
  230. data/lib/facter/resolvers/{timezone_resolver.rb → timezone.rb} +1 -1
  231. data/lib/facter/resolvers/{uname_resolver.rb → uname.rb} +1 -1
  232. data/lib/facter/resolvers/{uptime_resolver.rb → uptime.rb} +3 -3
  233. data/lib/facter/resolvers/virt_what.rb +1 -1
  234. data/lib/facter/resolvers/vmware.rb +1 -1
  235. data/lib/facter/resolvers/windows/aio_agent_version.rb +2 -2
  236. data/lib/facter/resolvers/windows/{dmi_bios_resolver.rb → dmi_bios.rb} +2 -2
  237. data/lib/facter/resolvers/windows/{dmi_computersystem_resolver.rb → dmi_computersystem.rb} +2 -2
  238. data/lib/facter/resolvers/windows/ffi/network_utils.rb +1 -2
  239. data/lib/facter/resolvers/windows/{fips_resolver.rb → fips.rb} +1 -1
  240. data/lib/facter/resolvers/windows/{hardware_architecture_resolver.rb → hardware_architecture.rb} +1 -1
  241. data/lib/facter/resolvers/windows/{identity_resolver.rb → identity.rb} +1 -1
  242. data/lib/facter/resolvers/windows/{kernel_resolver.rb → kernel.rb} +1 -1
  243. data/lib/facter/resolvers/windows/{memory_resolver.rb → memory.rb} +5 -1
  244. data/lib/facter/resolvers/windows/{netkvm_resolver.rb → netkvm.rb} +1 -1
  245. data/lib/facter/resolvers/windows/{networking_resolver.rb → networking.rb} +22 -5
  246. data/lib/facter/resolvers/windows/{processors_resolver.rb → processors.rb} +2 -2
  247. data/lib/facter/resolvers/windows/{product_release_resolver.rb → product_release.rb} +1 -1
  248. data/lib/facter/resolvers/windows/ssh.rb +3 -3
  249. data/lib/facter/resolvers/windows/{system32_resolver.rb → system32.rb} +1 -1
  250. data/lib/facter/resolvers/windows/{uptime_resolver.rb → uptime.rb} +2 -2
  251. data/lib/facter/resolvers/windows/{virtualization_resolver.rb → virtualization.rb} +2 -2
  252. data/lib/facter/resolvers/windows/{win_os_description_resolver.rb → win_os_description.rb} +2 -2
  253. data/lib/facter/resolvers/{wpar_resolver.rb → wpar.rb} +1 -1
  254. data/lib/facter/resolvers/xen.rb +2 -2
  255. data/lib/facter/resolvers/zfs.rb +1 -1
  256. data/lib/facter/resolvers/zpool.rb +1 -1
  257. data/lib/facter/util/aix/info_extractor.rb +24 -0
  258. data/lib/facter/util/aix/odm_query.rb +46 -0
  259. data/lib/facter/util/api_debugger.rb +33 -29
  260. data/lib/facter/util/facts/facts_utils.rb +47 -0
  261. data/lib/facter/util/facts/unit_converter.rb +68 -0
  262. data/lib/facter/util/facts/uptime_parser.rb +128 -0
  263. data/lib/facter/util/facts/virtual_detector.rb +90 -0
  264. data/lib/facter/util/facts/windows_release_finder.rb +55 -0
  265. data/lib/facter/{resolvers/macosx/utils → util/macosx}/system_profile_executor.rb +1 -1
  266. data/lib/facter/util/resolvers/aws_token.rb +37 -0
  267. data/lib/facter/{resolvers/utils → util/resolvers}/ffi/load_averages.rb +2 -2
  268. data/lib/facter/util/resolvers/filesystem_helper.rb +47 -0
  269. data/lib/facter/util/resolvers/fingerprint.rb +15 -0
  270. data/lib/facter/{resolvers/utils → util/resolvers}/http.rb +17 -10
  271. data/lib/facter/util/resolvers/networking/dhcp.rb +21 -0
  272. data/lib/facter/util/resolvers/networking/networking.rb +109 -0
  273. data/lib/facter/util/resolvers/networking/primary_interface.rb +82 -0
  274. data/lib/facter/util/resolvers/ssh.rb +17 -0
  275. data/lib/facter/util/resolvers/ssh_helper.rb +31 -0
  276. data/lib/facter/{resolvers/utils → util/resolvers}/uptime_helper.rb +2 -2
  277. data/lib/facter/{framework/utils → util}/utils.rb +0 -4
  278. data/lib/facter/util/windows/win32ole.rb +30 -0
  279. data/lib/facter/version.rb +1 -1
  280. metadata +123 -116
  281. data/lib/facter/facts/aix/puppet_version.rb +0 -15
  282. data/lib/facter/facts/freebsd/puppet_version.rb +0 -15
  283. data/lib/facter/facts/linux/puppet_version.rb +0 -15
  284. data/lib/facter/facts/macosx/puppet_version.rb +0 -15
  285. data/lib/facter/facts/solaris/puppet_version.rb +0 -15
  286. data/lib/facter/facts/windows/puppet_version.rb +0 -15
  287. data/lib/facter/facts_utils/facts_utils.rb +0 -12
  288. data/lib/facter/facts_utils/unit_converter.rb +0 -59
  289. data/lib/facter/facts_utils/uptime_parser.rb +0 -124
  290. data/lib/facter/facts_utils/virtual_detector.rb +0 -78
  291. data/lib/facter/facts_utils/windows_release_finder.rb +0 -51
  292. data/lib/facter/resolvers/aix/utils/info_extractor.rb +0 -20
  293. data/lib/facter/resolvers/aix/utils/odm_query.rb +0 -42
  294. data/lib/facter/resolvers/hostname_resolver.rb +0 -45
  295. data/lib/facter/resolvers/networking_linux_resolver.rb +0 -160
  296. data/lib/facter/resolvers/puppet_version_resolver.rb +0 -26
  297. data/lib/facter/resolvers/utils/filesystem_helper.rb +0 -43
  298. data/lib/facter/resolvers/utils/fingerprint.rb +0 -11
  299. data/lib/facter/resolvers/utils/networking.rb +0 -88
  300. data/lib/facter/resolvers/utils/ssh.rb +0 -13
  301. data/lib/facter/resolvers/utils/ssh_helper.rb +0 -27
  302. data/lib/facter/resolvers/windows/utils/win32ole.rb +0 -24
@@ -8,7 +8,7 @@ module Facter
8
8
  class << self
9
9
  private
10
10
 
11
- def post_resolve(fact_name)
11
+ def post_resolve(fact_name, _options)
12
12
  @fact_list.fetch(fact_name) { read_lpar(fact_name) }
13
13
  end
14
14
 
@@ -14,7 +14,7 @@ module Facter
14
14
  class << self
15
15
  private
16
16
 
17
- def post_resolve(fact_name)
17
+ def post_resolve(fact_name, _options)
18
18
  @fact_list.fetch(fact_name) { retrieve_facts(fact_name) }
19
19
  end
20
20
 
@@ -13,7 +13,7 @@ module Facter
13
13
  class << self
14
14
  private
15
15
 
16
- def post_resolve(fact_name)
16
+ def post_resolve(fact_name, _options)
17
17
  @fact_list.fetch(fact_name) { lspci_command(fact_name) }
18
18
  end
19
19
 
@@ -11,7 +11,7 @@ module Facter
11
11
 
12
12
  private
13
13
 
14
- def post_resolve(fact_name)
14
+ def post_resolve(fact_name, _options)
15
15
  @fact_list.fetch(fact_name) { read_facts }
16
16
  end
17
17
 
@@ -10,7 +10,7 @@ module Facter
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { read_filesystems(fact_name) }
15
15
  end
16
16
 
@@ -9,7 +9,7 @@ module Facter
9
9
  class << self
10
10
  private
11
11
 
12
- def post_resolve(fact_name)
12
+ def post_resolve(fact_name, _options)
13
13
  @fact_list.fetch(fact_name) { read_load_averages_file(fact_name) }
14
14
  end
15
15
 
@@ -4,20 +4,20 @@ module Facter
4
4
  module Resolvers
5
5
  module Macosx
6
6
  class Mountpoints < BaseResolver
7
- include Facter::FilesystemHelper
7
+ include Facter::Util::Resolvers::FilesystemHelper
8
8
  init_resolver
9
9
 
10
10
  class << self
11
11
  private
12
12
 
13
- def post_resolve(fact_name)
13
+ def post_resolve(fact_name, _options)
14
14
  @fact_list.fetch(fact_name) { read_mounts }
15
15
  end
16
16
 
17
17
  def read_mounts
18
18
  mounts = {}
19
19
 
20
- FilesystemHelper.read_mountpoints.each do |fs|
20
+ Facter::Util::Resolvers::FilesystemHelper.read_mountpoints.each do |fs|
21
21
  device = fs.name
22
22
  filesystem = fs.mount_type
23
23
  path = fs.mount_point
@@ -35,7 +35,7 @@ module Facter
35
35
 
36
36
  def read_stats(path)
37
37
  begin
38
- stats = FilesystemHelper.read_mountpoint_stats(path)
38
+ stats = Facter::Util::Resolvers::FilesystemHelper.read_mountpoint_stats(path)
39
39
  size_bytes = stats.bytes_total
40
40
  available_bytes = stats.bytes_available
41
41
  used_bytes = size_bytes - available_bytes
@@ -47,10 +47,10 @@ module Facter
47
47
  size_bytes: size_bytes,
48
48
  used_bytes: used_bytes,
49
49
  available_bytes: available_bytes,
50
- capacity: FilesystemHelper.compute_capacity(used_bytes, size_bytes),
51
- size: Facter::FactsUtils::UnitConverter.bytes_to_human_readable(size_bytes),
52
- available: Facter::FactsUtils::UnitConverter.bytes_to_human_readable(available_bytes),
53
- used: Facter::FactsUtils::UnitConverter.bytes_to_human_readable(used_bytes)
50
+ capacity: Facter::Util::Resolvers::FilesystemHelper.compute_capacity(used_bytes, size_bytes),
51
+ size: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(size_bytes),
52
+ available: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(available_bytes),
53
+ used: Facter::Util::Facts::UnitConverter.bytes_to_human_readable(used_bytes)
54
54
  }
55
55
  end
56
56
  end
@@ -18,7 +18,7 @@ module Facter
18
18
 
19
19
  private
20
20
 
21
- def post_resolve(fact_name)
21
+ def post_resolve(fact_name, _options)
22
22
  @fact_list.fetch(fact_name) { read_processor_data(fact_name) }
23
23
  end
24
24
 
@@ -9,7 +9,7 @@ module Facter
9
9
  class << self
10
10
  private
11
11
 
12
- def post_resolve(fact_name)
12
+ def post_resolve(fact_name, _options)
13
13
  @fact_list.fetch(fact_name) { read_swap_memory(fact_name) }
14
14
  end
15
15
 
@@ -9,7 +9,7 @@ module Facter
9
9
  class << self
10
10
  private
11
11
 
12
- def post_resolve(fact_name)
12
+ def post_resolve(fact_name, _options)
13
13
  @fact_list.fetch(fact_name) { calculate_system_memory(fact_name) }
14
14
  end
15
15
 
@@ -20,18 +20,18 @@ module Facter
20
20
  class << self
21
21
  private
22
22
 
23
- def post_resolve(fact_name)
23
+ def post_resolve(fact_name, _options)
24
24
  @fact_list.fetch(fact_name) { retrieve_system_profiler(fact_name) }
25
25
  end
26
26
 
27
27
  def retrieve_system_profiler(fact_name)
28
28
  case fact_name
29
29
  when *SP_HARDWARE_DATA_TYPE
30
- @fact_list.merge!(SystemProfileExecutor.execute('SPHardwareDataType'))
30
+ @fact_list.merge!(Facter::Util::Macosx::SystemProfileExecutor.execute('SPHardwareDataType'))
31
31
  when *SP_SOFTWARE_DATA_TYPE
32
- @fact_list.merge!(SystemProfileExecutor.execute('SPSoftwareDataType'))
32
+ @fact_list.merge!(Facter::Util::Macosx::SystemProfileExecutor.execute('SPSoftwareDataType'))
33
33
  when *SP_ETHERNET_DATA_TYPE
34
- @fact_list.merge!(SystemProfileExecutor.execute('SPEthernetDataType'))
34
+ @fact_list.merge!(Facter::Util::Macosx::SystemProfileExecutor.execute('SPEthernetDataType'))
35
35
  end
36
36
 
37
37
  @fact_list[fact_name]
@@ -11,12 +11,12 @@ module Facter
11
11
  class << self
12
12
  private
13
13
 
14
- def post_resolve(fact_name)
14
+ def post_resolve(fact_name, _options)
15
15
  @fact_list.fetch(fact_name) { read_meminfo_file(fact_name) }
16
16
  end
17
17
 
18
18
  def read_meminfo_file(fact_name)
19
- meminfo_output = Util::FileHelper.safe_read('/proc/meminfo', nil)
19
+ meminfo_output = Facter::Util::FileHelper.safe_read('/proc/meminfo', nil)
20
20
  return unless meminfo_output
21
21
 
22
22
  read_system(meminfo_output)
@@ -3,7 +3,7 @@
3
3
  module Facter
4
4
  module Resolvers
5
5
  class Mountpoints < BaseResolver
6
- include Facter::FilesystemHelper
6
+ include Facter::Util::Resolvers::FilesystemHelper
7
7
 
8
8
  init_resolver
9
9
 
@@ -12,12 +12,12 @@ module Facter
12
12
  class << self
13
13
  private
14
14
 
15
- def post_resolve(fact_name)
15
+ def post_resolve(fact_name, _options)
16
16
  @fact_list.fetch(fact_name) { read_mounts(fact_name) }
17
17
  end
18
18
 
19
19
  def root_device
20
- cmdline = Util::FileHelper.safe_read('/proc/cmdline')
20
+ cmdline = Facter::Util::FileHelper.safe_read('/proc/cmdline')
21
21
  match = cmdline.match(/root=([^\s]+)/)
22
22
  root = match&.captures&.first
23
23
 
@@ -45,7 +45,7 @@ module Facter
45
45
 
46
46
  def read_mounts(fact_name)
47
47
  mounts = []
48
- FilesystemHelper.read_mountpoints.each do |file_system|
48
+ Facter::Util::Resolvers::FilesystemHelper.read_mountpoints.each do |file_system|
49
49
  mount = {}
50
50
  get_mount_data(file_system, mount)
51
51
 
@@ -67,16 +67,16 @@ module Facter
67
67
  end
68
68
 
69
69
  def get_mount_sizes(mount)
70
- stats = FilesystemHelper.read_mountpoint_stats(mount[:path])
70
+ stats = Facter::Util::Resolvers::FilesystemHelper.read_mountpoint_stats(mount[:path])
71
71
 
72
72
  get_bytes_data(mount, stats)
73
73
 
74
74
  total_bytes = mount[:used_bytes] + mount[:available_bytes]
75
- mount[:capacity] = FilesystemHelper.compute_capacity(mount[:used_bytes], total_bytes)
75
+ mount[:capacity] = Facter::Util::Resolvers::FilesystemHelper.compute_capacity(mount[:used_bytes], total_bytes)
76
76
 
77
- mount[:size] = Facter::FactsUtils::UnitConverter.bytes_to_human_readable(mount[:size_bytes])
78
- mount[:available] = Facter::FactsUtils::UnitConverter.bytes_to_human_readable(mount[:available_bytes])
79
- mount[:used] = Facter::FactsUtils::UnitConverter.bytes_to_human_readable(mount[:used_bytes])
77
+ mount[:size] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(mount[:size_bytes])
78
+ mount[:available] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(mount[:available_bytes])
79
+ mount[:used] = Facter::Util::Facts::UnitConverter.bytes_to_human_readable(mount[:used_bytes])
80
80
  end
81
81
 
82
82
  def get_bytes_data(mount, stats)
@@ -8,21 +8,24 @@ module Facter
8
8
  class << self
9
9
  private
10
10
 
11
- def post_resolve(fact_name)
11
+ def post_resolve(fact_name, _options)
12
12
  @fact_list.fetch(fact_name) { read_facts(fact_name) }
13
13
  end
14
14
 
15
15
  def read_facts(fact_name)
16
- primary_interface
17
16
  interfaces_data
18
- ::Resolvers::Utils::Networking.expand_main_bindings(@fact_list)
17
+ primary_interface
18
+ Facter::Util::Resolvers::Networking.expand_main_bindings(@fact_list)
19
19
  @fact_list[fact_name]
20
20
  end
21
21
 
22
22
  def primary_interface
23
- result = Facter::Core::Execution.execute('route -n get default', logger: log)
23
+ primary_helper = Facter::Util::Resolvers::Networking::PrimaryInterface
24
+ primary_interface ||= primary_helper.read_from_route
25
+
26
+ primary_interface ||= primary_helper.find_in_interfaces(@fact_list[:interfaces])
24
27
 
25
- @fact_list[:primary_interface] = result.match(/interface: (.+)/)&.captures&.first
28
+ @fact_list[:primary_interface] = primary_interface
26
29
  end
27
30
 
28
31
  def interfaces_data
@@ -95,7 +98,7 @@ module Facter
95
98
  def create_bindings(ips, masks)
96
99
  bindings = []
97
100
  ips.zip(masks).each do |ip, mask|
98
- bindings << ::Resolvers::Utils::Networking.build_binding(ip, mask)
101
+ bindings << Facter::Util::Resolvers::Networking.build_binding(ip, mask)
99
102
  end
100
103
  bindings
101
104
  end
@@ -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, _options)
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