Class: NetworkUtils

Inherits:
Object
  • Object
show all
Defined in:
lib/resolvers/windows/ffi/network_utils.rb

Class Method Summary collapse

Class Method Details

.address_to_string(addr) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 6

def address_to_string(addr)
  return if addr[:lpSockaddr] == FFI::Pointer::NULL

  size = FFI::MemoryPointer.new(NetworkingFFI::INET6_ADDRSTRLEN + 1)
  buffer = FFI::MemoryPointer.new(:wchar, NetworkingFFI::INET6_ADDRSTRLEN + 1)
  error = nil
  3.times do
    error = NetworkingFFI::WSAAddressToStringW(addr[:lpSockaddr], addr[:iSockaddrLength],
                                               FFI::Pointer::NULL, buffer, size)
    break if error.zero?
  end
  unless error.zero?
    @log.debug 'address to string translation failed!'
    return
  end
  extract_address(buffer)
end

.build_binding(addr, mask_length) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 38

def build_binding(addr, mask_length)
  ip = IPAddr.new(addr)
  mask = if ip.ipv6?
           IPAddr.new('ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff').mask(mask_length)
         else
           IPAddr.new('255.255.255.255').mask(mask_length)
         end
  { address: addr, netmask: mask, network: ip.mask(mask_length) }
end

.extract_address(addr) ⇒ Object



24
25
26
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 24

def extract_address(addr)
  addr.read_wide_string_without_length.split('%').first
end

.find_mac_address(adapter) ⇒ Object



32
33
34
35
36
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 32

def find_mac_address(adapter)
  adapter[:PhysicalAddress].first(adapter[:PhysicalAddressLength])
                           .map { |e| format('%<mac_address>02x', mac_address: e.to_i) }
                           .join(':').upcase
end

.get_scope(sockaddr) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 48

def get_scope(sockaddr)
  require 'socket'
  scope6 = []
  addrinfo = Addrinfo.new(['AF_INET6', 0, nil, sockaddr], :INET6)

  scope6 << 'compat,' if addrinfo.ipv6_v4compat?
  scope6 << if addrinfo.ipv6_linklocal?
              'link'
            elsif addrinfo.ipv6_sitelocal?
              'site'
            elsif addrinfo.ipv6_loopback?
              'host'
            else 'global'
            end
  scope6.join
end

.ignored_ip_address(addr) ⇒ Object



28
29
30
# File 'lib/resolvers/windows/ffi/network_utils.rb', line 28

def ignored_ip_address(addr)
  addr.empty? || addr.start_with?('127.', '169.254.') || addr.start_with?('fe80') || addr.eql?('::1')
end