facter 4.0.47 → 4.0.52

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 (240) hide show
  1. checksums.yaml +4 -4
  2. data/lib/docs/generate_cli.rb +7 -0
  3. data/lib/facter.rb +76 -43
  4. data/lib/facter/config.rb +21 -9
  5. data/lib/facter/custom_facts/core/aggregate.rb +16 -0
  6. data/lib/facter/custom_facts/core/execution/base.rb +3 -2
  7. data/lib/facter/custom_facts/core/execution/popen3.rb +47 -0
  8. data/lib/facter/custom_facts/core/resolvable.rb +11 -0
  9. data/lib/facter/custom_facts/util/fact.rb +22 -3
  10. data/lib/facter/custom_facts/util/resolution.rb +3 -1
  11. data/lib/facter/facts/aix/disks.rb +1 -1
  12. data/lib/facter/facts/aix/ssh.rb +1 -1
  13. data/lib/facter/facts/aix/sshalgorithmkey.rb +1 -1
  14. data/lib/facter/facts/aix/sshfp_algorithm.rb +1 -1
  15. data/lib/facter/facts/alpine/os/release.rb +29 -0
  16. data/lib/facter/facts/amzn/lsbdistcodename.rb +16 -0
  17. data/lib/facter/facts/amzn/lsbdistdescription.rb +16 -0
  18. data/lib/facter/facts/amzn/lsbdistid.rb +16 -0
  19. data/lib/facter/facts/amzn/os/distro/codename.rb +24 -0
  20. data/lib/facter/facts/amzn/os/distro/description.rb +21 -0
  21. data/lib/facter/facts/amzn/os/distro/id.rb +21 -0
  22. data/lib/facter/facts/amzn/os/distro/release.rb +32 -0
  23. data/lib/facter/facts/amzn/os/release.rb +29 -0
  24. data/lib/facter/facts/devuan/os/distro/release.rb +36 -0
  25. data/lib/facter/facts/devuan/os/release.rb +29 -0
  26. data/lib/facter/facts/freebsd/ssh.rb +1 -1
  27. data/lib/facter/facts/freebsd/sshalgorithmkey.rb +1 -1
  28. data/lib/facter/facts/freebsd/sshfp_algorithm.rb +1 -1
  29. data/lib/facter/facts/gentoo/os/release.rb +29 -0
  30. data/lib/facter/facts/linux/az_metadata.rb +27 -0
  31. data/lib/facter/facts/linux/cloud/provider.rb +17 -0
  32. data/lib/facter/facts/linux/dhcp_servers.rb +2 -2
  33. data/lib/facter/facts/linux/disks.rb +1 -1
  34. data/lib/facter/facts/linux/interfaces.rb +1 -1
  35. data/lib/facter/facts/linux/ipaddress6_interfaces.rb +1 -1
  36. data/lib/facter/facts/linux/ipaddress_interfaces.rb +1 -1
  37. data/lib/facter/facts/linux/macaddress_interfaces.rb +1 -1
  38. data/lib/facter/facts/linux/mtu_interfaces.rb +1 -1
  39. data/lib/facter/facts/linux/netmask6_interfaces.rb +1 -1
  40. data/lib/facter/facts/linux/netmask_interfaces.rb +1 -1
  41. data/lib/facter/facts/linux/network6_interfaces.rb +1 -1
  42. data/lib/facter/facts/linux/network_interfaces.rb +1 -1
  43. data/lib/facter/facts/linux/networking/dhcp.rb +1 -1
  44. data/lib/facter/facts/linux/networking/domain.rb +1 -1
  45. data/lib/facter/facts/linux/networking/fqdn.rb +1 -1
  46. data/lib/facter/facts/linux/networking/hostname.rb +1 -1
  47. data/lib/facter/facts/linux/networking/interfaces.rb +1 -1
  48. data/lib/facter/facts/linux/networking/ip.rb +1 -1
  49. data/lib/facter/facts/linux/networking/ip6.rb +1 -1
  50. data/lib/facter/facts/linux/networking/mac.rb +1 -1
  51. data/lib/facter/facts/linux/networking/mtu.rb +1 -1
  52. data/lib/facter/facts/linux/networking/netmask.rb +1 -1
  53. data/lib/facter/facts/linux/networking/netmask6.rb +1 -1
  54. data/lib/facter/facts/linux/networking/network.rb +1 -1
  55. data/lib/facter/facts/linux/networking/network6.rb +1 -1
  56. data/lib/facter/facts/linux/networking/primary.rb +1 -1
  57. data/lib/facter/facts/linux/networking/scope6.rb +1 -1
  58. data/lib/facter/facts/linux/os/family.rb +4 -2
  59. data/lib/facter/facts/linux/scope6_interfaces.rb +1 -1
  60. data/lib/facter/facts/linux/ssh.rb +1 -1
  61. data/lib/facter/facts/linux/sshalgorithmkey.rb +1 -1
  62. data/lib/facter/facts/linux/sshfp_algorithm.rb +1 -1
  63. data/lib/facter/facts/linuxmint/os/name.rb +18 -0
  64. data/lib/facter/facts/linuxmint/os/release.rb +35 -0
  65. data/lib/facter/facts/macosx/ssh.rb +1 -1
  66. data/lib/facter/facts/macosx/sshalgorithmkey.rb +1 -1
  67. data/lib/facter/facts/macosx/sshfp_algorithm.rb +1 -1
  68. data/lib/facter/facts/mageia/os/release.rb +36 -0
  69. data/lib/facter/facts/meego/os/release.rb +29 -0
  70. data/lib/facter/facts/oel/os/release.rb +29 -0
  71. data/lib/facter/facts/ol/os/release.rb +29 -0
  72. data/lib/facter/facts/openwrt/os/release.rb +35 -0
  73. data/lib/facter/facts/ovs/os/release.rb +29 -0
  74. data/lib/facter/facts/photon/os/release.rb +45 -0
  75. data/lib/facter/facts/rhel/lsbdistcodename.rb +16 -0
  76. data/lib/facter/facts/rhel/lsbdistdescription.rb +16 -0
  77. data/lib/facter/facts/rhel/lsbdistid.rb +16 -0
  78. data/lib/facter/facts/rhel/os/distro/codename.rb +2 -4
  79. data/lib/facter/facts/rhel/os/distro/description.rb +2 -4
  80. data/lib/facter/facts/rhel/os/distro/id.rb +2 -4
  81. data/lib/facter/facts/rhel/os/distro/release.rb +13 -12
  82. data/lib/facter/facts/rhel/os/release.rb +1 -8
  83. data/lib/facter/facts/slackware/os/release.rb +35 -0
  84. data/lib/facter/facts/sles/lsbdistcodename.rb +16 -0
  85. data/lib/facter/facts/sles/lsbdistdescription.rb +16 -0
  86. data/lib/facter/facts/sles/lsbdistid.rb +16 -0
  87. data/lib/facter/facts/sles/os/distro/codename.rb +3 -4
  88. data/lib/facter/facts/sles/os/distro/description.rb +2 -5
  89. data/lib/facter/facts/sles/os/distro/id.rb +6 -5
  90. data/lib/facter/facts/sles/os/distro/release.rb +17 -12
  91. data/lib/facter/facts/solaris/disks.rb +1 -1
  92. data/lib/facter/facts/solaris/ssh.rb +1 -1
  93. data/lib/facter/facts/solaris/sshalgorithmkey.rb +1 -1
  94. data/lib/facter/facts/solaris/sshfp_algorithm.rb +1 -1
  95. data/lib/facter/facts/ubuntu/lsbdistrelease.rb +2 -2
  96. data/lib/facter/facts/windows/az_metadata.rb +27 -0
  97. data/lib/facter/facts/windows/cloud/provider.rb +17 -0
  98. data/lib/facter/facts/windows/networking/fqdn.rb +1 -1
  99. data/lib/facter/framework/cli/cli.rb +6 -8
  100. data/lib/facter/framework/config/config_reader.rb +9 -0
  101. data/lib/facter/framework/config/fact_groups.rb +28 -2
  102. data/lib/facter/framework/core/cache_manager.rb +5 -1
  103. data/lib/facter/framework/core/fact_filter.rb +3 -3
  104. data/lib/facter/framework/core/fact_loaders/external_fact_loader.rb +0 -4
  105. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +2 -1
  106. data/lib/facter/framework/core/fact_manager.rb +5 -3
  107. data/lib/facter/framework/core/options.rb +1 -2
  108. data/lib/facter/framework/core/options/option_store.rb +11 -5
  109. data/lib/facter/framework/detector/os_detector.rb +8 -0
  110. data/lib/facter/framework/logging/logger.rb +4 -4
  111. data/lib/facter/framework/parsers/query_parser.rb +13 -6
  112. data/lib/facter/resolvers/aio_agent_version.rb +1 -1
  113. data/lib/facter/resolvers/aix/{architecture_resolver.rb → architecture.rb} +1 -1
  114. data/lib/facter/resolvers/aix/disks.rb +1 -1
  115. data/lib/facter/resolvers/aix/ffi/ffi.rb +63 -0
  116. data/lib/facter/resolvers/aix/ffi/ffi_helper.rb +146 -20
  117. data/lib/facter/resolvers/aix/ffi/structs.rb +69 -0
  118. data/lib/facter/resolvers/aix/{filesystem_resolver.rb → filesystem.rb} +1 -1
  119. data/lib/facter/resolvers/aix/{hardware_resolver.rb → hardware.rb} +1 -1
  120. data/lib/facter/resolvers/aix/{load_averages_resolver.rb → load_averages.rb} +2 -2
  121. data/lib/facter/resolvers/aix/memory.rb +1 -1
  122. data/lib/facter/resolvers/aix/mountpoints.rb +1 -1
  123. data/lib/facter/resolvers/aix/{networking_resolver.rb → networking.rb} +9 -16
  124. data/lib/facter/resolvers/aix/nim.rb +1 -1
  125. data/lib/facter/resolvers/aix/os_level.rb +1 -1
  126. data/lib/facter/resolvers/aix/partitions.rb +1 -1
  127. data/lib/facter/resolvers/aix/processors.rb +1 -1
  128. data/lib/facter/resolvers/aix/serialnumber.rb +1 -1
  129. data/lib/facter/resolvers/{augeas_resolver.rb → augeas.rb} +1 -1
  130. data/lib/facter/resolvers/az.rb +39 -0
  131. data/lib/facter/resolvers/base_resolver.rb +4 -4
  132. data/lib/facter/resolvers/bsd/processors.rb +1 -1
  133. data/lib/facter/resolvers/containers.rb +1 -1
  134. data/lib/facter/resolvers/debian_version.rb +1 -1
  135. data/lib/facter/resolvers/{disk_resolver.rb → disk.rb} +1 -1
  136. data/lib/facter/resolvers/{dmi_resolver.rb → dmi.rb} +1 -1
  137. data/lib/facter/resolvers/dmi_decode.rb +1 -1
  138. data/lib/facter/resolvers/ec2.rb +1 -1
  139. data/lib/facter/resolvers/{eos_release_resolver.rb → eos_release.rb} +1 -1
  140. data/lib/facter/resolvers/{facterversion_resolver.rb → facterversion.rb} +1 -1
  141. data/lib/facter/resolvers/{filesystems_resolver.rb → filesystems.rb} +1 -1
  142. data/lib/facter/resolvers/{fips_enabled_resolver.rb → fips_enabled.rb} +1 -1
  143. data/lib/facter/resolvers/freebsd/{dmi_resolver.rb → dmi.rb} +1 -1
  144. data/lib/facter/resolvers/freebsd/{freebsd_version_resolver.rb → freebsd_version.rb} +1 -1
  145. data/lib/facter/resolvers/freebsd/{geom_resolver.rb → geom.rb} +1 -1
  146. data/lib/facter/resolvers/freebsd/processors.rb +1 -1
  147. data/lib/facter/resolvers/freebsd/{swap_memory_resolver.rb → swap_memory.rb} +1 -1
  148. data/lib/facter/resolvers/freebsd/{system_memory_resolver.rb → system_memory.rb} +1 -1
  149. data/lib/facter/resolvers/freebsd/{virtual_resolver.rb → virtual.rb} +1 -1
  150. data/lib/facter/resolvers/gce.rb +1 -1
  151. data/lib/facter/resolvers/{hostname_resolver.rb → hostname.rb} +1 -1
  152. data/lib/facter/resolvers/{identity_resolver.rb → identity.rb} +1 -1
  153. data/lib/facter/resolvers/linux/docker_uptime.rb +1 -1
  154. data/lib/facter/resolvers/linux/hostname.rb +115 -0
  155. data/lib/facter/resolvers/linux/load_averages.rb +1 -1
  156. data/lib/facter/resolvers/linux/networking.rb +106 -0
  157. data/lib/facter/resolvers/load_averages.rb +1 -1
  158. data/lib/facter/resolvers/{lpar_resolver.rb → lpar.rb} +1 -1
  159. data/lib/facter/resolvers/{lsb_release_resolver.rb → lsb_release.rb} +1 -1
  160. data/lib/facter/resolvers/lspci.rb +1 -1
  161. data/lib/facter/resolvers/macosx/{dmi_resolver.rb → dmi.rb} +1 -1
  162. data/lib/facter/resolvers/macosx/{filesystems_resolver.rb → filesystems.rb} +1 -1
  163. data/lib/facter/resolvers/macosx/{load_averages_resolver.rb → load_averages.rb} +1 -1
  164. data/lib/facter/resolvers/macosx/{mountpoints_resolver.rb → mountpoints.rb} +1 -1
  165. data/lib/facter/resolvers/macosx/{processor_resolver.rb → processor.rb} +1 -1
  166. data/lib/facter/resolvers/macosx/{swap_memory_resolver.rb → swap_memory.rb} +1 -1
  167. data/lib/facter/resolvers/macosx/{system_memory_resolver.rb → system_memory.rb} +1 -1
  168. data/lib/facter/resolvers/macosx/{system_profiler_resolver.rb → system_profiler.rb} +1 -1
  169. data/lib/facter/resolvers/{memory_resolver.rb → memory.rb} +1 -1
  170. data/lib/facter/resolvers/{mountpoints_resolver.rb → mountpoints.rb} +1 -1
  171. data/lib/facter/resolvers/{networking_resolver.rb → networking.rb} +1 -1
  172. data/lib/facter/resolvers/open_vz.rb +1 -1
  173. data/lib/facter/resolvers/{os_release_resolver.rb → os_release.rb} +1 -1
  174. data/lib/facter/resolvers/partitions.rb +1 -1
  175. data/lib/facter/resolvers/{path_resolver.rb → path.rb} +1 -1
  176. data/lib/facter/resolvers/{processors_resolver.rb → processors.rb} +1 -1
  177. data/lib/facter/resolvers/redhat_release.rb +71 -0
  178. data/lib/facter/resolvers/release_from_first_line.rb +41 -0
  179. data/lib/facter/resolvers/{ruby_resolver.rb → ruby.rb} +1 -1
  180. data/lib/facter/resolvers/{selinux_resolver.rb → selinux.rb} +1 -1
  181. data/lib/facter/resolvers/solaris/disks.rb +1 -1
  182. data/lib/facter/resolvers/solaris/dmi.rb +1 -1
  183. data/lib/facter/resolvers/solaris/dmi_sparc.rb +1 -1
  184. data/lib/facter/resolvers/solaris/ffi/functions.rb +1 -1
  185. data/lib/facter/resolvers/solaris/filesystems.rb +1 -1
  186. data/lib/facter/resolvers/solaris/ipaddress.rb +1 -1
  187. data/lib/facter/resolvers/solaris/ldom.rb +1 -1
  188. data/lib/facter/resolvers/solaris/memory.rb +1 -1
  189. data/lib/facter/resolvers/solaris/mountpoints.rb +1 -1
  190. data/lib/facter/resolvers/solaris/networking.rb +1 -1
  191. data/lib/facter/resolvers/solaris/os_release.rb +1 -1
  192. data/lib/facter/resolvers/solaris/processors.rb +1 -1
  193. data/lib/facter/resolvers/solaris/zone.rb +1 -1
  194. data/lib/facter/resolvers/solaris/zone_name.rb +1 -1
  195. data/lib/facter/resolvers/specific_release_file.rb +35 -0
  196. data/lib/facter/resolvers/{ssh_resolver.rb → ssh.rb} +2 -2
  197. data/lib/facter/resolvers/{suse_release_resolver.rb → suse_release.rb} +1 -1
  198. data/lib/facter/resolvers/{sw_vers_resolver.rb → sw_vers.rb} +1 -1
  199. data/lib/facter/resolvers/{timezone_resolver.rb → timezone.rb} +1 -1
  200. data/lib/facter/resolvers/{uname_resolver.rb → uname.rb} +1 -1
  201. data/lib/facter/resolvers/{uptime_resolver.rb → uptime.rb} +1 -1
  202. data/lib/facter/resolvers/virt_what.rb +1 -1
  203. data/lib/facter/resolvers/vmware.rb +1 -1
  204. data/lib/facter/resolvers/windows/aio_agent_version.rb +1 -1
  205. data/lib/facter/resolvers/windows/{dmi_bios_resolver.rb → dmi_bios.rb} +1 -1
  206. data/lib/facter/resolvers/windows/{dmi_computersystem_resolver.rb → dmi_computersystem.rb} +1 -1
  207. data/lib/facter/resolvers/windows/ffi/network_utils.rb +1 -2
  208. data/lib/facter/resolvers/windows/{fips_resolver.rb → fips.rb} +1 -1
  209. data/lib/facter/resolvers/windows/{hardware_architecture_resolver.rb → hardware_architecture.rb} +1 -1
  210. data/lib/facter/resolvers/windows/{identity_resolver.rb → identity.rb} +1 -1
  211. data/lib/facter/resolvers/windows/{kernel_resolver.rb → kernel.rb} +1 -1
  212. data/lib/facter/resolvers/windows/{memory_resolver.rb → memory.rb} +1 -1
  213. data/lib/facter/resolvers/windows/{netkvm_resolver.rb → netkvm.rb} +1 -1
  214. data/lib/facter/resolvers/windows/{networking_resolver.rb → networking.rb} +19 -2
  215. data/lib/facter/resolvers/windows/{processors_resolver.rb → processors.rb} +1 -1
  216. data/lib/facter/resolvers/windows/{product_release_resolver.rb → product_release.rb} +1 -1
  217. data/lib/facter/resolvers/windows/ssh.rb +1 -1
  218. data/lib/facter/resolvers/windows/{system32_resolver.rb → system32.rb} +1 -1
  219. data/lib/facter/resolvers/windows/{uptime_resolver.rb → uptime.rb} +1 -1
  220. data/lib/facter/resolvers/windows/{virtualization_resolver.rb → virtualization.rb} +1 -1
  221. data/lib/facter/resolvers/windows/{win_os_description_resolver.rb → win_os_description.rb} +1 -1
  222. data/lib/facter/resolvers/{wpar_resolver.rb → wpar.rb} +1 -1
  223. data/lib/facter/resolvers/xen.rb +1 -1
  224. data/lib/facter/resolvers/zfs.rb +1 -1
  225. data/lib/facter/resolvers/zpool.rb +1 -1
  226. data/lib/facter/templates/man.erb +8 -0
  227. data/lib/facter/util/facts/facts_utils.rb +33 -0
  228. data/lib/facter/util/facts/unit_converter.rb +11 -4
  229. data/lib/facter/util/linux/dhcp.rb +86 -0
  230. data/lib/facter/util/linux/routing_table.rb +60 -0
  231. data/lib/facter/util/linux/socket_parser.rb +114 -0
  232. data/lib/facter/util/resolvers/ffi/hostname.rb +70 -0
  233. data/lib/facter/util/utils.rb +0 -4
  234. data/lib/facter/version.rb +1 -1
  235. metadata +124 -83
  236. data/lib/facter/facts/linux/cloud.rb +0 -15
  237. data/lib/facter/resolvers/cloud.rb +0 -39
  238. data/lib/facter/resolvers/networking_linux_resolver.rb +0 -258
  239. data/lib/facter/resolvers/redhat_release_resolver.rb +0 -55
  240. data/lib/facter/util/resolvers/networking.rb +0 -90
@@ -13,7 +13,7 @@ module Facter
13
13
 
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) { read_fact_from_win32_processor(fact_name) }
18
18
  end
19
19
 
@@ -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_fact_from_registry(fact_name) }
15
15
  end
16
16
 
@@ -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) { retrieve_info(fact_name) }
18
18
  end
19
19
 
@@ -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) { retrieve_windows_binaries_path }
15
15
  end
16
16
 
@@ -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) { calculate_system_uptime(fact_name) }
18
18
  end
19
19
 
@@ -16,7 +16,7 @@ module Facter
16
16
 
17
17
  private
18
18
 
19
- def post_resolve(fact_name)
19
+ def post_resolve(fact_name, _options)
20
20
  @fact_list.fetch(fact_name) { read_fact_from_computer_system(fact_name) }
21
21
  end
22
22
 
@@ -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_from_ole(fact_name) }
15
15
  end
16
16
 
@@ -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_wpar(fact_name) }
13
13
  end
14
14
 
@@ -12,7 +12,7 @@ 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) { detect_xen(fact_name) }
17
17
  end
18
18
 
@@ -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) { zfs_fact(fact_name) }
13
13
  end
14
14
 
@@ -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) { zpool_fact(fact_name) }
13
13
  end
14
14
 
@@ -20,6 +20,14 @@ OPTIONS
20
20
 
21
21
  <% end -%>
22
22
 
23
+ <% @Facter::Cli.commands.select { |_k, command_class| command_class.instance_of?(Thor::Command) }.each do |_, command| -%>
24
+ * `<%= command.usage %>`:
25
+
26
+ <%= command.description %>
27
+
28
+
29
+ <% end -%>
30
+
23
31
  FILES
24
32
  -----
25
33
  <em>/etc/puppetlabs/facter/facter.conf</em>
@@ -9,6 +9,39 @@ module Facter
9
9
  'BHYVE' => 'bhyve' }.freeze
10
10
 
11
11
  PHYSICAL_HYPERVISORS = %w[physical xen0 vmware_server vmware_workstation openvzhn vserver_host].freeze
12
+ REDHAT_FAMILY = %w[redhat rhel fedora centos scientific ascendos cloudlinux psbm
13
+ oraclelinux ovs oel amazon xenserver xcp-ng virtuozzo photon].freeze
14
+ DEBIAN_FAMILY = %w[debian ubuntu huaweios linuxmint devuan kde].freeze
15
+ SUSE_FAMILY = %w[sles sled suse].freeze
16
+ GENTOO_FAMILY = ['gentoo'].freeze
17
+ ARCH_FAMILY = %w[arch manjaro].freeze
18
+ MANDRAKE_FAMILY = %w[mandrake mandriva mageia].freeze
19
+ FAMILY_HASH = { 'RedHat' => REDHAT_FAMILY, 'Debian' => DEBIAN_FAMILY, 'Suse' => SUSE_FAMILY,
20
+ 'Gentoo' => GENTOO_FAMILY, 'Archlinux' => ARCH_FAMILY, 'Mandrake' => MANDRAKE_FAMILY }.freeze
21
+
22
+ class << self
23
+ def discover_family(os)
24
+ FAMILY_HASH.each { |key, array_value| return key if array_value.any? { |os_flavour| os =~ /#{os_flavour}/i } }
25
+ os
26
+ end
27
+
28
+ def release_hash_from_string(output)
29
+ return unless output
30
+
31
+ versions = output.split('.')
32
+ {}.tap do |release|
33
+ release['full'] = output
34
+ release['major'] = versions[0]
35
+ release['minor'] = versions[1] if versions[1]
36
+ end
37
+ end
38
+
39
+ def release_hash_from_matchdata(data)
40
+ return if data.nil? || data[1].nil?
41
+
42
+ release_hash_from_string(data[1].to_s)
43
+ end
44
+ end
12
45
  end
13
46
  end
14
47
  end
@@ -17,10 +17,9 @@ module Facter
17
17
  speed = speed.to_i
18
18
  return if !speed || speed.zero?
19
19
 
20
- prefix = { 3 => 'k', 6 => 'M', 9 => 'G', 12 => 'T' }
21
- power = Math.log10(speed).floor
22
- validated_speed = power.zero? ? speed.to_f : speed.fdiv(10**power)
23
- format('%<displayed_speed>.2f', displayed_speed: validated_speed).to_s + ' ' + prefix[power] + 'Hz'
20
+ validated_speed, metric_prefix = determine_metric_prefix(speed)
21
+
22
+ format('%<displayed_speed>.2f', displayed_speed: validated_speed).to_s + ' ' + metric_prefix + 'Hz'
24
23
  end
25
24
 
26
25
  def bytes_to_human_readable(bytes)
@@ -54,6 +53,14 @@ module Facter
54
53
  converted_number = bytes if multiple == 'bytes'
55
54
  [converted_number, multiple]
56
55
  end
56
+
57
+ def determine_metric_prefix(num)
58
+ metric_prefix = { 0 => '', 3 => 'k', 6 => 'M', 9 => 'G', 12 => 'T' }
59
+ power = Math.log10(num).floor
60
+ display_exponent = power - power % 3
61
+ coefficient = power.zero? ? num.to_f : num.fdiv(10**display_exponent)
62
+ [coefficient, metric_prefix[display_exponent]]
63
+ end
57
64
  end
58
65
  end
59
66
  end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Util
5
+ module Linux
6
+ class Dhcp
7
+ class << self
8
+ DIRS = %w[/var/lib/dhclient/
9
+ /var/lib/dhcp/
10
+ /var/lib/dhcp3/
11
+ /var/lib/NetworkManager/
12
+ /var/db/].freeze
13
+
14
+ def dhcp(interface_name, interface_index, logger)
15
+ @log = logger
16
+ @log.debug("Get DHCP for interface #{interface_name}")
17
+
18
+ dhcp = search_systemd_netif_leases(interface_index, interface_name)
19
+ dhcp ||= search_dhclient_leases(interface_name)
20
+ dhcp ||= search_internal_leases(interface_name)
21
+ dhcp ||= search_with_dhcpcd_command(interface_name)
22
+ dhcp
23
+ end
24
+
25
+ private
26
+
27
+ def search_systemd_netif_leases(index, interface_name)
28
+ return if index.nil?
29
+
30
+ @log.debug("Attempt to get DHCP for interface #{interface_name}, from systemd/netif/leases")
31
+
32
+ file_content = Facter::Util::FileHelper.safe_read("/run/systemd/netif/leases/#{index}", nil)
33
+ dhcp = file_content.match(/SERVER_ADDRESS=(.*)/) if file_content
34
+ dhcp[1] if dhcp
35
+ end
36
+
37
+ def search_dhclient_leases(interface_name)
38
+ @log.debug("Attempt to get DHCP for interface #{interface_name}, from dhclient leases")
39
+
40
+ DIRS.each do |dir|
41
+ next unless File.readable?(dir)
42
+
43
+ lease_files = Dir.entries(dir).select { |file| file =~ /dhclient.*\.lease/ }
44
+ next if lease_files.empty?
45
+
46
+ lease_files.select do |file|
47
+ content = Facter::Util::FileHelper.safe_read("#{dir}#{file}", nil)
48
+ next unless content =~ /interface.*#{interface_name}/
49
+
50
+ dhcp = content.match(/dhcp-server-identifier ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/)
51
+ return dhcp[1] if dhcp
52
+ end
53
+ end
54
+
55
+ nil
56
+ end
57
+
58
+ def search_internal_leases(interface_name)
59
+ return unless File.readable?('/var/lib/NetworkManager/')
60
+
61
+ @log.debug("Attempt to get DHCP for interface #{interface_name}, from NetworkManager leases")
62
+
63
+ files = Dir.entries('/var/lib/NetworkManager/').reject { |dir| dir =~ /^\.+$/ }
64
+ lease_file = files.find { |file| file =~ /internal.*#{interface_name}\.lease/ }
65
+ return unless lease_file
66
+
67
+ dhcp = Facter::Util::FileHelper.safe_read("/var/lib/NetworkManager/#{lease_file}", nil)
68
+
69
+ return unless dhcp
70
+
71
+ dhcp = dhcp.match(/SERVER_ADDRESS=(.*)/)
72
+ dhcp[1] if dhcp
73
+ end
74
+
75
+ def search_with_dhcpcd_command(interface_name)
76
+ @log.debug("Attempt to get DHCP for interface #{interface_name}, from dhcpcd command")
77
+
78
+ output = Facter::Core::Execution.execute("dhcpcd -U #{interface_name}", logger: @log)
79
+ dhcp = output.match(/dhcp_server_identifier='(.*)'/)
80
+ dhcp[1] if dhcp
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Util
5
+ module Linux
6
+ class RoutingTable
7
+ class << self
8
+ ROUTE_TYPES = %w[anycast
9
+ unicast
10
+ broadcast
11
+ local
12
+ nat
13
+ unreachable
14
+ prohibit
15
+ blackhole
16
+ throw].freeze
17
+
18
+ def read_routing_table(logger)
19
+ ipv4_output = Facter::Core::Execution.execute('ip route show', logger: logger)
20
+ ipv6_output = Facter::Core::Execution.execute('ip -6 route show', logger: logger)
21
+ routes4 = parse_routes(ipv4_output, true)
22
+ routes6 = parse_routes(ipv6_output, false)
23
+ [routes4, routes6]
24
+ end
25
+
26
+ private
27
+
28
+ def parse_routes(output, ipv4_type)
29
+ routes = []
30
+ output.each_line do |line|
31
+ parts = line.split(' ').compact
32
+ next if parts.include?('linkdown')
33
+
34
+ delete_invalid_route_type(parts)
35
+ next if !ipv4_type && !parts[0].include?(':')
36
+
37
+ route = construct_route(parts)
38
+ routes << route unless route[:ip].nil?
39
+ end
40
+ routes.uniq
41
+ end
42
+
43
+ def delete_invalid_route_type(parts)
44
+ route_type = parts[0]
45
+ parts.delete_at(0) if ROUTE_TYPES.include?(route_type)
46
+ end
47
+
48
+ def construct_route(parts)
49
+ route = {}
50
+ dev_index = parts.find_index { |elem| elem == 'dev' }
51
+ src_index = parts.find_index { |elem| elem == 'src' }
52
+ route[:interface] = parts[dev_index + 1] if dev_index
53
+ route[:ip] = parts[src_index + 1] if src_index
54
+ route
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Util
5
+ module Linux
6
+ class SocketParser
7
+ class << self
8
+ def retrieve_interfaces(logger)
9
+ require 'socket'
10
+ @interfaces = {}
11
+ @log = logger
12
+ Socket.getifaddrs.each do |ifaddr|
13
+ populate_interface_info(ifaddr)
14
+ end
15
+
16
+ @interfaces
17
+ end
18
+
19
+ private
20
+
21
+ def populate_interface_info(ifaddr)
22
+ interface_name = ifaddr.name
23
+ @interfaces[interface_name] = {} if @interfaces[interface_name].nil?
24
+
25
+ mac(ifaddr)
26
+ ip_info_of(ifaddr)
27
+ end
28
+
29
+ def mac(ifaddr)
30
+ return unless @interfaces[ifaddr.name][:mac].nil?
31
+
32
+ mac = search_for_mac(ifaddr)
33
+ @interfaces[ifaddr.name][:mac] = mac if mac
34
+ end
35
+
36
+ def search_for_mac(ifaddr)
37
+ mac = mac_from_bonded_interface(ifaddr.name)
38
+ mac ||= mac_from(ifaddr)
39
+ mac if !mac.nil? && mac != '00:00:00:00:00:00' && mac =~ /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/
40
+ end
41
+
42
+ def mac_from_bonded_interface(interface_name)
43
+ master = bond_master_of(interface_name)
44
+ return unless master
45
+
46
+ output = Facter::Util::FileHelper.safe_read("/proc/net/bonding/#{master}", nil)
47
+ return unless output
48
+
49
+ found_match = false
50
+ output.each_line do |line|
51
+ if line.strip == "Slave Interface: #{interface_name}"
52
+ found_match = true
53
+ elsif line.include? 'Slave Interface'
54
+ # if we reached the data block of another interface belonging to the bonded interface
55
+ found_match = false
56
+ end
57
+ return Regexp.last_match(1) if found_match && line =~ /Permanent HW addr: (\S*)/
58
+ end
59
+ end
60
+
61
+ def bond_master_of(interface_name)
62
+ content = Facter::Core::Execution.execute("ip link show #{interface_name}", logger: @log)
63
+ content.match(/master (\S*) /)&.captures&.first
64
+ end
65
+
66
+ def mac_from(ifaddr)
67
+ if Socket.const_defined? :PF_LINK
68
+ ifaddr.addr&.getnameinfo&.first # sometimes it returns localhost or ip
69
+ elsif Socket.const_defined? :PF_PACKET
70
+ return if ifaddr.addr.nil?
71
+
72
+ mac_from_sockaddr_of(ifaddr)
73
+ end
74
+ rescue StandardError => e
75
+ @log.debug("Could not read mac for interface #{ifaddr.name}, got #{e}")
76
+ end
77
+
78
+ def mac_from_sockaddr_of(ifaddr)
79
+ result = ifaddr.addr.inspect_sockaddr
80
+ result&.match(/hwaddr=([\h:]+)/)&.captures&.first
81
+ end
82
+
83
+ def ip_info_of(ifaddr)
84
+ return if ifaddr.addr.nil? || ifaddr.netmask.nil?
85
+
86
+ add_binding(ifaddr.name, ifaddr)
87
+ rescue StandardError => e
88
+ @log.debug("Could not read binding data, got #{e}")
89
+ end
90
+
91
+ def add_binding(interface_name, ifaddr)
92
+ ip, netmask, binding_key = binding_data(ifaddr)
93
+ binding = Facter::Util::Resolvers::Networking.build_binding(ip, netmask)
94
+ return if binding.nil?
95
+
96
+ @interfaces[interface_name][binding_key] = [] if @interfaces[interface_name][binding_key].nil?
97
+ @interfaces[interface_name][binding_key] << binding
98
+
99
+ @log.debug("Adding to interface #{interface_name}, binding:\n#{binding}")
100
+ end
101
+
102
+ def binding_data(ifaddr)
103
+ # ipv6 ips are retrieved as <ip>%<interface_name>
104
+ ip = ifaddr.addr.ip_address.split('%').first
105
+ netmask = ifaddr.netmask.ip_address
106
+ binding_key = ifaddr.addr.ipv4? ? :bindings : :bindings6
107
+
108
+ [ip, netmask, binding_key]
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end