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

Parameters:

  • network_mask (Integer)
  • version (Integer)

Returns:

  • (Boolean)


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'

Parameters:

  • address (Integer)
  • version.

    If version is not equal 4 or 6 ArgumentError raises.

Returns:

  • string as human readable ip address.



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

Parameters:

  • ip_string (String)

Returns:

  • integer representation of supplied ip string.



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]

Parameters:

  • ip_string (String)

Returns:

  • array of 2 elements,



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"

Parameters:

  • ip_string (String)
  • network_mask (Integer)

Returns:

  • (String)

    value representing network address derived from supplied



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

Parameters:

  • ip_string (String)

Returns:

  • (Boolean)

    true if ip_string represent private ip address.



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

Parameters:

  • ip_string (String)

Returns:

  • (Boolean)

    true if supplied string is parsable ip address string



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