Module: UsefulUtilities::IP

Extended by:
IP
Included in:
IP
Defined in:
lib/useful_utilities/ip.rb

Overview

Provides a bunch of convinient methods to deal with ip addresses The module rely on stdlib ipaddr

Instance Method Summary collapse

Instance Method Details

#acceptable_network_mask?(network_mask, version:) ⇒ Boolean

ArgumentError raises if version is not equal 4 or 6.

Examples:

UsefulUtilities::IP.acceptable_network_mask?('not int', version: 4) #=> false
UsefulUtilities::IP.acceptable_network_mask?(24, version: 4) #=> true


177
178
179
180
181
# File 'lib/useful_utilities/ip.rb', line 177

def acceptable_network_mask?(network_mask, version:)
  return false unless network_mask.is_a? Integer

  network_mask >= MIN_NET_MASK && network_mask <= max_network_mask(version)
end

#integer_to_ip_string(address, version:) ⇒ Object

If supplied address can not be converted into ip address string then ArgumentError raises.

Examples:

UsefulUtilities::IP.integer_to_ip_string(1,version: 4) #=> '0.0.0.1'
UsefulUtilities::IP.integer_to_ip_string(1,version: 6) #=> '::1'


97
98
99
100
101
102
103
104
105
# File 'lib/useful_utilities/ip.rb', line 97

def integer_to_ip_string(address, version:)
  unless address.is_a? Integer
    raise ArgumentError, 'Supplied address is not integer!'
  end

  IPAddr.new(address, ip_address_family(version)).to_s
rescue IPAddr::InvalidAddressError, IPAddr::AddressFamilyError
  raise ArgumentError, 'Invalid address!'
end

#ip_string_to_integer(ip_string) ⇒ Object

ArgumentError raises if ip string can not be parsed as ip address.

Examples:

UsefulUtilities::IP.ip_string_to_integer('0.0.0.2') #=> 2
UsefulUtilities::IP.ip_string_to_integer('::2') #=> 2


113
114
115
116
117
# File 'lib/useful_utilities/ip.rb', line 113

def ip_string_to_integer(ip_string)
  IPAddr.new(ip_string).to_i
rescue IPAddr::InvalidAddressError, IPAddr::AddressFamilyError
  raise ArgumentError, 'Invalid ip address string supplied!'
end

#ip_string_to_integer_with_version(ip_string) ⇒ Object

the first: integer representation of supplied ip string, the second: version of ip protocol 4 or 6. ArgumentError raises if ip string can not be parsed as ip address.

Examples:

UsefulUtilities::IP.ip_string_to_integer_with_version('0.0.0.1') #=> [1, 4]
UsefulUtilities::IP.ip_string_to_integer_with_version('::1') #=> [1, 6]


127
128
129
130
131
132
133
134
135
# File 'lib/useful_utilities/ip.rb', line 127

def ip_string_to_integer_with_version(ip_string)
  ip = IPAddr.new(ip_string)
  version = IPV4 if ip.ipv4?
  version = IPV6 if ip.ipv6?

  [ip.to_i, version]
rescue IPAddr::InvalidAddressError, IPAddr::AddressFamilyError
  raise ArgumentError, 'Invalid ip address string supplied!'
end

#network_address(ip_string, network_mask) ⇒ String

ip address and it’s network mask

Examples:

UsefulUtilities::IP.network_address('10.10.15.33', 24) #=> "10.10.15.0"


143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/useful_utilities/ip.rb', line 143

def network_address(ip_string, network_mask)
  ip = IPAddr.new(ip_string)

  version = if ip.ipv4?
              IPV4
            elsif ip.ipv6?
              IPV6
            else
              raise ArgumentError, 'Unsupported ip address version!'
            end

  unless acceptable_network_mask?(network_mask, version: version)
    raise ArgumentError,
          "Invalid network mask: '#{network_mask}' for address: '#{ip_string}'"
  end

  ip_network_address =
    IPAddr.new(ZERO_IP_INTEGER, ip_address_family(version))
          .~
          .<<(max_network_mask(version) - network_mask)
          .&(ip)

  ip_network_address.to_s
rescue IPAddr::InvalidAddressError, IPAddr::AddressFamilyError
  raise ArgumentError, 'Invalid ip address string supplied!'
end

#private_ip?(ip_string) ⇒ Boolean

If ip_sting is non-parsable ip address ArgumentError raises. It is a wrapper on the private? method of IPAddr class instance. IPv4 addresses in 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16 as defined in RFC 1918 and IPv6 Unique Local Addresses in fc00::/7 as defined in RFC 4193 are considered private.

Examples:

UsefulUtilities::IP.private_ip?('10.10.10.10') #=> true
UsefulUtilities::IP.private_ip?('8.10.10.10') #=> false


77
78
79
80
81
82
83
84
85
86
87
# File 'lib/useful_utilities/ip.rb', line 77

def private_ip?(ip_string)
  ip = IPAddr.new(ip_string)

  # starting from ruby 2.5.0 an IPAddr instance has built-in private? method
  # use the built-in method if exists
  return ip.private? if ip.respond_to?(:private?)

  check_private_ip(ip)
rescue IPAddr::InvalidAddressError, IPAddr::AddressFamilyError
  raise ArgumentError, 'Invalid ip address string supplied!'
end

#valid_ip?(ip_string) ⇒ Boolean

and false otherwise

Examples:

UsefulUtilities::IP.valid_ip('10.10.0.1') #=> true
UsefulUtilities::IP.valid_ip('non-parsable-ip') #=> false


60
61
62
63
64
65
# File 'lib/useful_utilities/ip.rb', line 60

def valid_ip?(ip_string)
  IPAddr.new(ip_string)
  true
rescue IPAddr::InvalidAddressError, IPAddr::AddressFamilyError
  false
end