facter 4.0.50 → 4.2.0

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 (164) hide show
  1. checksums.yaml +4 -4
  2. data/lib/docs/generate_cli.rb +7 -0
  3. data/lib/facter.rb +90 -56
  4. data/lib/facter/config.rb +2 -0
  5. data/lib/facter/custom_facts/core/aggregate.rb +9 -0
  6. data/lib/facter/custom_facts/core/execution/base.rb +7 -3
  7. data/lib/facter/custom_facts/core/execution/popen3.rb +13 -1
  8. data/lib/facter/custom_facts/core/execution/posix.rb +2 -2
  9. data/lib/facter/custom_facts/core/execution/windows.rb +1 -1
  10. data/lib/facter/custom_facts/core/resolvable.rb +11 -0
  11. data/lib/facter/custom_facts/util/collection.rb +5 -0
  12. data/lib/facter/custom_facts/util/directory_loader.rb +1 -1
  13. data/lib/facter/custom_facts/util/normalization.rb +7 -2
  14. data/lib/facter/custom_facts/util/resolution.rb +2 -0
  15. data/lib/facter/custom_facts/util/windows_root.rb +2 -1
  16. data/lib/facter/facts/aix/processors/cores.rb +16 -0
  17. data/lib/facter/facts/aix/processors/threads.rb +16 -0
  18. data/lib/facter/facts/amzn/lsbdistcodename.rb +16 -0
  19. data/lib/facter/facts/amzn/lsbdistdescription.rb +16 -0
  20. data/lib/facter/facts/amzn/lsbdistid.rb +16 -0
  21. data/lib/facter/facts/amzn/os/distro/codename.rb +24 -0
  22. data/lib/facter/facts/amzn/os/distro/description.rb +21 -0
  23. data/lib/facter/facts/amzn/os/distro/id.rb +21 -0
  24. data/lib/facter/facts/amzn/os/distro/release.rb +32 -0
  25. data/lib/facter/facts/freebsd/is_virtual.rb +1 -5
  26. data/lib/facter/facts/freebsd/virtual.rb +1 -2
  27. data/lib/facter/facts/linux/az_metadata.rb +23 -0
  28. data/lib/facter/facts/linux/cloud/provider.rb +20 -0
  29. data/lib/facter/facts/linux/dhcp_servers.rb +2 -2
  30. data/lib/facter/facts/linux/ec2_metadata.rb +1 -5
  31. data/lib/facter/facts/linux/ec2_userdata.rb +1 -5
  32. data/lib/facter/facts/linux/hypervisors/xen.rb +1 -4
  33. data/lib/facter/facts/linux/interfaces.rb +1 -1
  34. data/lib/facter/facts/linux/ipaddress6_interfaces.rb +1 -1
  35. data/lib/facter/facts/linux/ipaddress_interfaces.rb +1 -1
  36. data/lib/facter/facts/linux/is_virtual.rb +1 -5
  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/processors/cores.rb +16 -0
  59. data/lib/facter/facts/linux/processors/threads.rb +16 -0
  60. data/lib/facter/facts/linux/scope6_interfaces.rb +1 -1
  61. data/lib/facter/facts/linux/virtual.rb +1 -2
  62. data/lib/facter/facts/macosx/os/macosx/version.rb +15 -4
  63. data/lib/facter/facts/macosx/processors/cores.rb +16 -0
  64. data/lib/facter/facts/macosx/processors/threads.rb +16 -0
  65. data/lib/facter/facts/rhel/lsbdistcodename.rb +16 -0
  66. data/lib/facter/facts/rhel/lsbdistdescription.rb +16 -0
  67. data/lib/facter/facts/rhel/lsbdistid.rb +16 -0
  68. data/lib/facter/facts/rhel/os/distro/codename.rb +2 -4
  69. data/lib/facter/facts/rhel/os/distro/description.rb +2 -4
  70. data/lib/facter/facts/rhel/os/distro/id.rb +2 -4
  71. data/lib/facter/facts/rhel/os/distro/release.rb +13 -12
  72. data/lib/facter/facts/sles/lsbdistcodename.rb +16 -0
  73. data/lib/facter/facts/sles/lsbdistdescription.rb +16 -0
  74. data/lib/facter/facts/sles/lsbdistid.rb +16 -0
  75. data/lib/facter/facts/sles/os/distro/codename.rb +3 -4
  76. data/lib/facter/facts/sles/os/distro/description.rb +2 -5
  77. data/lib/facter/facts/sles/os/distro/id.rb +6 -5
  78. data/lib/facter/facts/sles/os/distro/release.rb +17 -12
  79. data/lib/facter/facts/solaris/hypervisors/ldom.rb +1 -1
  80. data/lib/facter/facts/solaris/hypervisors/zone.rb +1 -1
  81. data/lib/facter/facts/solaris/mountpoints.rb +1 -1
  82. data/lib/facter/facts/solaris/processors/cores.rb +16 -0
  83. data/lib/facter/facts/solaris/processors/threads.rb +16 -0
  84. data/lib/facter/facts/ubuntu/lsbdistrelease.rb +2 -2
  85. data/lib/facter/facts/windows/az_metadata.rb +23 -0
  86. data/lib/facter/facts/windows/cloud/provider.rb +21 -0
  87. data/lib/facter/facts/windows/ec2_metadata.rb +1 -1
  88. data/lib/facter/facts/windows/ec2_userdata.rb +1 -1
  89. data/lib/facter/facts/windows/gce.rb +1 -1
  90. data/lib/facter/facts/windows/hypervisors/hyperv.rb +1 -1
  91. data/lib/facter/facts/windows/hypervisors/kvm.rb +2 -1
  92. data/lib/facter/facts/windows/hypervisors/virtualbox.rb +2 -2
  93. data/lib/facter/facts/windows/hypervisors/vmware.rb +1 -1
  94. data/lib/facter/facts/windows/hypervisors/xen.rb +3 -1
  95. data/lib/facter/facts/windows/is_virtual.rb +15 -0
  96. data/lib/facter/facts/windows/{virtualization/is_virtual.rb → processors/cores.rb} +4 -4
  97. data/lib/facter/facts/windows/{virtualization/virtual.rb → processors/threads.rb} +4 -4
  98. data/lib/facter/facts/windows/virtual.rb +15 -0
  99. data/lib/facter/framework/cli/cli.rb +6 -8
  100. data/lib/facter/framework/config/config_reader.rb +2 -0
  101. data/lib/facter/framework/config/fact_groups.rb +25 -2
  102. data/lib/facter/framework/core/cache_manager.rb +7 -3
  103. data/lib/facter/framework/core/fact/external/external_fact_manager.rb +0 -1
  104. data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +41 -39
  105. data/lib/facter/framework/core/fact_filter.rb +5 -15
  106. data/lib/facter/framework/core/fact_loaders/external_fact_loader.rb +9 -6
  107. data/lib/facter/framework/core/fact_loaders/fact_loader.rb +39 -37
  108. data/lib/facter/framework/core/fact_manager.rb +84 -14
  109. data/lib/facter/framework/core/file_loader.rb +1 -1
  110. data/lib/facter/framework/core/options.rb +1 -2
  111. data/lib/facter/framework/core/options/config_file_options.rb +7 -0
  112. data/lib/facter/framework/core/options/option_store.rb +12 -6
  113. data/lib/facter/framework/formatters/formatter_helper.rb +3 -5
  114. data/lib/facter/framework/logging/logger.rb +4 -4
  115. data/lib/facter/framework/parsers/query_parser.rb +5 -12
  116. data/lib/facter/models/fact_collection.rb +48 -5
  117. data/lib/facter/models/resolved_fact.rb +2 -3
  118. data/lib/facter/models/searched_fact.rb +2 -3
  119. data/lib/facter/resolvers/aix/ffi/ffi_helper.rb +1 -1
  120. data/lib/facter/resolvers/aix/processors.rb +4 -0
  121. data/lib/facter/resolvers/az.rb +39 -0
  122. data/lib/facter/resolvers/base_resolver.rb +2 -2
  123. data/lib/facter/resolvers/dmi_decode.rb +0 -1
  124. data/lib/facter/resolvers/linux/hostname.rb +126 -0
  125. data/lib/facter/resolvers/linux/networking.rb +124 -0
  126. data/lib/facter/resolvers/macosx/mountpoints.rb +14 -1
  127. data/lib/facter/resolvers/macosx/processor.rb +16 -1
  128. data/lib/facter/resolvers/mountpoints.rb +16 -8
  129. data/lib/facter/resolvers/networking.rb +3 -2
  130. data/lib/facter/resolvers/partitions.rb +1 -1
  131. data/lib/facter/resolvers/processors_lscpu.rb +44 -0
  132. data/lib/facter/resolvers/redhat_release.rb +28 -12
  133. data/lib/facter/resolvers/ruby.rb +1 -1
  134. data/lib/facter/resolvers/selinux.rb +5 -7
  135. data/lib/facter/resolvers/solaris/ffi/functions.rb +1 -1
  136. data/lib/facter/resolvers/solaris/ffi/structs.rb +12 -0
  137. data/lib/facter/resolvers/solaris/mountpoints.rb +22 -16
  138. data/lib/facter/resolvers/solaris/networking.rb +20 -5
  139. data/lib/facter/resolvers/solaris/processors.rb +7 -0
  140. data/lib/facter/resolvers/solaris/zone.rb +0 -1
  141. data/lib/facter/resolvers/windows/ffi/identity_ffi.rb +5 -0
  142. data/lib/facter/resolvers/windows/identity.rb +1 -6
  143. data/lib/facter/resolvers/windows/processors.rb +41 -4
  144. data/lib/facter/resolvers/windows/uptime.rb +3 -22
  145. data/lib/facter/resolvers/windows/virtualization.rb +46 -44
  146. data/lib/facter/resolvers/xen.rb +6 -1
  147. data/lib/facter/templates/man.erb +13 -5
  148. data/lib/facter/util/facts/posix/virtual_detector.rb +74 -0
  149. data/lib/facter/util/facts/unit_converter.rb +2 -2
  150. data/lib/facter/util/linux/dhcp.rb +86 -0
  151. data/lib/facter/util/linux/if_inet6.rb +73 -0
  152. data/lib/facter/util/linux/routing_table.rb +60 -0
  153. data/lib/facter/util/linux/socket_parser.rb +114 -0
  154. data/lib/facter/util/resolvers/ffi/hostname.rb +70 -0
  155. data/lib/facter/util/resolvers/http.rb +7 -1
  156. data/lib/facter/util/resolvers/networking/primary_interface.rb +11 -5
  157. data/lib/facter/util/utils.rb +18 -1
  158. data/lib/facter/version.rb +1 -1
  159. metadata +63 -13
  160. data/lib/facter/facts/linux/cloud.rb +0 -15
  161. data/lib/facter/framework/core/fact_augmenter.rb +0 -37
  162. data/lib/facter/resolvers/cloud.rb +0 -39
  163. data/lib/facter/resolvers/networking_linux.rb +0 -296
  164. data/lib/facter/util/facts/virtual_detector.rb +0 -90
@@ -1,296 +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, _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
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Facter
4
- module Util
5
- module Facts
6
- class VirtualDetector
7
- def initialize
8
- @log = Facter::Log.new(self)
9
- end
10
-
11
- def platform
12
- fact_value = check_docker_lxc || check_dmi || check_freebsd || check_gce || retrieve_from_virt_what
13
- fact_value ||= check_vmware || check_open_vz || check_vserver || check_xen || check_other_facts
14
- fact_value ||= check_lspci || 'physical'
15
-
16
- fact_value
17
- end
18
-
19
- def check_docker_lxc
20
- @log.debug('Checking Docker and LXC')
21
- Facter::Resolvers::Containers.resolve(:vm)
22
- end
23
-
24
- def check_dmi
25
- @log.debug('Checking DMI')
26
- vendor = Facter::Resolvers::DmiDecode.resolve(:vendor)
27
- @log.debug("dmi detected vendor: #{vendor}")
28
- return 'kvm' if vendor =~ /Amazon/
29
-
30
- 'xen' if vendor =~ /Xen/
31
- end
32
-
33
- def check_gce
34
- @log.debug('Checking GCE')
35
- bios_vendor = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor)
36
- 'gce' if bios_vendor&.include?('Google')
37
- end
38
-
39
- def check_vmware
40
- @log.debug('Checking VMware')
41
- Facter::Resolvers::Vmware.resolve(:vm)
42
- end
43
-
44
- def retrieve_from_virt_what
45
- @log.debug('Checking virtual_what')
46
- Facter::Resolvers::VirtWhat.resolve(:vm)
47
- end
48
-
49
- def check_open_vz
50
- @log.debug('Checking OpenVZ')
51
- Facter::Resolvers::OpenVz.resolve(:vm)
52
- end
53
-
54
- def check_vserver
55
- @log.debug('Checking VServer')
56
- Facter::Resolvers::VirtWhat.resolve(:vserver)
57
- end
58
-
59
- def check_xen
60
- @log.debug('Checking XEN')
61
- Facter::Resolvers::Xen.resolve(:vm)
62
- end
63
-
64
- def check_freebsd
65
- return unless Object.const_defined?('Facter::Resolvers::Freebsd::Virtual')
66
-
67
- @log.debug('Checking if jailed')
68
- Facter::Resolvers::Freebsd::Virtual.resolve(:vm)
69
- end
70
-
71
- def check_other_facts
72
- @log.debug('Checking others')
73
- product_name = Facter::Resolvers::Linux::DmiBios.resolve(:product_name)
74
- bios_vendor = Facter::Resolvers::Linux::DmiBios.resolve(:bios_vendor)
75
- return 'kvm' if bios_vendor&.include?('Amazon EC2')
76
- return unless product_name
77
-
78
- Facter::Util::Facts::HYPERVISORS_HASH.each { |key, value| return value if product_name.include?(key) }
79
-
80
- nil
81
- end
82
-
83
- def check_lspci
84
- @log.debug('Checking lspci')
85
- Facter::Resolvers::Lspci.resolve(:vm)
86
- end
87
- end
88
- end
89
- end
90
- end