diff --git a/lib/facter/resolvers/networking.rb b/lib/facter/resolvers/networking.rb index 9fbd9edc2a..51dd1be759 100644 --- a/lib/facter/resolvers/networking.rb +++ b/lib/facter/resolvers/networking.rb @@ -80,28 +80,35 @@ def extract_dhcp(interface_name, raw_data, parsed_interface_data) end def extract_ip_data(raw_data, parsed_interface_data) - ip = extract_values(raw_data, /inet (\S+)/) - mask = extract_values(raw_data, /netmask (\S+)/).map { |val| val.hex.to_s(2).count('1') } + inets = extract_values(raw_data, /inet (\S+).+netmask (\S+)/, :extract_ip4_data) + bindings = create_bindings(inets) + parsed_interface_data[:bindings] = bindings unless bindings.empty? - ip6 = extract_values(raw_data, /inet6 (\S+)/).map { |val| val.gsub(/%.+/, '') } - mask6 = extract_values(raw_data, /prefixlen (\S+)/) - - parsed_interface_data[:bindings] = create_bindings(ip, mask) unless ip.empty? - parsed_interface_data[:bindings6] = create_bindings(ip6, mask6) unless ip6.empty? + inets = extract_values(raw_data, /inet6 (\S+).+prefixlen (\S+)/, :extract_ip6_data) + bindings = create_bindings(inets) + parsed_interface_data[:bindings6] = bindings unless bindings.empty? end - def extract_values(data, regex) + def extract_values(data, regex, ip_func) results = [] - data.scan(regex).flatten.each do |val| - results << val + data.scan(regex).flatten.each_slice(2) do |val| + results << method(ip_func).call(val) end results end - def create_bindings(ips, masks) + def extract_ip4_data(inet) + [inet[0], inet[1].hex.to_s(2).count('1')] + end + + def extract_ip6_data(inet) + [inet[0].gsub(/%.+/, ''), inet[1]] + end + + def create_bindings(inets) bindings = [] - ips.zip(masks).each do |ip, mask| - bindings << Facter::Util::Resolvers::Networking.build_binding(ip, mask) + inets.each do |inet| + bindings << Facter::Util::Resolvers::Networking.build_binding(inet[0], inet[1]) end bindings end diff --git a/spec/facter/resolvers/networking_spec.rb b/spec/facter/resolvers/networking_spec.rb index 32e4511595..d583164500 100644 --- a/spec/facter/resolvers/networking_spec.rb +++ b/spec/facter/resolvers/networking_spec.rb @@ -5,10 +5,6 @@ let(:log_spy) { instance_spy(Facter::Log) } - before do - pending 'contains failing tests to reproduce a bug' - end - describe '#resolve' do before do networking.instance_variable_set(:@log, log_spy) @@ -44,7 +40,7 @@ end it 'detects all interfaces' do - expected = %w[lo0 gif0 stf0 en0 en0.1 en1 en2 bridge0 p2p0 awdl0 llw0 utun0 utun1 utun2 utun3 ib0 ib1] + expected = %w[lo0 gif0 stf0 en0 en0.1 en1 en2 bridge0 p2p0 awdl0 llw0 utun0 utun1 utun2 utun3 utun4 utun5 ib0 ib1] expect(networking.resolve(:interfaces).keys).to match_array(expected) end @@ -142,6 +138,19 @@ expect(networking.resolve(:interfaces)['utun3']).to include(expected) end + it 'checks interface utun4' do + expected = { bindings: [{ address: '192.0.2.100', netmask: '255.255.255.255', network: '192.0.2.100' }] } + expect(networking.resolve(:interfaces)['utun4']).to include(expected) + end + + it 'checks interface utun5' do + expected = { bindings6: [ + { address: '2001:db8::1', netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', + network: '2001:db8::1', scope6: 'global' } + ] } + expect(networking.resolve(:interfaces)['utun5']).to include(expected) + end + it 'checks interface ib0 has the expected mac' do expected = { mac: '80:00:02:08:FA:81:00:00:00:00:00:00:00:00:00:00:00:00:00:00' } expect(networking.resolve(:interfaces)['ib0']).to include(expected) @@ -160,7 +169,6 @@ it 'returns dhcp server ip as nil' do expect(networking.resolve(:dhcp)).to be(nil) - raise end end @@ -169,7 +177,6 @@ it 'returns interfaces as nil' do expect(networking.resolve(:interfaces)).to be(nil) - raise end end end