Class: GeoLoc
- Inherits:
-
Object
- Object
- GeoLoc
- Defined in:
- lib/geo_loc.rb,
lib/geo_loc/version.rb
Overview
Geolocates given IP using maxminds geo ip database Pulls database down if it doesnt exists Note that in test environment (outside of mocked unit tests), will pull the ~11mb file, leading to lengthened initial test run
Constant Summary collapse
- VERSION =
"0.0.1"
Instance Attribute Summary collapse
-
#compressed_geodata_file ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’.
-
#filename ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’.
-
#geodata_dir ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’.
-
#geodata_file ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’.
-
#geodata_url ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’.
-
#logger ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’.
Instance Method Summary collapse
- #decompress_geodata ⇒ Object
- #download_compressed_geodata ⇒ Object
-
#initialize(filename: nil, geodata_dir: nil, geodata_file: nil, compressed_geodata_file: nil, geodata_url: nil, logger: nil) ⇒ GeoLoc
constructor
A new instance of GeoLoc.
- #ip(ip_address) ⇒ Object
- #logger_method ⇒ Object
- #root_dir ⇒ Object
- #sync_data! ⇒ Object
Constructor Details
#initialize(filename: nil, geodata_dir: nil, geodata_file: nil, compressed_geodata_file: nil, geodata_url: nil, logger: nil) ⇒ GeoLoc
Returns a new instance of GeoLoc.
19 20 21 22 23 24 25 26 |
# File 'lib/geo_loc.rb', line 19 def initialize(filename: nil, geodata_dir: nil, geodata_file: nil, compressed_geodata_file: nil, geodata_url: nil, logger: nil) self.filename = filename || 'GeoLiteCity.dat' self.geodata_dir = geodata_dir || root_dir self.geodata_file = geodata_file || File.join(self.geodata_dir, self.filename) self.compressed_geodata_file = compressed_geodata_file || self.geodata_file + '.gz' self.geodata_url = geodata_url || 'http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz' self.logger = logger || logger_method end |
Instance Attribute Details
#compressed_geodata_file ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’
17 18 19 |
# File 'lib/geo_loc.rb', line 17 def compressed_geodata_file @compressed_geodata_file end |
#filename ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’
17 18 19 |
# File 'lib/geo_loc.rb', line 17 def filename @filename end |
#geodata_dir ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’
17 18 19 |
# File 'lib/geo_loc.rb', line 17 def geodata_dir @geodata_dir end |
#geodata_file ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’
17 18 19 |
# File 'lib/geo_loc.rb', line 17 def geodata_file @geodata_file end |
#geodata_url ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’
17 18 19 |
# File 'lib/geo_loc.rb', line 17 def geodata_url @geodata_url end |
#logger ⇒ Object
FILENAME = ‘GeoLiteCity.dat’ GEODATA_FILE = File.join(Rails.root, ‘/tmp/’, FILENAME) COMPRESSED_GEODATA_FILE = File.join(Rails.root, FILENAME + ‘.gz’) GEODATA_URL = ‘geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz’
17 18 19 |
# File 'lib/geo_loc.rb', line 17 def logger @logger end |
Instance Method Details
#decompress_geodata ⇒ Object
36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/geo_loc.rb', line 36 def decompress_geodata logger.info "Decompressing #{compressed_geodata_file}" File.open(compressed_geodata_file) do |cf| begin gz = Zlib::GzipReader.new(cf) File.open(geodata_file, 'w'){|f| f << gz.read} ensure gz.close end end end |
#download_compressed_geodata ⇒ Object
31 32 33 34 |
# File 'lib/geo_loc.rb', line 31 def download_compressed_geodata logger.info "Downloading geodata #{geodata_url}" open(compressed_geodata_file, 'wb') {|f| f << open(geodata_url).read } end |
#ip(ip_address) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/geo_loc.rb', line 53 def ip ip_address begin if @data_exists || File.exist?(geodata_file) @data_exists = true else sync_data! end @geoip ||= GeoIP.new(geodata_file) @geoip.city(ip_address).try(:to_hash) rescue StandardError => e logger.error "Failed to geo ip address #{ip_address}\n#{e}\n#{e.backtrace.join("\n")}" nil end end |
#logger_method ⇒ Object
28 |
# File 'lib/geo_loc.rb', line 28 def logger_method; defined?(Rails) && Rails.respond_to?(:logger) ? Rails.logger : Logger.new('/tmp/geoloc.log'); end |
#root_dir ⇒ Object
29 |
# File 'lib/geo_loc.rb', line 29 def root_dir; defined?(Rails) && Rails.respond_to?(:root) ? File.join(Rails.root, '/tmp') : '/tmp'; end |
#sync_data! ⇒ Object
48 49 50 51 |
# File 'lib/geo_loc.rb', line 48 def sync_data! download_compressed_geodata decompress_geodata end |