43 lines
958 B
Ruby
43 lines
958 B
Ruby
class Ipapi
|
|
include BookoAgent
|
|
BASE_URL = "https://api.ipapi.is/"
|
|
API_KEY = Rails.application.credentials.ipapi_key
|
|
|
|
def lookup(ip) = json_at("#{BASE_URL}?q=#{ip}&key=#{API_KEY}")
|
|
|
|
def self.lookup(ip) = new.lookup(ip)
|
|
|
|
def multi_lookup(ips)
|
|
ips = Array(ips)
|
|
ips.each_slice(100).flat_map { |slice| post_data({ips: slice}) }
|
|
end
|
|
|
|
def data(ip)
|
|
uri = URI.parse(BASE_URL)
|
|
|
|
if ip.is_a?(Array)
|
|
post_data(ip)
|
|
else
|
|
uri.query = "q=#{ip}"
|
|
JSON.parse(http.request(uri).body)
|
|
end
|
|
rescue JSON::ParserError
|
|
{}
|
|
end
|
|
|
|
def post_data(ips)
|
|
url = URI.parse(BASE_URL + "?key=#{API_KEY}")
|
|
|
|
results = post_json(url, body: ips)
|
|
|
|
results["response"].map do |ip, data|
|
|
IPAddr.new(ip)
|
|
cidr = data.dig("asn", "route")
|
|
|
|
NetworkRange.add_network(cidr).tap { |acl| acl&.update(ip_api_data: data) }
|
|
rescue IPAddr::InvalidAddressError
|
|
puts "Skipping #{ip}"
|
|
next
|
|
end
|
|
end
|
|
end |