class IPRange::Range

Public Class Methods

new(redis_config={}, redis_key="ip_table") click to toggle source
# File lib/iprange.rb, line 7
def initialize(redis_config={}, redis_key="ip_table")
  @redis = Redis.new redis_config
  @redis_key = redis_key
end

Public Instance Methods

add(range, metadata={}) click to toggle source
# File lib/iprange.rb, line 19
def add(range, metadata={})
  ipaddr_range = IPAddr.new(range).to_range
  range = "#{metadata[:key]}:#{range}" if metadata[:key]
  hash = metadata_key(range)

  @redis.pipelined do
    @redis.iadd(@redis_key, ipaddr_range.first.to_i, ipaddr_range.last.to_i, range)
    @redis.mapped_hmset(hash, metadata) unless metadata.empty?
  end
end
find(ip) click to toggle source
# File lib/iprange.rb, line 30
def find(ip)
  find_all(ip).first
end
find_all(ip) click to toggle source
# File lib/iprange.rb, line 34
def find_all(ip)
  ipaddr = IPAddr.new(ip)
  ranges = @redis.istab(@redis_key, ipaddr.to_i)
  ranges.map do |range|
    metadata = @redis.hgetall(metadata_key(range))
    {range: range}.merge(metadata)
  end
end
metadata_key(range) click to toggle source
# File lib/iprange.rb, line 43
def metadata_key(range)
  "#{@redis_key}:#{range}"
end
remove(range) click to toggle source
# File lib/iprange.rb, line 12
def remove(range)
  @redis.pipelined do
    @redis.irem(@redis_key, range)
    @redis.del(metadata_key(range))
  end
end