geoip 0.8.1 → 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -1,24 +1,7 @@
1
1
  History.txt
2
- License.txt
3
2
  Manifest.txt
4
- README.txt
3
+ README.rdoc
5
4
  Rakefile
6
- config/hoe.rb
7
- config/requirements.rb
8
5
  lib/geoip.rb
9
- lib/geoip/version.rb
10
- log/debug.log
11
- script/destroy
12
- script/generate
13
- script/txt2html
14
- setup.rb
15
- tasks/deployment.rake
16
- tasks/environment.rake
17
- tasks/website.rake
18
6
  test/test_geoip.rb
19
7
  test/test_helper.rb
20
- website/index.html
21
- website/index.txt
22
- website/javascripts/rounded_corners_lite.inc.js
23
- website/stylesheets/screen.css
24
- website/template.rhtml
@@ -1,6 +1,6 @@
1
- = GeoIP
1
+ = geoip
2
2
 
3
- http://geoip.rubyforge.org/
3
+ * http://github.com/cjheath/geoip
4
4
 
5
5
  == DESCRIPTION:
6
6
 
@@ -10,20 +10,24 @@ and the city, ISP and other information, if you have that database version.
10
10
 
11
11
  == FEATURES/PROBLEMS:
12
12
 
13
- This release applies a Mutex around file I/O operations, which should
14
- prevent GeoIP blowing up under multi-threaded usage.
13
+ This release adds support for ASN data files, thanks to Roland Matiz
15
14
 
16
15
  == SYNOPSIS:
17
16
 
18
- require 'geoip'
19
- GeoIP.new('GeoIP.dat').country("www.netscape.sk")
20
- => ["www.netscape.sk", "217.67.16.35", 196, "SK", "SVK", "Slovakia", "EU"]
17
+ require 'geoip'
18
+ GeoIP.new('GeoIP.dat').country("www.netscape.sk")
19
+ => ["www.netscape.sk", "217.67.16.35", 196, "SK", "SVK", "Slovakia", "EU"]
20
+
21
+ GeoIP.new('GeoIPASNum.dat').asn("www.fsb.ru")
22
+ => ["AS8342", "RTComm.RU Autonomous System"]
21
23
 
22
24
  == REQUIREMENTS:
23
25
 
24
26
  You need at least the free GeoIP.dat, for which the last known download
25
27
  location is <http://www.maxmind.com/download/geoip/database/GeoIP.dat.gz>,
26
28
  or the city database from <http://www.maxmind.com/app/geolitecity>.
29
+ The ASN database location is
30
+ <http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz>.
27
31
 
28
32
  This API requires the file to be decompressed for searching. Other versions
29
33
  of this database are available for purchase which contain more detailed
@@ -38,7 +42,7 @@ sudo gem install geoip
38
42
 
39
43
  (The MIT License)
40
44
 
41
- Copyright (c) 2008 FIX
45
+ Copyright (c) 2009 Clifford Heath
42
46
 
43
47
  Permission is hereby granted, free of charge, to any person obtaining
44
48
  a copy of this software and associated documentation files (the
@@ -58,5 +62,3 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
58
62
  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
59
63
  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
60
64
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
61
-
62
- ==
data/Rakefile CHANGED
@@ -1,4 +1,23 @@
1
- require 'config/requirements'
2
- require 'config/hoe' # setup Hoe + all gem configuration
1
+ require 'rubygems'
2
+ gem 'hoe', '>= 2.1.0'
3
+ require 'hoe'
4
+ require 'fileutils'
5
+ require './lib/geoip'
3
6
 
4
- Dir['tasks/**/*.rake'].each { |rake| load rake }
7
+ Hoe.plugin :newgem
8
+ Hoe.plugin :website
9
+
10
+ # Generate all the Rake tasks
11
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
12
+ $hoe = Hoe.spec 'geoip' do
13
+ self.developer 'Clifford Heath', 'clifford.heath@gmail.com'
14
+ self.developer 'Roland Moriz', 'rmoriz@gmail.com'
15
+ self.rubyforge_name = self.name # TODO this is default value
16
+ end
17
+
18
+ require 'newgem/tasks'
19
+ Dir['tasks/**/*.rake'].each { |t| load t }
20
+
21
+ # TODO - want other tests/tasks run by default? Add them to the list
22
+ # remove_task :default
23
+ # task :default => [:spec, :features]
data/lib/geoip.rb CHANGED
@@ -42,10 +42,10 @@ $:.unshift File.dirname(__FILE__)
42
42
  #
43
43
  #=end
44
44
  require 'thread' # Needed for Mutex
45
-
46
45
  require 'socket'
47
46
 
48
47
  class GeoIP
48
+ VERSION = "0.8.4"
49
49
  private
50
50
  CountryCode = [
51
51
  "--","AP","EU","AD","AE","AF","AG","AI","AL","AM","AN",
@@ -411,6 +411,7 @@ class GeoIP
411
411
  STRUCTURE_INFO_MAX_SIZE = 20
412
412
  DATABASE_INFO_MAX_SIZE = 100
413
413
  MAX_ORG_RECORD_LENGTH = 300
414
+ MAX_ASN_RECORD_LENGTH = 300 # unverified
414
415
  US_OFFSET = 1
415
416
  CANADA_OFFSET = 677
416
417
  WORLD_OFFSET = 1353
@@ -436,7 +437,7 @@ class GeoIP
436
437
  @file.seek(-3, IO::SEEK_END)
437
438
  0.upto(STRUCTURE_INFO_MAX_SIZE-1) { |i|
438
439
  if @file.read(3) == "\xFF\xFF\xFF"
439
- @databaseType = @file.getc
440
+ @databaseType = @file.respond_to?(:getbyte) ? @file.getbyte : @file.getc
440
441
  @databaseType -= 105 if @databaseType >= 106
441
442
 
442
443
  if (@databaseType == GEOIP_REGION_EDITION_REV0)
@@ -473,11 +474,6 @@ class GeoIP
473
474
  end
474
475
  end
475
476
 
476
- # Close the file handle for the GeoIP data file.
477
- def close
478
- @file.close
479
- end
480
-
481
477
  # Search the GeoIP database for the specified host, returning country info
482
478
  #
483
479
  # +hostname+ is a String holding the host's DNS name or numeric IP address.
@@ -500,6 +496,7 @@ class GeoIP
500
496
  if ip.kind_of?(String) && ip !~ /^[0-9.]*$/
501
497
  # Lookup IP address, we were given a name
502
498
  ip = IPSocket.getaddress(hostname)
499
+ ip = '0.0.0.0' if ip == '::1'
503
500
  end
504
501
 
505
502
  # Convert numeric IP address to an integer
@@ -541,6 +538,7 @@ class GeoIP
541
538
 
542
539
  # The country code is the first byte:
543
540
  code = record[0]
541
+ code = code.ord if code.respond_to?(:ord)
544
542
  record = record[1..-1]
545
543
  @iter_pos += 1 unless @iter_pos.nil?
546
544
 
@@ -625,6 +623,7 @@ class GeoIP
625
623
  if ip.kind_of?(String) && ip !~ /^[0-9.]*$/
626
624
  # Lookup IP address, we were given a name
627
625
  ip = IPSocket.getaddress(hostname)
626
+ ip = '0.0.0.0' if ip == '::1'
628
627
  end
629
628
 
630
629
  # Convert numeric IP address to an integer
@@ -647,6 +646,7 @@ class GeoIP
647
646
  if ip.kind_of?(String) && ip !~ /^[0-9.]*$/
648
647
  # Lookup IP address, we were given a name
649
648
  ip = IPSocket.getaddress(hostname)
649
+ ip = '0.0.0.0' if ip == '::1'
650
650
  end
651
651
 
652
652
  # Convert numeric IP address to an integer
@@ -663,6 +663,41 @@ class GeoIP
663
663
  record = record.sub(/\000.*/, '')
664
664
  record
665
665
  end
666
+
667
+ # Search a ASN GeoIP database for the specified host, returning the AS number + description
668
+ #
669
+ # +hostname+ is a String holding the host's DNS name or numeric IP address.
670
+ # Return the AS number + description
671
+ #
672
+ # Source:
673
+ # http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz
674
+ #
675
+ def asn(hostname)
676
+ ip = hostname
677
+ if ip.kind_of?(String) && ip !~ /^[0-9.]*$/
678
+ # Lookup IP address, we were given a name
679
+ ip = IPSocket.getaddress(hostname)
680
+ ip = '0.0.0.0' if ip == '::1'
681
+ end
682
+
683
+ # Convert numeric IP address to an integer
684
+ ipnum = iptonum(ip)
685
+ if (@databaseType != GEOIP_ASNUM_EDITION)
686
+ throw "Invalid GeoIP database type, can't look up ASN by IP"
687
+ end
688
+ pos = seek_record(ipnum);
689
+ record = ""
690
+ @mutex.synchronize {
691
+ @file.seek(pos + (2*@record_length-1) * @databaseSegments[0])
692
+ record = @file.read(MAX_ASN_RECORD_LENGTH)
693
+ }
694
+ record = record.sub(/\000.*/, '')
695
+
696
+ if record =~ /^(AS\d+)\s(.*)$/
697
+ # AS####, Description
698
+ return [$1, $2]
699
+ end
700
+ end
666
701
 
667
702
  # Search a ISP GeoIP database for the specified host, returning the organization
668
703
  #
@@ -689,6 +724,7 @@ class GeoIP
689
724
  end
690
725
 
691
726
  private
727
+
692
728
  def iptonum(ip) # Convert numeric IP address to integer
693
729
  if ip.kind_of?(String) &&
694
730
  ip =~ /^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$/
data/test/test_helper.rb CHANGED
@@ -1,2 +1,3 @@
1
+ require 'stringio'
1
2
  require 'test/unit'
2
3
  require File.dirname(__FILE__) + '/../lib/geoip'
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: geoip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clifford Heath
8
+ - Roland Moriz
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2009-06-04 00:00:00 +10:00
13
+ date: 2009-09-04 00:00:00 +10:00
13
14
  default_executable:
14
15
  dependencies:
15
16
  - !ruby/object:Gem::Dependency
@@ -20,53 +21,38 @@ dependencies:
20
21
  requirements:
21
22
  - - ">="
22
23
  - !ruby/object:Gem::Version
23
- version: 1.8.0
24
+ version: 2.3.2
24
25
  version:
25
- description: description of gem
26
- email: cjheath@rubyforge.org
26
+ description: |-
27
+ GeoIP searches a GeoIP database for a given host or IP address, and
28
+ returns information about the country where the IP address is allocated,
29
+ and the city, ISP and other information, if you have that database version.
30
+ email:
31
+ - clifford.heath@gmail.com
32
+ - rmoriz@gmail.com
27
33
  executables: []
28
34
 
29
35
  extensions: []
30
36
 
31
37
  extra_rdoc_files:
32
38
  - History.txt
33
- - License.txt
34
39
  - Manifest.txt
35
- - README.txt
36
- - website/index.txt
37
40
  files:
38
41
  - History.txt
39
- - License.txt
40
42
  - Manifest.txt
41
- - README.txt
43
+ - README.rdoc
42
44
  - Rakefile
43
- - config/hoe.rb
44
- - config/requirements.rb
45
45
  - lib/geoip.rb
46
- - lib/geoip/version.rb
47
- - log/debug.log
48
- - script/destroy
49
- - script/generate
50
- - script/txt2html
51
- - setup.rb
52
- - tasks/deployment.rake
53
- - tasks/environment.rake
54
- - tasks/website.rake
55
46
  - test/test_geoip.rb
56
47
  - test/test_helper.rb
57
- - website/index.html
58
- - website/index.txt
59
- - website/javascripts/rounded_corners_lite.inc.js
60
- - website/stylesheets/screen.css
61
- - website/template.rhtml
62
48
  has_rdoc: true
63
- homepage: http://geoip.rubyforge.org
49
+ homepage: http://github.com/cjheath/geoip
64
50
  licenses: []
65
51
 
66
52
  post_install_message:
67
53
  rdoc_options:
68
54
  - --main
69
- - README.txt
55
+ - README.rdoc
70
56
  require_paths:
71
57
  - lib
72
58
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -84,10 +70,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
70
  requirements: []
85
71
 
86
72
  rubyforge_project: geoip
87
- rubygems_version: 1.3.3
73
+ rubygems_version: 1.3.5
88
74
  signing_key:
89
75
  specification_version: 3
90
- summary: description of gem
76
+ summary: GeoIP searches a GeoIP database for a given host or IP address, and returns information about the country where the IP address is allocated, and the city, ISP and other information, if you have that database version.
91
77
  test_files:
92
78
  - test/test_geoip.rb
93
79
  - test/test_helper.rb
data/License.txt DELETED
@@ -1,16 +0,0 @@
1
- This version Copyright (C) 2005-2007 Clifford Heath
2
- Derived from the C version, Copyright (C) 2003 MaxMind LLC
3
-
4
- This library is free software; you can redistribute it and/or
5
- modify it under the terms of the GNU General Public
6
- License as published by the Free Software Foundation; either
7
- version 2.1 of the License, or (at your option) any later version.
8
-
9
- This library is distributed in the hope that it will be useful,
10
- but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
- General Public License for more details.
13
-
14
- You should have received a copy of the GNU General Public
15
- License along with this library; if not, write to the Free Software
16
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
data/config/hoe.rb DELETED
@@ -1,71 +0,0 @@
1
- require 'geoip/version'
2
-
3
- AUTHOR = 'Clifford Heath' # can also be an array of Authors
4
- EMAIL = "cjheath@rubyforge.org"
5
- DESCRIPTION = "description of gem"
6
- GEM_NAME = 'geoip' # what ppl will type to install your gem
7
- RUBYFORGE_PROJECT = 'geoip' # The unix name for your project
8
- HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
9
- DOWNLOAD_PATH = "http://rubyforge.org/projects/#{RUBYFORGE_PROJECT}"
10
-
11
- @config_file = "~/.rubyforge/user-config.yml"
12
- @config = nil
13
- RUBYFORGE_USERNAME = "unknown"
14
- def rubyforge_username
15
- unless @config
16
- begin
17
- @config = YAML.load(File.read(File.expand_path(@config_file)))
18
- rescue
19
- puts <<-EOS
20
- ERROR: No rubyforge config file found: #{@config_file}
21
- Run 'rubyforge setup' to prepare your env for access to Rubyforge
22
- - See http://newgem.rubyforge.org/rubyforge.html for more details
23
- EOS
24
- exit
25
- end
26
- end
27
- RUBYFORGE_USERNAME.replace @config["username"]
28
- end
29
-
30
-
31
- REV = nil
32
- # UNCOMMENT IF REQUIRED:
33
- # REV = `svn info`.each {|line| if line =~ /^Revision:/ then k,v = line.split(': '); break v.chomp; else next; end} rescue nil
34
- VERS = Geoip::VERSION::STRING + (REV ? ".#{REV}" : "")
35
- RDOC_OPTS = ['--quiet', '--title', 'geoip documentation',
36
- "--opname", "index.html",
37
- "--line-numbers",
38
- "--main", "README",
39
- "--inline-source"]
40
-
41
- class Hoe
42
- def extra_deps
43
- @extra_deps.reject! { |x| Array(x).first == 'hoe' }
44
- @extra_deps
45
- end
46
- end
47
-
48
- # Generate all the Rake tasks
49
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
50
- hoe = Hoe.new(GEM_NAME, VERS) do |p|
51
- p.author = AUTHOR
52
- p.description = DESCRIPTION
53
- p.email = EMAIL
54
- p.summary = DESCRIPTION
55
- p.url = HOMEPATH
56
- p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
57
- p.test_globs = ["test/**/test_*.rb"]
58
- p.clean_globs |= ['**/.*.sw?', '*.gem', '.config', '**/.DS_Store'] #An array of file patterns to delete on clean.
59
-
60
- # == Optional
61
- p.changes = p.paragraphs_of("History.txt", 0..1).join("\\n\\n")
62
- #p.extra_deps = [] # An array of rubygem dependencies [name, version], e.g. [ ['active_support', '>= 1.3.1'] ]
63
-
64
- #p.spec_extras = {} # A hash of extra values to set in the gemspec.
65
-
66
- end
67
-
68
- CHANGES = hoe.paragraphs_of('History.txt', 0..1).join("\\n\\n")
69
- PATH = (RUBYFORGE_PROJECT == GEM_NAME) ? RUBYFORGE_PROJECT : "#{RUBYFORGE_PROJECT}/#{GEM_NAME}"
70
- hoe.remote_rdoc_dir = File.join(PATH.gsub(/^#{RUBYFORGE_PROJECT}\/?/,''), 'rdoc')
71
- hoe.rsync_args = '-av --delete --ignore-errors'
@@ -1,17 +0,0 @@
1
- require 'fileutils'
2
- include FileUtils
3
-
4
- require 'rubygems'
5
- %w[rake hoe newgem rubigen].each do |req_gem|
6
- begin
7
- require req_gem
8
- rescue LoadError
9
- puts "This Rakefile requires the '#{req_gem}' RubyGem."
10
- puts "Installation: gem install #{req_gem} -y"
11
- exit
12
- end
13
- end
14
-
15
- $:.unshift(File.join(File.dirname(__FILE__), %w[.. lib]))
16
-
17
- require 'geoip'
data/lib/geoip/version.rb DELETED
@@ -1,9 +0,0 @@
1
- module Geoip #:nodoc:
2
- module VERSION #:nodoc:
3
- MAJOR = 0
4
- MINOR = 8
5
- TINY = 1
6
-
7
- STRING = [MAJOR, MINOR, TINY].join('.')
8
- end
9
- end