jm81-ruby-whois 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. data/LICENSE +1020 -0
  2. data/README +4 -0
  3. data/Rakefile +43 -0
  4. data/VERSION +1 -0
  5. data/lib/whois.rb +9 -0
  6. data/lib/whois/domain.rb +18 -0
  7. data/lib/whois/domain/aero.rb +27 -0
  8. data/lib/whois/domain/afilias.rb +26 -0
  9. data/lib/whois/domain/base.rb +114 -0
  10. data/lib/whois/domain/cat.rb +30 -0
  11. data/lib/whois/domain/coop.rb +31 -0
  12. data/lib/whois/domain/educause.rb +51 -0
  13. data/lib/whois/domain/gov.rb +35 -0
  14. data/lib/whois/domain/int.rb +41 -0
  15. data/lib/whois/domain/mobi.rb +26 -0
  16. data/lib/whois/domain/museum.rb +28 -0
  17. data/lib/whois/domain/name.rb +36 -0
  18. data/lib/whois/domain/neustar.rb +42 -0
  19. data/lib/whois/domain/pro.rb +32 -0
  20. data/lib/whois/domain/public_interest.rb +25 -0
  21. data/lib/whois/domain/verisign_grs.rb +36 -0
  22. data/lib/whois/domain/ws.rb +58 -0
  23. data/ruby-whois.gemspec +95 -0
  24. data/test/test_helper.rb +59 -0
  25. data/test/whois/domain/aero_test.rb +24 -0
  26. data/test/whois/domain/afilias_test.rb +24 -0
  27. data/test/whois/domain/cat_test.rb +28 -0
  28. data/test/whois/domain/coop_test.rb +28 -0
  29. data/test/whois/domain/educause_test.rb +24 -0
  30. data/test/whois/domain/gov_test.rb +28 -0
  31. data/test/whois/domain/int_test.rb +24 -0
  32. data/test/whois/domain/mobi_test.rb +24 -0
  33. data/test/whois/domain/museum_test.rb +28 -0
  34. data/test/whois/domain/name_test.rb +24 -0
  35. data/test/whois/domain/neustar_test.rb +134 -0
  36. data/test/whois/domain/pro_test.rb +27 -0
  37. data/test/whois/domain/public_interest_test.rb +75 -0
  38. data/test/whois/domain/verisign_grs_test.rb +90 -0
  39. data/test/whois/domain/ws_test.rb +24 -0
  40. data/test/whois/domain_test.rb +15 -0
  41. metadata +110 -0
data/README ADDED
@@ -0,0 +1,4 @@
1
+ Whois
2
+ =====
3
+
4
+ Description goes here
@@ -0,0 +1,43 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+ require 'rubygems'
5
+
6
+ begin
7
+ require 'jeweler'
8
+ Jeweler::Tasks.new do |gem|
9
+ gem.name = "ruby-whois"
10
+ gem.summary = %Q{Ruby library for accessing Whois information}
11
+ gem.email = "jmorgan@morgancreative.net"
12
+ gem.homepage = "http://github.com/jm81/ruby-whois"
13
+ gem.authors = ["Jared Morgan"]
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+
17
+ rescue LoadError
18
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
19
+ end
20
+
21
+ desc 'Default: run unit tests.'
22
+ task :default => :test
23
+
24
+ desc 'Test the whois gem.'
25
+ Rake::TestTask.new(:test) do |t|
26
+ t.libs << 'lib' << 'test'
27
+ t.pattern = 'test/**/*_test.rb'
28
+ t.verbose = true
29
+ end
30
+
31
+ Rake::RDocTask.new do |rdoc|
32
+ if File.exist?('VERSION')
33
+ version = File.read('VERSION')
34
+ else
35
+ version = ""
36
+ end
37
+
38
+ rdoc.rdoc_dir = 'rdoc'
39
+ rdoc.title = 'Whois #{version}'
40
+ rdoc.options << '--line-numbers' << '--inline-source'
41
+ rdoc.rdoc_files.include('README*')
42
+ rdoc.rdoc_files.include('lib/**/*.rb')
43
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.5.0
@@ -0,0 +1,9 @@
1
+ require 'socket'
2
+ require 'date'
3
+ require 'time'
4
+
5
+ module Whois
6
+ VERSION = '0.5.0'
7
+ end
8
+
9
+ require 'whois/domain'
@@ -0,0 +1,18 @@
1
+ module Whois::Domain
2
+ @@tlds = {}
3
+
4
+ def self.tlds
5
+ @@tlds
6
+ end
7
+
8
+ def self.new(domain_name)
9
+ tld = domain_name.match(/.*\.([^\.]+)$/)[1].to_sym
10
+ class_name = @@tlds.find{|c, tlds_ary| tlds_ary.include?(tld)}[0]
11
+ const_get(class_name).new(domain_name)
12
+ end
13
+ end
14
+
15
+ require 'whois/domain/base.rb'
16
+ Dir.new(File.dirname(__FILE__) + '/domain').each do |file|
17
+ require('whois/domain/' + File.basename(file)) if File.extname(file) == ".rb"
18
+ end
@@ -0,0 +1,27 @@
1
+ class Whois::Domain::Aero < Whois::Domain::Base
2
+ HOST = "whois.aero"
3
+ ATTR_MATCH = /^([^:]+):(\S.*)\r$/
4
+ responds_to :aero
5
+
6
+ ATTR_NAMES = {
7
+ :registrar_name => "Sponsoring Registrar",
8
+ :created_on => "Created On",
9
+ :updated_on => "Updated On",
10
+ :expires_on => "Expires On",
11
+ :status => "Domain Status"
12
+ }
13
+
14
+ # I couldn't find any database updated information for .org
15
+ def database_updated_at
16
+ nil
17
+ end
18
+
19
+ # No whois server listed for .org domains, so always return the whois server used here.
20
+ def whois_server
21
+ HOST
22
+ end
23
+
24
+ def available?
25
+ @raw =~ /NOT FOUND/
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ class Whois::Domain::Afilias < Whois::Domain::Base
2
+ HOST = "whois.afilias.net"
3
+ ATTR_MATCH = /^([^:]+):(\S.*)\r$/
4
+ responds_to :info
5
+
6
+ ATTR_NAMES = {
7
+ :registrar_name => "Sponsoring Registrar",
8
+ :created_on => "Created On",
9
+ :updated_on => "Last Updated On",
10
+ :expires_on => "Expiration Date"
11
+ }
12
+
13
+ # I couldn't find any database updated information for .org
14
+ def database_updated_at
15
+ nil
16
+ end
17
+
18
+ # No whois server listed for .org domains, so always return the whois server used here.
19
+ def whois_server
20
+ HOST
21
+ end
22
+
23
+ def available?
24
+ @raw =~ /NOT FOUND/
25
+ end
26
+ end
@@ -0,0 +1,114 @@
1
+ class Whois::Domain::Base
2
+ attr_reader :name, :raw
3
+
4
+ ATTR_NAMES = {
5
+ :registrar_name => "Registrar",
6
+ :created_on => "Creation Date",
7
+ :updated_on => "Updated Date",
8
+ :expires_on => "Expiration Date",
9
+ :status => "Status",
10
+ :name_servers => "Name Server",
11
+ :whois_server => "Whois Server"
12
+ }
13
+
14
+ def self.responds_to(*ary)
15
+ Whois::Domain::tlds[self.name.split(":").last] = ary
16
+ end
17
+
18
+ def initialize(name)
19
+ @name = name
20
+ query
21
+ end
22
+
23
+ def host
24
+ self.class::HOST
25
+ end
26
+
27
+ def attr_names
28
+ @attr_names ||= ATTR_NAMES.merge(self.class::ATTR_NAMES)
29
+ end
30
+
31
+ # based on Michael Neumann's library
32
+ def query
33
+ s = TCPsocket.open(host, 43)
34
+ s.write("#{@name}\n")
35
+ ret = ""
36
+ while s.gets do ret += $_ end
37
+ s.close
38
+ @raw = ret
39
+ end
40
+
41
+ # based on Michael Neumann's library
42
+ def attrs
43
+ return @attrs if @attrs
44
+
45
+ actual_object = {}
46
+ raw.each do |i|
47
+ if i =~ self.class::ATTR_MATCH
48
+ if actual_object.has_key? $1 then
49
+ actual_object[$1] << $2
50
+ else
51
+ actual_object[$1] = [$2]
52
+ end
53
+ end
54
+ end
55
+ @attrs = actual_object
56
+ end
57
+
58
+ def to_s
59
+ s = ""
60
+ raw.each do |i|
61
+ if i =~ self.class::ATTR_MATCH
62
+ s << "#{$1}: #{$2}\n"
63
+ end
64
+ end
65
+ s
66
+ end
67
+
68
+ def attr_single(attr_name)
69
+ attrs[attr_names[attr_name]] ? attrs[attr_names[attr_name]][0] : nil
70
+ end
71
+
72
+ %w{registrar_name whois_server}.each do |method_name|
73
+ define_method method_name do
74
+ attr_single(method_name.to_sym)
75
+ end
76
+ end
77
+
78
+ def attr_date(attr_name)
79
+ attrs[attr_names[attr_name]] ? Date.parse(attrs[attr_names[attr_name]][0]) : nil
80
+ end
81
+
82
+ %w{created_on updated_on expires_on}.each do |method_name|
83
+ define_method method_name do
84
+ attr_date(method_name.to_sym)
85
+ end
86
+ end
87
+
88
+ def attr_array(attr_name)
89
+ attrs[attr_names[attr_name]] || []
90
+ end
91
+
92
+ %w{status name_servers}.each do |method_name|
93
+ define_method method_name do
94
+ attr_array(method_name.to_sym)
95
+ end
96
+ end
97
+
98
+ def ns
99
+ name_servers
100
+ end
101
+
102
+ def expired?
103
+ expires_on && (expires_on < Date.today)
104
+ end
105
+
106
+ def registered?
107
+ !available?
108
+ end
109
+
110
+ # A url for registering this domain.
111
+ def register_url
112
+ "https://www.securepaynet.net/gdshop/registrar/search.asp?prog_id=morgancr&domainToCheck=#{name}&checkAvail=1"
113
+ end
114
+ end
@@ -0,0 +1,30 @@
1
+ class Whois::Domain::Cat < Whois::Domain::Base
2
+ HOST = "whois.cat"
3
+ ATTR_MATCH = /^([^:]+):\s(.*)\r$/
4
+ responds_to :cat
5
+
6
+ ATTR_NAMES = {
7
+ :registrar_name => "Registrar ID",
8
+ :created_on => "Created On",
9
+ :updated_on => "Last Updated On",
10
+ :expires_on => "Expiration Date"
11
+ }
12
+
13
+ # I couldn't find any database updated information for .org
14
+ def database_updated_at
15
+ nil
16
+ end
17
+
18
+ # No whois server listed for .org domains, so always return the whois server used here.
19
+ def whois_server
20
+ HOST
21
+ end
22
+
23
+ def available?
24
+ @raw =~ /NOT FOUND/
25
+ end
26
+
27
+ def register_url
28
+ "http://domini.cat/en_registrar.html"
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ class Whois::Domain::Coop < Whois::Domain::Base
2
+ ATTR_MATCH = /^([^:]+):\s{2,}(.*)\r$/
3
+ HOST = "whois.nic.coop"
4
+ responds_to :coop
5
+
6
+ ATTR_NAMES = {
7
+ :registrar_name => "Sponsoring registrar",
8
+ :created_on => "Created",
9
+ :updated_on => "Last updated",
10
+ :expires_on => "Expiry Date",
11
+ :status => "Domain Status",
12
+ :name_servers => "Host Name"
13
+ }
14
+
15
+ def database_updated_at
16
+ nil
17
+ end
18
+
19
+ # No whois server listed for .biz domains, so always return the whois server used here.
20
+ def whois_server
21
+ HOST
22
+ end
23
+
24
+ def available?
25
+ @raw =~ /may be available for purchase/
26
+ end
27
+
28
+ def register_url
29
+ "http://domains.coop/"
30
+ end
31
+ end
@@ -0,0 +1,51 @@
1
+ class Whois::Domain::Educause < Whois::Domain::Base
2
+ HOST = "whois.educause.edu"
3
+ ATTR_MATCH = /^([^:]+):\s+(.*)$/
4
+ responds_to :edu
5
+
6
+ ATTR_NAMES = {
7
+ :created_on => "Domain record activated",
8
+ :updated_on => "Domain record last updated",
9
+ :expires_on => "Domain expires"
10
+ }
11
+
12
+ def database_updated_at
13
+ nil
14
+ end
15
+
16
+ def whois_server
17
+ HOST
18
+ end
19
+
20
+ # Educause is the only registrar for .edu
21
+ def registrar_name
22
+ "Educause"
23
+ end
24
+
25
+ def available?
26
+ @raw =~ /^No Match/
27
+ end
28
+
29
+ def name_servers
30
+ found = false
31
+ ns_ary = []
32
+ @raw.each_line do |l|
33
+ if l =~ /^Name Servers:/
34
+ found = true
35
+ elsif found && l =~ /^\s+(\S+)/
36
+ ns_ary << $1
37
+ elsif found && l.strip.empty?
38
+ return ns_ary
39
+ end
40
+ end
41
+ ns_ary
42
+ end
43
+
44
+ def ns
45
+ name_servers
46
+ end
47
+
48
+ def register_url
49
+ "http://www.educause.edu/edudomain"
50
+ end
51
+ end
@@ -0,0 +1,35 @@
1
+ # All I know how to get so far is domain name and status.
2
+ # There is a web interface at http://www.dotgov.gov/whois.aspx
3
+ # with more detail.
4
+ class Whois::Domain::Gov < Whois::Domain::Base
5
+ HOST = "whois.nic.gov"
6
+ ATTR_MATCH = /^([^:]+):\s(.*)\r$/
7
+ responds_to :gov
8
+
9
+ ATTR_NAMES = {
10
+ }
11
+
12
+ def database_updated_at
13
+ nil
14
+ end
15
+
16
+ def whois_server
17
+ HOST
18
+ end
19
+
20
+ def available?
21
+ @raw !~ /Domain Name:/
22
+ end
23
+
24
+ def register_url
25
+ "http://www.dotgov.gov/help_how.aspx"
26
+ end
27
+
28
+ def name_servers
29
+ []
30
+ end
31
+
32
+ def ns
33
+ []
34
+ end
35
+ end
@@ -0,0 +1,41 @@
1
+ class Whois::Domain::Int < Whois::Domain::Base
2
+ HOST = "whois.iana.org"
3
+ ATTR_MATCH = /^\s{0,4}([^:]+):\s+(\S.*)\r$/
4
+ responds_to :int
5
+
6
+ ATTR_NAMES = {
7
+ :registrar_name => "Sponsoring Registrar",
8
+ :created_on => "Registration Date",
9
+ :updated_on => "Last Updated Date",
10
+ :name_servers => "Nameserver"
11
+ }
12
+
13
+ def database_updated_at
14
+ nil
15
+ end
16
+
17
+ def whois_server
18
+ HOST
19
+ end
20
+
21
+ def registrar_name
22
+ ".int Domain Registry (IANA)"
23
+ end
24
+
25
+ def available?
26
+ @raw =~ /not found/
27
+ end
28
+
29
+ def created_on
30
+ Date.parse(attrs["Registration Date"][-1])
31
+ end
32
+
33
+ def updated_on
34
+ Date.parse(attrs["Last Updated Date"][-1])
35
+ end
36
+
37
+ def name_servers
38
+ # Remove trailing dot.
39
+ super.collect{ |ns| ns[0..-2] }
40
+ end
41
+ end