class Net::Address::IPv4

Attributes

mask[R]

Public Class Methods

new(address, mask=nil) click to toggle source
# File lib/net/address/ipv4.rb, line 16
def initialize(address, mask=nil)
  parse_address(address)
  if @mask.nil?
    @mask = Net::Address::Mask.new(mask.nil? ? 32 : mask)
  else
    raise ArgumentError, 'To many parameters' unless mask.nil?
  end
end

Public Instance Methods

<=>(other) click to toggle source
# File lib/net/address/ipv4.rb, line 37
def <=>(other)
  self.to_i <=> (other.is_a?(self.class) ? other.to_i : self.class.new(other).to_i)
end
broadcast() click to toggle source
# File lib/net/address/ipv4.rb, line 50
def broadcast
  self.class.new(range.last, mask)
end
each() { |class.new(address, mask)| ... } click to toggle source
# File lib/net/address/ipv4.rb, line 64
def each
  (net.to_i..broadcast.to_i).each do |address|
    yield self.class.new(address, mask)
  end
end
include?(address) click to toggle source
# File lib/net/address/ipv4.rb, line 41
def include?(address)
  address = address.is_a?(self.class) ? address : self.class.new(address)
  address.to_i >= net.to_i and address <= broadcast.to_i
end
net() click to toggle source
# File lib/net/address/ipv4.rb, line 46
def net
  self.class.new(range.first, mask)
end
next() click to toggle source
# File lib/net/address/ipv4.rb, line 59
def next
  next_address = to_i + 1
  broadcast >= next_address ? self.class.new(next_address) : nil
end
previous() click to toggle source
# File lib/net/address/ipv4.rb, line 54
def previous
  previous = to_i - 1
  net <= previous ? self.class.new(previous) : nil
end
to_i() click to toggle source
# File lib/net/address/ipv4.rb, line 33
def to_i
  @address
end
to_s() click to toggle source
# File lib/net/address/ipv4.rb, line 25
def to_s
  [@address].pack('N*').unpack('C*').join('.')
end
to_str() click to toggle source
# File lib/net/address/ipv4.rb, line 29
def to_str
  "#{to_s}/#{mask.to_cidr}"
end

Private Instance Methods

parse_address(address) click to toggle source
# File lib/net/address/ipv4.rb, line 73
def parse_address(address)
  if address.kind_of?(Net::Address::IPv4)
    @address = address.to_i
    @mask = address.mask
  elsif address.kind_of?(IPAddr)
    @address = address.to_i
  elsif address.kind_of?(Integer)
    parse_integer(address)
  elsif address.kind_of?(String)
    parse_string(address)
  else
    raise ArgumentError, "No implicit conversion of #{address.class.name} to #{self.class.name}"
  end
end
parse_integer(address) click to toggle source
# File lib/net/address/ipv4.rb, line 97
def parse_integer(address)
  @address = address
  if address.to_i < 0 or address.to_i > 0xffffffffffff
    raise ArgumentError, "No implicit conversion of #{address.class.name} : #{address} to #{self.class.name}"
  end
end
parse_string(address) click to toggle source
# File lib/net/address/ipv4.rb, line 88
def parse_string(address)
  address = address.strip
  match_data = address.match(/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\/?(\d{1,2})*$/)
  raise ArgumentError,"No valid IPv4 address #{address}" if match_data.nil?
  @address = match_data[1].split(/\./).map{|c| c.to_i}.pack('C*').unpack('N').first
  @mask = Net::Address::Mask.new(match_data[2]) unless match_data[2].nil?
  raise ArgumentError, "No valid IPv4 address #{address}" unless self.to_s == match_data[1]
end
range() click to toggle source
# File lib/net/address/ipv4.rb, line 104
def range
  bits = mask.to_i & 0xFFFFFFFF
  min = bits & to_i
  max = min + (bits ^ 0xFFFFFFFF)
  [min, max]
end