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.
- checksums.yaml +4 -4
- data/lib/docs/generate_cli.rb +7 -0
- data/lib/facter.rb +90 -56
- data/lib/facter/config.rb +2 -0
- data/lib/facter/custom_facts/core/aggregate.rb +9 -0
- data/lib/facter/custom_facts/core/execution/base.rb +7 -3
- data/lib/facter/custom_facts/core/execution/popen3.rb +13 -1
- data/lib/facter/custom_facts/core/execution/posix.rb +2 -2
- data/lib/facter/custom_facts/core/execution/windows.rb +1 -1
- data/lib/facter/custom_facts/core/resolvable.rb +11 -0
- data/lib/facter/custom_facts/util/collection.rb +5 -0
- data/lib/facter/custom_facts/util/directory_loader.rb +1 -1
- data/lib/facter/custom_facts/util/normalization.rb +7 -2
- data/lib/facter/custom_facts/util/resolution.rb +2 -0
- data/lib/facter/custom_facts/util/windows_root.rb +2 -1
- data/lib/facter/facts/aix/processors/cores.rb +16 -0
- data/lib/facter/facts/aix/processors/threads.rb +16 -0
- data/lib/facter/facts/amzn/lsbdistcodename.rb +16 -0
- data/lib/facter/facts/amzn/lsbdistdescription.rb +16 -0
- data/lib/facter/facts/amzn/lsbdistid.rb +16 -0
- data/lib/facter/facts/amzn/os/distro/codename.rb +24 -0
- data/lib/facter/facts/amzn/os/distro/description.rb +21 -0
- data/lib/facter/facts/amzn/os/distro/id.rb +21 -0
- data/lib/facter/facts/amzn/os/distro/release.rb +32 -0
- data/lib/facter/facts/freebsd/is_virtual.rb +1 -5
- data/lib/facter/facts/freebsd/virtual.rb +1 -2
- data/lib/facter/facts/linux/az_metadata.rb +23 -0
- data/lib/facter/facts/linux/cloud/provider.rb +20 -0
- data/lib/facter/facts/linux/dhcp_servers.rb +2 -2
- data/lib/facter/facts/linux/ec2_metadata.rb +1 -5
- data/lib/facter/facts/linux/ec2_userdata.rb +1 -5
- data/lib/facter/facts/linux/hypervisors/xen.rb +1 -4
- data/lib/facter/facts/linux/interfaces.rb +1 -1
- data/lib/facter/facts/linux/ipaddress6_interfaces.rb +1 -1
- data/lib/facter/facts/linux/ipaddress_interfaces.rb +1 -1
- data/lib/facter/facts/linux/is_virtual.rb +1 -5
- data/lib/facter/facts/linux/macaddress_interfaces.rb +1 -1
- data/lib/facter/facts/linux/mtu_interfaces.rb +1 -1
- data/lib/facter/facts/linux/netmask6_interfaces.rb +1 -1
- data/lib/facter/facts/linux/netmask_interfaces.rb +1 -1
- data/lib/facter/facts/linux/network6_interfaces.rb +1 -1
- data/lib/facter/facts/linux/network_interfaces.rb +1 -1
- data/lib/facter/facts/linux/networking/dhcp.rb +1 -1
- data/lib/facter/facts/linux/networking/domain.rb +1 -1
- data/lib/facter/facts/linux/networking/fqdn.rb +1 -1
- data/lib/facter/facts/linux/networking/hostname.rb +1 -1
- data/lib/facter/facts/linux/networking/interfaces.rb +1 -1
- data/lib/facter/facts/linux/networking/ip.rb +1 -1
- data/lib/facter/facts/linux/networking/ip6.rb +1 -1
- data/lib/facter/facts/linux/networking/mac.rb +1 -1
- data/lib/facter/facts/linux/networking/mtu.rb +1 -1
- data/lib/facter/facts/linux/networking/netmask.rb +1 -1
- data/lib/facter/facts/linux/networking/netmask6.rb +1 -1
- data/lib/facter/facts/linux/networking/network.rb +1 -1
- data/lib/facter/facts/linux/networking/network6.rb +1 -1
- data/lib/facter/facts/linux/networking/primary.rb +1 -1
- data/lib/facter/facts/linux/networking/scope6.rb +1 -1
- data/lib/facter/facts/linux/processors/cores.rb +16 -0
- data/lib/facter/facts/linux/processors/threads.rb +16 -0
- data/lib/facter/facts/linux/scope6_interfaces.rb +1 -1
- data/lib/facter/facts/linux/virtual.rb +1 -2
- data/lib/facter/facts/macosx/os/macosx/version.rb +15 -4
- data/lib/facter/facts/macosx/processors/cores.rb +16 -0
- data/lib/facter/facts/macosx/processors/threads.rb +16 -0
- data/lib/facter/facts/rhel/lsbdistcodename.rb +16 -0
- data/lib/facter/facts/rhel/lsbdistdescription.rb +16 -0
- data/lib/facter/facts/rhel/lsbdistid.rb +16 -0
- data/lib/facter/facts/rhel/os/distro/codename.rb +2 -4
- data/lib/facter/facts/rhel/os/distro/description.rb +2 -4
- data/lib/facter/facts/rhel/os/distro/id.rb +2 -4
- data/lib/facter/facts/rhel/os/distro/release.rb +13 -12
- data/lib/facter/facts/sles/lsbdistcodename.rb +16 -0
- data/lib/facter/facts/sles/lsbdistdescription.rb +16 -0
- data/lib/facter/facts/sles/lsbdistid.rb +16 -0
- data/lib/facter/facts/sles/os/distro/codename.rb +3 -4
- data/lib/facter/facts/sles/os/distro/description.rb +2 -5
- data/lib/facter/facts/sles/os/distro/id.rb +6 -5
- data/lib/facter/facts/sles/os/distro/release.rb +17 -12
- data/lib/facter/facts/solaris/hypervisors/ldom.rb +1 -1
- data/lib/facter/facts/solaris/hypervisors/zone.rb +1 -1
- data/lib/facter/facts/solaris/mountpoints.rb +1 -1
- data/lib/facter/facts/solaris/processors/cores.rb +16 -0
- data/lib/facter/facts/solaris/processors/threads.rb +16 -0
- data/lib/facter/facts/ubuntu/lsbdistrelease.rb +2 -2
- data/lib/facter/facts/windows/az_metadata.rb +23 -0
- data/lib/facter/facts/windows/cloud/provider.rb +21 -0
- data/lib/facter/facts/windows/ec2_metadata.rb +1 -1
- data/lib/facter/facts/windows/ec2_userdata.rb +1 -1
- data/lib/facter/facts/windows/gce.rb +1 -1
- data/lib/facter/facts/windows/hypervisors/hyperv.rb +1 -1
- data/lib/facter/facts/windows/hypervisors/kvm.rb +2 -1
- data/lib/facter/facts/windows/hypervisors/virtualbox.rb +2 -2
- data/lib/facter/facts/windows/hypervisors/vmware.rb +1 -1
- data/lib/facter/facts/windows/hypervisors/xen.rb +3 -1
- data/lib/facter/facts/windows/is_virtual.rb +15 -0
- data/lib/facter/facts/windows/{virtualization/is_virtual.rb → processors/cores.rb} +4 -4
- data/lib/facter/facts/windows/{virtualization/virtual.rb → processors/threads.rb} +4 -4
- data/lib/facter/facts/windows/virtual.rb +15 -0
- data/lib/facter/framework/cli/cli.rb +6 -8
- data/lib/facter/framework/config/config_reader.rb +2 -0
- data/lib/facter/framework/config/fact_groups.rb +25 -2
- data/lib/facter/framework/core/cache_manager.rb +7 -3
- data/lib/facter/framework/core/fact/external/external_fact_manager.rb +0 -1
- data/lib/facter/framework/core/fact/internal/internal_fact_manager.rb +41 -39
- data/lib/facter/framework/core/fact_filter.rb +5 -15
- data/lib/facter/framework/core/fact_loaders/external_fact_loader.rb +9 -6
- data/lib/facter/framework/core/fact_loaders/fact_loader.rb +39 -37
- data/lib/facter/framework/core/fact_manager.rb +84 -14
- data/lib/facter/framework/core/file_loader.rb +1 -1
- data/lib/facter/framework/core/options.rb +1 -2
- data/lib/facter/framework/core/options/config_file_options.rb +7 -0
- data/lib/facter/framework/core/options/option_store.rb +12 -6
- data/lib/facter/framework/formatters/formatter_helper.rb +3 -5
- data/lib/facter/framework/logging/logger.rb +4 -4
- data/lib/facter/framework/parsers/query_parser.rb +5 -12
- data/lib/facter/models/fact_collection.rb +48 -5
- data/lib/facter/models/resolved_fact.rb +2 -3
- data/lib/facter/models/searched_fact.rb +2 -3
- data/lib/facter/resolvers/aix/ffi/ffi_helper.rb +1 -1
- data/lib/facter/resolvers/aix/processors.rb +4 -0
- data/lib/facter/resolvers/az.rb +39 -0
- data/lib/facter/resolvers/base_resolver.rb +2 -2
- data/lib/facter/resolvers/dmi_decode.rb +0 -1
- data/lib/facter/resolvers/linux/hostname.rb +126 -0
- data/lib/facter/resolvers/linux/networking.rb +124 -0
- data/lib/facter/resolvers/macosx/mountpoints.rb +14 -1
- data/lib/facter/resolvers/macosx/processor.rb +16 -1
- data/lib/facter/resolvers/mountpoints.rb +16 -8
- data/lib/facter/resolvers/networking.rb +3 -2
- data/lib/facter/resolvers/partitions.rb +1 -1
- data/lib/facter/resolvers/processors_lscpu.rb +44 -0
- data/lib/facter/resolvers/redhat_release.rb +28 -12
- data/lib/facter/resolvers/ruby.rb +1 -1
- data/lib/facter/resolvers/selinux.rb +5 -7
- data/lib/facter/resolvers/solaris/ffi/functions.rb +1 -1
- data/lib/facter/resolvers/solaris/ffi/structs.rb +12 -0
- data/lib/facter/resolvers/solaris/mountpoints.rb +22 -16
- data/lib/facter/resolvers/solaris/networking.rb +20 -5
- data/lib/facter/resolvers/solaris/processors.rb +7 -0
- data/lib/facter/resolvers/solaris/zone.rb +0 -1
- data/lib/facter/resolvers/windows/ffi/identity_ffi.rb +5 -0
- data/lib/facter/resolvers/windows/identity.rb +1 -6
- data/lib/facter/resolvers/windows/processors.rb +41 -4
- data/lib/facter/resolvers/windows/uptime.rb +3 -22
- data/lib/facter/resolvers/windows/virtualization.rb +46 -44
- data/lib/facter/resolvers/xen.rb +6 -1
- data/lib/facter/templates/man.erb +13 -5
- data/lib/facter/util/facts/posix/virtual_detector.rb +74 -0
- data/lib/facter/util/facts/unit_converter.rb +2 -2
- data/lib/facter/util/linux/dhcp.rb +86 -0
- data/lib/facter/util/linux/if_inet6.rb +73 -0
- data/lib/facter/util/linux/routing_table.rb +60 -0
- data/lib/facter/util/linux/socket_parser.rb +114 -0
- data/lib/facter/util/resolvers/ffi/hostname.rb +70 -0
- data/lib/facter/util/resolvers/http.rb +7 -1
- data/lib/facter/util/resolvers/networking/primary_interface.rb +11 -5
- data/lib/facter/util/utils.rb +18 -1
- data/lib/facter/version.rb +1 -1
- metadata +63 -13
- data/lib/facter/facts/linux/cloud.rb +0 -15
- data/lib/facter/framework/core/fact_augmenter.rb +0 -37
- data/lib/facter/resolvers/cloud.rb +0 -39
- data/lib/facter/resolvers/networking_linux.rb +0 -296
- 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
|