Skip to content

Instantly share code, notes, and snippets.

@changa
Last active December 1, 2015 11:24
Show Gist options
  • Save changa/995b24abd0b6c1dd9799 to your computer and use it in GitHub Desktop.
Save changa/995b24abd0b6c1dd9799 to your computer and use it in GitHub Desktop.
IP ranges directory
#!/usr/bin/env ruby
require "ipaddr"
module IPCat
class Datacenter
attr_reader :range, :name, :url
def initialize(start_addr, end_addr, name, url = nil)
@range = make_range(start_addr, end_addr)
@name = name
@url = url
end
def include?(ip)
range.include?(ip)
end
def valid?
!! @range
end
private
def make_range(start_addr, end_addr)
range = 32 - Math.log2(1 + IPAddr.new(end_addr).to_i - IPAddr.new(start_addr).to_i).to_i
IPAddr.new("#{start_addr}/#{range}").to_range rescue nil
end
end
def self.parse_file(file)
@ranges = File.open(file, "r").readlines.map do |line|
Datacenter.new(*line.chomp.split(','))
end.select(&:valid?)
end
def self.find(ip)
return if @ranges.empty?
addr = IPAddr.new(ip)
@ranges.detect {|range| range.include?(addr)}
end
end
IPCat.parse_file("/tmp/datacenters.csv")
puts IPCat.find("5.34.182.2").inspect # => #<IPAddr: IPv4:5.34.182.0/255.255.254.0>..#<IPAddr: IPv4:5.34.183.255/255.255.254.0>
puts IPCat.find("23.97.172.212").inspect
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment