-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathip_address_api.rb
71 lines (56 loc) · 1.91 KB
/
ip_address_api.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
require 'kredis'
require 'open-uri'
class IpAddressApi
# Outside of Rails, configure Kredis like:
# Kredis::Connections.connections[:shared] = Redis.new(url: "redis://localhost:6379/0")
attr_accessor :prefix, :agent, :cache_only, :ttl
def initialize(prefix: IpAddressApi.prefix, agent: IpAddressApi.agent, cache_only: false, ttl: 60 * 60 * 24)
@cache_only = cache_only
@prefix = prefix
@agent = agent
@ttl = ttl
end
def key_name(ip) = "#{@prefix}#{ip}"
def hit_counter = @hit_counter ||= Kredis.counter("#{prefix}hits")
def miss_counter = @miss_counter ||= Kredis.counter("#{prefix}miss")
def stats
hit = hit_counter.value
miss = miss_counter.value
{hit: hit, miss:, total: hit + miss}
end
def hitrate
hit = hit_counter.value
miss = miss_counter.value
hit / (hit + miss).to_f
end
def reset_stats
hit_counter.reset
miss_counter.reset
end
def lookup(ip=nil)
return {} if ip.nil?
ip_data = Kredis.json(key_name(ip), expires_in: ttl)
if ip_data.value.blank? && cache_only == true
miss!
elsif ip_data.value.blank? && cache_only == false
miss!
ip_data.value = JSON.parse( URI.open("https://api.incolumitas.com/?q=#{ip}", "User-Agent" => agent).read)
ip_data.value ||= {}
else
hit!
end
return ip_data.value
rescue OpenURI::HTTPError => e
puts("IP Address API error looking up IP: #{ip} : #{e.inspect}")
return {}
end
def self.prefix = 'IpAddressApi_'
def self.agent = "Ruby/#{RUBY_VERSION}"
def self.stats = IpAddressApi.new.stats
def self.reset_stats = IpAddressApi.new.reset_stats
def self.hitrate = IpAddressApi.new.hit_rate
def self.lookup(ip=nil, cache_only: false, agent: nil) = IpAddressApi.new(cache_only:, agent:).lookup(ip)
private
def hit! = hit_counter.increment
def miss! = miss_counter.increment
end