Module: WifiWand::IPAddressExtractor

Defined in:
lib/wifi_wand/services/ip_address_extractor.rb

Class Method Summary collapse

Class Method Details

.address_from_line(line, line_type:, family:) ⇒ Object



13
14
15
16
17
18
# File 'lib/wifi_wand/services/ip_address_extractor.rb', line 13

def self.address_from_line(line, line_type:, family:)
  tokens = line.split
  return nil unless tokens.first == line_type

  normalized_address(tokens[1], family: family)
end

.addresses(output, line_type:, family:) ⇒ Object



7
8
9
10
11
# File 'lib/wifi_wand/services/ip_address_extractor.rb', line 7

def self.addresses(output, line_type:, family:)
  output.each_line.filter_map do |line|
    address_from_line(line, line_type: line_type, family: family)
  end
end

.expected_family?(address, family) ⇒ Boolean

Returns:

  • (Boolean)


33
34
35
36
37
38
39
40
41
42
# File 'lib/wifi_wand/services/ip_address_extractor.rb', line 33

def self.expected_family?(address, family)
  case family
  when :ipv4
    address.ipv4?
  when :ipv6
    address.ipv6?
  else
    raise ArgumentError, "Unknown IP address family: #{family.inspect}"
  end
end

.normalized_address(address_token, family:) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/wifi_wand/services/ip_address_extractor.rb', line 20

def self.normalized_address(address_token, family:)
  address = address_token&.split('/')&.first
  address = address&.split('%')&.first if family == :ipv6
  return nil if address.nil? || address.empty?

  parsed_address = IPAddr.new(address)
  return nil unless expected_family?(parsed_address, family)

  address
rescue IPAddr::InvalidAddressError
  nil
end