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
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Linux
6
+ class Hostname < BaseResolver
7
+ # :fqdn
8
+ # :domain
9
+ # :hostname
10
+
11
+ init_resolver
12
+
13
+ class << self
14
+ private
15
+
16
+ def post_resolve(fact_name, _options)
17
+ @fact_list.fetch(fact_name) { retrieve_info(fact_name) }
18
+ end
19
+
20
+ def retrieve_info(fact_name)
21
+ require 'socket'
22
+ require 'facter/util/resolvers/ffi/hostname'
23
+
24
+ output = retrieving_hostname
25
+ return nil unless output
26
+
27
+ # Check if the gethostname method retrieved fqdn
28
+ hostname, domain = parse_fqdn(output)
29
+
30
+ fqdn = retrieve_fqdn_for_host(hostname) if hostname_and_no_domain?(hostname, domain)
31
+
32
+ _, domain = parse_fqdn(fqdn) if exists_and_valid_fqdn?(fqdn, hostname)
33
+
34
+ domain = read_domain unless exists_and_not_empty?(domain)
35
+
36
+ construct_fact_list(hostname, domain, fqdn)
37
+ @fact_list[fact_name]
38
+ end
39
+
40
+ def retrieving_hostname
41
+ output = Socket.gethostname
42
+ if !output || output.empty? || output['0.0.0.0']
43
+ output = Facter::Util::Resolvers::Ffi::Hostname.getffihostname
44
+ end
45
+
46
+ log.debug("Tried to retrieve hostname and got: #{output}")
47
+ output && !output.empty? ? output : nil
48
+ end
49
+
50
+ def parse_fqdn(output)
51
+ if output =~ /(.*?)\.(.+$)/
52
+ log.debug("Managed to read hostname: #{Regexp.last_match(1)} and domain: #{Regexp.last_match(2)}")
53
+ [Regexp.last_match(1), Regexp.last_match(2)]
54
+ else
55
+ log.debug("Only managed to read hostname: #{output}, no domain was found.")
56
+ [output, '']
57
+ end
58
+ end
59
+
60
+ def retrieve_fqdn_for_host(host)
61
+ begin
62
+ name = Socket.getaddrinfo(host, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)[0]
63
+ rescue StandardError => e
64
+ log.debug("Socket.getaddrinfo failed to retrieve fqdn for hostname #{host} with: #{e}")
65
+ end
66
+
67
+ return name[2] if !name.nil? && !name.empty? && host != name[2] && name[2] != name[3]
68
+
69
+ retrieve_fqdn_for_host_with_ffi(host)
70
+ end
71
+
72
+ def retrieve_fqdn_for_host_with_ffi(host)
73
+ fqdn = Facter::Util::Resolvers::Ffi::Hostname.getffiaddrinfo(host)
74
+ log.debug("FFI getaddrinfo was called and it retrieved: #{fqdn}")
75
+ fqdn
76
+ end
77
+
78
+ def exists_and_valid_fqdn?(fqdn, hostname)
79
+ exists_and_not_empty?(fqdn) && fqdn.start_with?("#{hostname}.")
80
+ end
81
+
82
+ def hostname_and_no_domain?(hostname, domain)
83
+ domain.empty? && !hostname.empty?
84
+ end
85
+
86
+ def read_domain
87
+ file_content = Facter::Util::FileHelper.safe_read('/etc/resolv.conf')
88
+ if file_content =~ /^domain\s+(\S+)/
89
+ Regexp.last_match(1)
90
+ elsif file_content =~ /^search\s+(\S+)/
91
+ Regexp.last_match(1)
92
+ end
93
+ end
94
+
95
+ def construct_fqdn(host, domain, fqdn)
96
+ return fqdn if exists_and_not_empty?(fqdn)
97
+ return if host.nil? || host.empty?
98
+
99
+ exists_and_not_empty?(domain) ? "#{host}.#{domain}" : host
100
+ end
101
+
102
+ def construct_fact_list(hostname, domain, fqdn)
103
+ @fact_list[:hostname] = hostname
104
+ @fact_list[:domain] = domain
105
+ @fact_list[:fqdn] = construct_fqdn(@fact_list[:hostname], @fact_list[:domain], fqdn)
106
+ end
107
+
108
+ def exists_and_not_empty?(variable)
109
+ variable && !variable.empty?
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -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
 
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ module Linux
6
+ class Networking < BaseResolver
7
+ init_resolver
8
+
9
+ class << self
10
+ private
11
+
12
+ def post_resolve(fact_name, _options)
13
+ @fact_list.fetch(fact_name) { retrieve_network_info(fact_name) }
14
+
15
+ @fact_list[fact_name]
16
+ end
17
+
18
+ def retrieve_network_info(fact_name)
19
+ add_info_from_socket_reader
20
+ add_info_from_routing_table
21
+ retrieve_primary_interface
22
+ Facter::Util::Resolvers::Networking.expand_main_bindings(@fact_list)
23
+ @fact_list[fact_name]
24
+ end
25
+
26
+ def add_info_from_socket_reader
27
+ @fact_list[:interfaces] = Facter::Util::Linux::SocketParser.retrieve_interfaces(log)
28
+ mtu_and_indexes = interfaces_mtu_and_index
29
+
30
+ @fact_list[:interfaces].keys.each do |interface_name|
31
+ mtu(interface_name, mtu_and_indexes)
32
+ dhcp(interface_name, mtu_and_indexes)
33
+
34
+ @log.debug("Found interface #{interface_name} with #{@fact_list[:interfaces][interface_name]}")
35
+ end
36
+ end
37
+
38
+ def interfaces_mtu_and_index
39
+ mtu_and_indexes = {}
40
+ output = Facter::Core::Execution.execute('ip link show', logger: log)
41
+ output.each_line do |line|
42
+ next unless line.include?('mtu')
43
+
44
+ parse_ip_command_line(line, mtu_and_indexes)
45
+ end
46
+ log.debug("Associated MTU and index in ip command: #{mtu_and_indexes}")
47
+ mtu_and_indexes
48
+ end
49
+
50
+ def parse_ip_command_line(line, mtu_and_indexes)
51
+ mtu = line.match(/mtu (\d+)/)&.captures&.first&.to_i
52
+ index_tokens = line.split(':')
53
+ index = index_tokens[0].strip
54
+ # vlans are displayed as <vlan_name>@<physical_interface>
55
+ name = index_tokens[1].split('@').first.strip
56
+ mtu_and_indexes[name] = { index: index, mtu: mtu }
57
+ end
58
+
59
+ def mtu(interface_name, mtu_and_indexes)
60
+ mtu = mtu_and_indexes.dig(interface_name, :mtu)
61
+ @fact_list[:interfaces][interface_name][:mtu] = mtu unless mtu.nil?
62
+ end
63
+
64
+ def dhcp(interface_name, mtu_and_indexes)
65
+ dhcp = Facter::Util::Linux::Dhcp.dhcp(interface_name, mtu_and_indexes.dig(interface_name, :index), log)
66
+ @fact_list[:interfaces][interface_name][:dhcp] = dhcp unless dhcp.nil?
67
+ end
68
+
69
+ def add_info_from_routing_table
70
+ routes4, routes6 = Facter::Util::Linux::RoutingTable.read_routing_table(log)
71
+ compare_ips(routes4, :bindings)
72
+ compare_ips(routes6, :bindings6)
73
+ end
74
+
75
+ def compare_ips(routes, binding_key)
76
+ routes.each do |route|
77
+ next unless @fact_list[:interfaces].key?(route[:interface])
78
+
79
+ interface_data = @fact_list[:interfaces][route[:interface]]
80
+ add_binding_if_missing(interface_data, binding_key, route)
81
+ end
82
+ end
83
+
84
+ def add_binding_if_missing(interface_data, binding_key, route)
85
+ interface_binding = interface_data[binding_key]
86
+
87
+ if interface_binding.nil?
88
+ interface_data[binding_key] = [{ address: route[:ip] }]
89
+ elsif interface_binding.none? { |binding| binding[:address] == route[:ip] }
90
+ interface_binding << { address: route[:ip] }
91
+ end
92
+ end
93
+
94
+ def retrieve_primary_interface
95
+ primary_helper = Facter::Util::Resolvers::Networking::PrimaryInterface
96
+ primary_interface = primary_helper.read_from_proc_route
97
+ primary_interface ||= primary_helper.read_from_ip_route
98
+ primary_interface ||= primary_helper.find_in_interfaces(@fact_list[:interfaces])
99
+
100
+ @fact_list[:primary_interface] = primary_interface
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -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_load_averages(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) { 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
 
@@ -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_mounts }
15
15
  end
16
16
 
@@ -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,7 +20,7 @@ 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
 
@@ -11,7 +11,7 @@ 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
 
@@ -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) { read_mounts(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) { read_facts(fact_name) }
13
13
  end
14
14
 
@@ -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) { check_proc_vz(fact_name) }
15
15
  end
16
16
 
@@ -19,7 +19,7 @@ module Facter
19
19
  class << self
20
20
  private
21
21
 
22
- def post_resolve(fact_name)
22
+ def post_resolve(fact_name, _options)
23
23
  @fact_list.fetch(fact_name) { read_os_release_file(fact_name) }
24
24
  end
25
25
 
@@ -11,7 +11,7 @@ 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_partitions(fact_name) }
16
16
  end
17
17
 
@@ -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_path_from_env }
13
13
  end
14
14
 
@@ -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_cpuinfo(fact_name) }
23
23
  end
24
24
 
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Facter
4
+ module Resolvers
5
+ class RedHatRelease < BaseResolver
6
+ # :name
7
+ # :version
8
+ # :codename
9
+ # :description
10
+ # :distributor_id
11
+
12
+ init_resolver
13
+
14
+ class << self
15
+ private
16
+
17
+ def post_resolve(fact_name, _options)
18
+ @fact_list.fetch(fact_name) { read_redhat_release(fact_name) }
19
+ end
20
+
21
+ def read_redhat_release(fact_name)
22
+ output = Facter::Util::FileHelper.safe_read('/etc/redhat-release', nil)
23
+ return @fact_list[fact_name] = nil if output.nil?
24
+
25
+ build_fact_list(output)
26
+
27
+ @fact_list[fact_name]
28
+ end
29
+
30
+ def build_fact_list(output)
31
+ @fact_list[:description] = output.strip
32
+ output_strings = output.split('release')
33
+ output_strings.map!(&:strip)
34
+
35
+ @fact_list[:codename] = codename(output)
36
+ @fact_list[:distributor_id] = distributor_id(output_strings[0])
37
+ @fact_list[:name] = release_name(output_strings[0])
38
+ @fact_list[:version] = version(output_strings)
39
+ @fact_list[:identifier] = identifier(@fact_list[:name])
40
+ end
41
+
42
+ def release_name(value)
43
+ value.split.reject { |el| el.casecmp('linux').zero? }[0..1].join
44
+ end
45
+
46
+ def identifier(value)
47
+ identifier = value.downcase
48
+ identifier = 'rhel' if @fact_list[:name].casecmp('Red Hat Enterprise Linux')
49
+
50
+ identifier
51
+ end
52
+
53
+ def codename(value)
54
+ matched_data = value.match(/.*release.*(\(.*\)).*/)
55
+ return unless matched_data
56
+
57
+ codename = (matched_data[1] || '').gsub(/\(|\)/, '')
58
+ codename.empty? ? nil : codename
59
+ end
60
+
61
+ def version(value)
62
+ value[1].split.first
63
+ end
64
+
65
+ def distributor_id(value)
66
+ value.split.reject { |el| el.casecmp('linux').zero? }.join
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end