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
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Facts
4
- module Linux
5
- class Cloud
6
- FACT_NAME = 'cloud'
7
-
8
- def call_the_resolver
9
- cloud_provider = Facter::Resolvers::Cloud.resolve(:cloud_provider)
10
-
11
- Facter::ResolvedFact.new(FACT_NAME, cloud_provider)
12
- end
13
- end
14
- end
15
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Facter
4
- module Resolvers
5
- class Cloud < BaseResolver
6
- # cloud_provider
7
-
8
- init_resolver
9
-
10
- class << self
11
- private
12
-
13
- def post_resolve(fact_name)
14
- @fact_list.fetch(fact_name) { detect_azure(fact_name) }
15
- end
16
-
17
- def detect_azure(fact_name)
18
- search_dirs = %w[/var/lib/dhcp /var/lib/NetworkManager]
19
- search_dirs.each do |path|
20
- next if !File.readable?(path) || !File.directory?(path)
21
-
22
- files = Dir.entries(path)
23
- files.select! { |filename| filename =~ /^dhclient.*lease.*$/ }
24
- files.each do |file|
25
- path = File.join([path, file])
26
- output = Facter::Util::FileHelper.safe_read(path)
27
-
28
- if output.include?('option unknown-245') || output.include?('option 245')
29
- @fact_list[:cloud_provider] = 'azure'
30
- return @fact_list[fact_name]
31
- end
32
- end
33
- end
34
- nil
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,258 +0,0 @@
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_interface_info(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
- mtu = line.match(/mtu (\d+)/)&.captures&.first&.to_i
44
- index_tokens = line.split(':')
45
- index = index_tokens[0].strip
46
- # vlans are displayed as <vlan_name>@<physical_interface>
47
- name = index_tokens[1].split('@').first.strip
48
- mtu_and_indexes[name] = [index, mtu]
49
- end
50
- mtu_and_indexes
51
- end
52
-
53
- def retrieve_interface_info(mtu_and_indexes)
54
- require 'socket'
55
- interfaces = {}
56
- Socket.getifaddrs.each do |interface|
57
- interfaces[interface.name] = {} if interfaces[interface.name].nil?
58
-
59
- if interfaces[interface.name][:mac].nil?
60
- mac = extract_mac_address(interface)
61
- interfaces[interface.name][:mac] = mac if mac
62
- end
63
-
64
- if interfaces[interface.name][:mtu].nil?
65
- mtu = mtu_and_indexes.dig(interface.name, 1)
66
- interfaces[interface.name][:mtu] = mtu unless mtu.nil?
67
- end
68
-
69
- if !interface.addr.nil? && !interface.netmask.nil?
70
- begin
71
- # ipv6 ips are retrieved as <ip>%<interface_name>
72
- ip = interface.addr.ip_address.split('%').first if interface.addr.ip?
73
- netmask = interface.netmask.ip_address
74
- add_binding(interfaces, interface.name, ip, netmask, interface.addr.ipv4?)
75
- rescue SocketError => e
76
- end
77
- end
78
- find_dhcp!(interface.name, mtu_and_indexes, interfaces)
79
- end
80
-
81
- @fact_list[:interfaces] = interfaces
82
- end
83
-
84
- def extract_mac_address(interface)
85
- mac = get_bonded_interface_mac(interface.name)
86
- begin
87
- if mac.nil?
88
- if Socket.const_defined? :PF_LINK
89
- mac = interface.addr&.getnameinfo&.first #sometimes it returns localhost, ip but mac also
90
- elsif Socket.const_defined? :PF_PACKET
91
- return if interface.addr.nil? || interface.addr.inspect_sockaddr.nil?
92
-
93
- mac = interface.addr&.inspect_sockaddr[/hwaddr=([\h:]+)/, 1]
94
- end
95
- end
96
- rescue StandardError => e
97
- log.debug("Could not read mac, got #{e}")
98
- end
99
- mac if !mac.nil? && mac != '00:00:00:00:00:00' && mac =~ /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/
100
- end
101
-
102
- def get_bonded_interface_mac(interface_name)
103
- master = get_bond_master(interface_name)
104
- return unless master
105
-
106
- output = Facter::Util::FileHelper.safe_read("/proc/net/bonding/#{master}", nil)
107
- return unless output
108
-
109
- right_block = false
110
- output.each_line do |line|
111
- if line.strip == "Slave Interface: #{interface_name}"
112
- right_block = true
113
- elsif line.include? 'Slave Interface'
114
- right_block = false
115
- end
116
- return Regexp.last_match(1) if right_block && line =~ /Permanent HW addr: (\S*)/
117
- end
118
- end
119
-
120
- def get_bond_master(interface_name)
121
- content = Facter::Core::Execution.execute("ip link show #{interface_name}", logger: log)
122
- master = content.match(/master (\S*) /)
123
- return master[1] if master
124
-
125
- nil
126
- end
127
-
128
- def add_binding(interfaces, name, ip, netmask, ip_v4_type)
129
- binding = Facter::Util::Resolvers::Networking.build_binding(ip, netmask)
130
- return if binding.nil?
131
-
132
- log.debug("Adding to interface #{name}, binding:\n#{binding}")
133
- binding_key = ip_v4_type == true ? :bindings : :bindings6
134
- interfaces[name][binding_key] = [] if interfaces[name][binding_key].nil?
135
- interfaces[name][binding_key] << binding
136
- end
137
-
138
- def add_info_from_routing_table
139
- routes4, routes6 = read_routing_table
140
- compare_ips(routes4, :bindings)
141
- compare_ips(routes6, :bindings6)
142
- end
143
-
144
-
145
- def read_routing_table
146
- ipv4_output = Facter::Core::Execution.execute('ip route show', logger: log)
147
- ipv6_output = Facter::Core::Execution.execute('ip -6 route show', logger: log)
148
- routes4 = parse_routes(ipv4_output, 'ipv4')
149
- routes6 = parse_routes(ipv6_output, 'ipv6')
150
- [routes4, routes6]
151
- end
152
-
153
- def parse_routes(output, family)
154
- routes = []
155
- output.each_line do |line|
156
- parts = line.split(' ').compact
157
- next if parts.include?('linkdown')
158
-
159
- route_type = parts[0]
160
- parts.delete_at(0) if ROUTE_TYPES.include?(route_type)
161
- next if family == 'ipv6' && !parts[0].include?(':')
162
-
163
- route = construct_route(parts)
164
- routes << route unless route[:ip].nil?
165
- end
166
- routes.uniq
167
- end
168
-
169
- def construct_route(parts)
170
- route = {}
171
- dev_index = parts.find_index { |elem| elem == 'dev' }
172
- src_index = parts.find_index { |elem| elem == 'src' }
173
- route[:interface] = parts[dev_index + 1] if dev_index
174
- route[:ip] = parts[src_index + 1] if src_index
175
- route
176
- end
177
-
178
- def compare_ips(routes, binding_key)
179
- routes.each do |route|
180
- # TODO we should simplify this
181
- if @fact_list[:interfaces].key?(route[:interface])
182
- if @fact_list[:interfaces][route[:interface]][binding_key].nil?
183
- @fact_list[:interfaces][route[:interface]][binding_key] = [{ address: route[:ip] }]
184
- elsif @fact_list[:interfaces][route[:interface]][binding_key].none? { |binding| binding[:address] == route[:ip] }
185
- @fact_list[:interfaces][route[:interface]][binding_key] << { address: route[:ip] }
186
- end
187
- end
188
- end
189
- end
190
-
191
- def find_dhcp!(interface_name, interface_indexes, interfaces)
192
- return if !interfaces[interface_name] || interfaces[interface_name][:dhcp]
193
-
194
- log.debug("Get DHCP for interface #{interface_name}")
195
- unless interface_indexes[interface_name].nil?
196
- index = interface_indexes[interface_name][0]
197
- file_content = Facter::Util::FileHelper.safe_read("/run/systemd/netif/leases/#{index}", nil)
198
- dhcp = file_content.match(/SERVER_ADDRESS=(.*)/) if file_content
199
- if dhcp
200
- interfaces[interface_name][:dhcp] = dhcp[1]
201
- else
202
- alternate_dhcp = retrieve_from_other_directories(interface_name)
203
- interfaces[interface_name][:dhcp] = alternate_dhcp if alternate_dhcp
204
- end
205
- end
206
- return unless interfaces[interface_name][:dhcp].nil?
207
-
208
- output = Facter::Core::Execution.execute("dhcpcd -U #{interface_name}", logger: log)
209
- result = output.match(/dhcp_server_identifier='(.*)'/)&.captures&.first
210
- interfaces[interface_name][:dhcp] = result if result
211
- end
212
-
213
- def retrieve_from_other_directories(interface_name)
214
- DIRS.each do |dir|
215
- next unless File.readable?(dir)
216
-
217
- lease_files = Dir.entries(dir).select { |file| file =~ /dhclient.*\.lease/ }
218
- next if lease_files.empty?
219
-
220
- lease_files.select do |file|
221
- content = Facter::Util::FileHelper.safe_read("#{dir}#{file}", nil)
222
- next unless content =~ /interface.*#{interface_name}/
223
-
224
- dhcp = content.match(/dhcp-server-identifier ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/)
225
- return dhcp[1] if dhcp
226
- end
227
- end
228
- return unless File.readable?('/var/lib/NetworkManager/')
229
-
230
- search_internal_leases(interface_name)
231
- end
232
-
233
- def search_internal_leases(interface_name)
234
- files = Dir.entries('/var/lib/NetworkManager/').reject { |dir| dir =~ /^\.+$/ }
235
- lease_file = files.find { |file| file =~ /internal.*#{interface_name}\.lease/ }
236
- return unless lease_file
237
-
238
- dhcp = Facter::Util::FileHelper.safe_read("/var/lib/NetworkManager/#{lease_file}", nil)
239
-
240
- return unless dhcp
241
-
242
- dhcp = dhcp.match(/SERVER_ADDRESS=(.*)/)
243
- dhcp[1] if dhcp
244
- end
245
-
246
- def retrieve_primary_interface
247
- primary_helper = Facter::Util::Resolvers::Networking::PrimaryInterface
248
- primary_interface = primary_helper.read_from_proc_route
249
- primary_interface ||= primary_helper.read_from_ip_route
250
- primary_interface ||= primary_helper.find_in_interfaces(@fact_list[:interfaces])
251
-
252
- @fact_list[:primary_interface] = primary_interface
253
- end
254
-
255
- end
256
- end
257
- end
258
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Facter
4
- module Resolvers
5
- class RedHatRelease < BaseResolver
6
- # :name
7
- # :version
8
- # :codename
9
-
10
- init_resolver
11
-
12
- class << self
13
- private
14
-
15
- def post_resolve(fact_name)
16
- @fact_list.fetch(fact_name) { read_redhat_release(fact_name) }
17
- end
18
-
19
- def read_redhat_release(fact_name)
20
- output = Facter::Util::FileHelper.safe_read('/etc/redhat-release', nil)
21
- return @fact_list[fact_name] = nil if output.nil?
22
-
23
- build_fact_list(output)
24
-
25
- @fact_list[fact_name]
26
- end
27
-
28
- def build_fact_list(output)
29
- output_strings = output.split('release')
30
- output_strings.map!(&:strip)
31
- version_codename = output_strings[1].split(' ')
32
-
33
- @fact_list[:name] = name(output_strings[0])
34
- @fact_list[:version] = version_codename[0]&.strip
35
-
36
- codename = version_codename[1]&.strip
37
- @fact_list[:codename] = codename ? codename.gsub(/[()]/, '') : nil
38
-
39
- @fact_list[:identifier] = identifier(@fact_list[:name])
40
- end
41
-
42
- def name(name)
43
- name.strip.split(' ')[0..1].join
44
- end
45
-
46
- def identifier(name)
47
- identifier = name.strip.downcase
48
- identifier = 'rhel' if @fact_list[:name].strip.casecmp('Red Hat Enterprise Linux')
49
-
50
- identifier
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'ipaddr'
4
-
5
- module Facter
6
- module Util
7
- module Resolvers
8
- module Networking
9
- class << self
10
- # Creates a hash with IP, netmask and network. Works for IPV4 and IPV6
11
- # @param [String] addr The IP address
12
- # @param [Integer] mask_length Number of 1 bits the netmask has
13
- #
14
- # @return [Hash] Hash containing ip address, netmask and network
15
- def build_binding(addr, mask_length)
16
- return if !addr || !mask_length
17
-
18
- ip = IPAddr.new(addr)
19
- mask_helper = ip.ipv6? ? 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff' : '255.255.255.255'
20
- mask = IPAddr.new(mask_helper).mask(mask_length)
21
-
22
- { address: addr, netmask: mask.to_s, network: ip.mask(mask_length).to_s }
23
- end
24
-
25
- def expand_main_bindings(networking_facts)
26
- primary = networking_facts[:primary_interface]
27
- interfaces = networking_facts[:interfaces]
28
-
29
- expand_interfaces(interfaces) unless interfaces.nil?
30
- expand_primary_interface(networking_facts, primary) unless primary.nil? || interfaces.nil?
31
- end
32
-
33
- def get_scope(ip)
34
- require 'socket'
35
-
36
- scope6 = []
37
- addrinfo = Addrinfo.new(['AF_INET6', 0, nil, ip], :INET6)
38
-
39
- scope6 << 'compat,' if IPAddr.new(ip).ipv4_compat?
40
- scope6 << if addrinfo.ipv6_linklocal?
41
- 'link'
42
- elsif addrinfo.ipv6_sitelocal?
43
- 'site'
44
- elsif addrinfo.ipv6_loopback?
45
- 'host'
46
- else 'global'
47
- end
48
- scope6.join
49
- end
50
-
51
- def find_valid_binding(bindings)
52
- bindings.each do |binding|
53
- return binding unless ignored_ip_address(binding[:address])
54
- end
55
- bindings.empty? ? nil : bindings.first
56
- end
57
-
58
- def ignored_ip_address(addr)
59
- addr.empty? || addr.start_with?('127.', '169.254.') || addr.start_with?('fe80') || addr.eql?('::1')
60
- end
61
-
62
- private
63
-
64
- def expand_interfaces(interfaces)
65
- interfaces.each_value do |values|
66
- expand_binding(values, values[:bindings]) if values[:bindings]
67
- expand_binding(values, values[:bindings6], false) if values[:bindings6]
68
- end
69
- end
70
-
71
- def expand_primary_interface(networking_facts, primary)
72
- networking_facts[:interfaces][primary].each do |key, value|
73
- networking_facts[key] = value unless %i[bindings bindings6].include?(key)
74
- end
75
- end
76
-
77
- def expand_binding(values, bindings, ipv4_type = true)
78
- binding = find_valid_binding(bindings)
79
- ip_protocol_type = ipv4_type ? '' : '6'
80
-
81
- values["ip#{ip_protocol_type}".to_sym] = binding[:address]
82
- values["netmask#{ip_protocol_type}".to_sym] = binding[:netmask]
83
- values["network#{ip_protocol_type}".to_sym] = binding[:network]
84
- values[:scope6] = get_scope(binding[:address]) unless ipv4_type
85
- end
86
- end
87
- end
88
- end
89
- end
90
- end