Module: Wmap::Utils::DomainRoot

Extended by:
DomainRoot
Included in:
Wmap::Utils, DomainRoot
Defined in:
lib/wmap/utils/domain_root.rb

Overview

Module to validate and retrieve the top or second level domain name from a host-name (FQDN).

Constant Summary collapse

File_ccsld =

Internet Domain Architecture Definitions

File.dirname(__FILE__)+'/../../../dicts/ccsld.txt'
File_cctld =
File.dirname(__FILE__)+'/../../../dicts/cctld.txt'
File_gtld =
File.dirname(__FILE__)+'/../../../dicts/gtld.txt'

Instance Method Summary collapse

Instance Method Details

#get_domain_root(host) ⇒ Object Also known as: get_root_domain, root_domain, domain_root, host_2_domain

Main function to retrieve the registered domain (‘domain root’ from the ‘registrant’ perspective) from a hostname, for example, “www.telegraph.co.uk” -> “telegraph.co.uk”



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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/wmap/utils/domain_root.rb', line 21

def get_domain_root (host)
  puts "Retrieve the root domain for host: #{host}" if @verbose
  begin
    # Generic Top Level Domain List - loading once
    @gtld=file_2_hash(File_gtld) if @gtld.nil?
    # Country code top-level domain list - loading once
    @cctld=file_2_hash(File_cctld) if @cctld.nil?
    # Country code second level domain - loading once
    @ccsld=load_ccsld_from_file(File_ccsld) if @ccsld.nil?
    if host.strip.nil?
      puts "Error: empty record found. Please check your input and remove any empty line." if @verbose
      return nil
    else
      host=host.downcase.strip
    end
    found_tld=false
    found_cctld=false
    # search the general top level domain list first
    root_domain=""
    dn=host.split(".")
    if @gtld.key?(dn.last) 
      found=false
      if @cctld.key?(dn[dn.length-2]) 
        found=true
      end
      if found
        root_domain=dn[dn.length-3] + "." + dn[dn.length-2] + "." + dn.last
      else
        root_domain=dn[dn.length-2] + "." + dn.last
      end
      found_tld=true
    end
    # search the country code top level domain list secondly
    if @cctld.key?(dn.last) 
      found=false
      # reverse search of general top level domain
      if @gtld.key?(dn[dn.length-2])
        found=true
      end
      # search country code second level domain list
      if @ccsld.key?(dn.last)
        @ccsld[dn.last].each do |v|
          if ( v =~ /#{dn[dn.length-2]}/i )
            found=true
            break
          end
        end
        # 1/8/2015: additional logic to handle invalid ccsld string: reserved gtld string 
        #unless found 
        # if @gtld.key?(dn[dn.length-2])
        #   puts "Invalid ccsld: #{dn[dn.length-2]} for host: #{host}"
        #   return nil
        # end
        #end
      end
      if found
        root_domain=dn[dn.length-3] + "." + dn[dn.length-2] + "." + dn.last
      else
        root_domain=dn[dn.length-2] + "." + dn.last
      end  
      found_cctld=true
    end
    unless (found_tld or found_cctld)  
      puts "#{host} - the top level domain is unknown. Please check out your record #{root_domain} " if @verbose
      return nil
    else
      puts "Domain root found: #{root_domain}" if @verbose
      return root_domain
    end
  rescue => ee     
    puts "Exception on method #{__method__}: #{ee}" if @verbose
    return nil
  end
end

#get_sub_domain(host) ⇒ Object Also known as: get_subdomain

Function to retrieve the sub-domain from a Fully Qualified Domain Name(FQDN), for example, “www.secure.telegraph.co.uk” -> “secure.telegraph.co.uk”



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# File 'lib/wmap/utils/domain_root.rb', line 143

def get_sub_domain (host)
  puts "Retrieve sub-domain from host: #{host}" if @verbose
  begin
    subdomain=String.new
    host=host.strip.downcase
    domain=get_domain_root(host)
    record_h=host.split(".")
    record_d=domain.split(".")
    if (record_h.length - record_d.length) >= 2
      subdomain=record_h[record_h.length-record_d.length-1]+"."+domain
      puts "Sub domain found: #{subdomain}" if @verbose
      return subdomain
    else
      return nil
    end
  rescue Exception => ee
    puts "Exception on method #{__method__} for #{host}: #{ee}" if @verbose
    return nil
  end    
end

#is_domain_root?(domain) ⇒ Boolean Also known as: is_root_domain?, is_domain?, is_root?

Test a host string to see if it’s a valid Internet root domain

Returns:

  • (Boolean)


128
129
130
131
132
133
134
135
136
137
# File 'lib/wmap/utils/domain_root.rb', line 128

def is_domain_root? (domain)
  puts "Validate the domain name is valid: #{domain}" if @verbose
  begin
    domain=domain.strip.downcase
    return domain == get_domain_root(domain)
  rescue => ee
    puts "Exception on method #{__method__} for #{domain}: #{ee}" if @verbose
    return false
  end
end

Function to print instance variable - Country code second-level domain list



176
177
178
# File 'lib/wmap/utils/domain_root.rb', line 176

def print_ccsld
  puts @ccsld
end

Function to print instance variable - Country code top-level domain list



171
172
173
# File 'lib/wmap/utils/domain_root.rb', line 171

def print_cctld
  puts @cctld
end

Function to print instance variable - General top level domain list



166
167
168
# File 'lib/wmap/utils/domain_root.rb', line 166

def print_gtld
  puts @gtld
end