whois/whois.py
author Richard Penman
Sat, 05 Sep 2015 23:01:44 +0800
changeset 60 7801a420f679
parent 52 1f80f6dec7ac
child 62 fc06c601b875
permissions -rw-r--r--
added support for native client
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
     1
"""
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
     2
Whois client for python
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
     3
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
     4
transliteration of:
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
     5
http://www.opensource.apple.com/source/adv_cmds/adv_cmds-138.1/whois/whois.c
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
     6
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
     7
Copyright (c) 2010 Chris Wolf
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
     8
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
     9
Permission is hereby granted, free of charge, to any person obtaining a copy
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    10
of this software and associated documentation files (the "Software"), to deal
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    11
in the Software without restriction, including without limitation the rights
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    12
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    13
copies of the Software, and to permit persons to whom the Software is
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    14
furnished to do so, subject to the following conditions:
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    15
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    16
The above copyright notice and this permission notice shall be included in
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    17
all copies or substantial portions of the Software.
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    18
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    19
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    20
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    21
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    22
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    23
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    24
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    25
THE SOFTWARE.
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    26
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    27
"""
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    28
import sys
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    29
import socket
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    30
import optparse
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    31
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    32
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    33
def enforce_ascii(a):
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    34
    if isinstance(a, str) or isinstance(a, unicode):
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    35
        r = ""
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    36
        for i in a:
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    37
            if ord(i) >= 128:
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    38
                r += "?"
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    39
            else:
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    40
                r += i
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    41
        return r
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    42
    else:
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    43
        return a
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    44
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    45
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    46
class NICClient(object):
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    47
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    48
    ABUSEHOST = "whois.abuse.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    49
    NICHOST = "whois.crsnic.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    50
    INICHOST = "whois.networksolutions.com"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    51
    DNICHOST = "whois.nic.mil"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    52
    GNICHOST = "whois.nic.gov"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    53
    ANICHOST = "whois.arin.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    54
    LNICHOST = "whois.lacnic.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    55
    RNICHOST = "whois.ripe.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    56
    PNICHOST = "whois.apnic.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    57
    MNICHOST = "whois.ra.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    58
    QNICHOST_TAIL = ".whois-servers.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    59
    SNICHOST = "whois.6bone.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    60
    BNICHOST = "whois.registro.br"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    61
    NORIDHOST = "whois.norid.no"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    62
    IANAHOST = "whois.iana.org"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    63
    DENICHOST = "de.whois-servers.net"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    64
    DEFAULT_PORT = "nicname"
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    65
    WHOIS_SERVER_ID = "Whois Server:"
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    66
    WHOIS_ORG_SERVER_ID = "Registrant Street1:Whois Server:"
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    67
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    68
    WHOIS_RECURSE = 0x01
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    69
    WHOIS_QUICK = 0x02
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    70
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    71
    ip_whois = [LNICHOST, RNICHOST, PNICHOST, BNICHOST]
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    72
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    73
    def __init__(self):
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    74
        self.use_qnichost = False
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    75
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    76
    def findwhois_server(self, buf, hostname):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    77
        """Search the initial TLD lookup results for the regional-specifc
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    78
        whois server for getting contact details.
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    79
        """
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    80
        nhost = None
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    81
        parts_index = 1
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    82
        start = buf.find(NICClient.WHOIS_SERVER_ID)
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    83
        if (start == -1):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    84
            start = buf.find(NICClient.WHOIS_ORG_SERVER_ID)
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    85
            parts_index = 2
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    86
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    87
        if (start > -1):
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    88
            end = buf[start:].find('\n')
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    89
            whois_line = buf[start:end+start]
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    90
            nhost = whois_line.split(NICClient.WHOIS_SERVER_ID+' ').pop()
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    91
            nhost = nhost.split('http://').pop()
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    92
            # if the whois address is domain.tld/something then
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
    93
            # s.connect((hostname, 43)) does not work
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    94
            if nhost.count('/') > 0:
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
    95
                nhost = None
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    96
        elif (hostname == NICClient.ANICHOST):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    97
            for nichost in NICClient.ip_whois:
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    98
                if (buf.find(nichost) != -1):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
    99
                    nhost = nichost
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   100
                    break
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   101
        return nhost
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   102
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   103
    def whois(self, query, hostname, flags):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   104
        """Perform initial lookup with TLD whois server
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   105
        then, if the quick flag is false, search that result
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   106
        for the region-specifc whois server and do a lookup
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   107
        there for contact details
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   108
        """
52
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   109
        try:
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   110
          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   111
          s.settimeout(2)
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   112
          s.connect((hostname, 43))
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   113
          """send takes bytes as an input
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   114
          """
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   115
          queryBytes = None
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   116
          if type(query) is not unicode:
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   117
              query = query.decode('utf-8')
34
f9da616f15cf Pass all domains through encode('idna') in NICClient
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 32
diff changeset
   118
60
7801a420f679 added support for native client
Richard Penman
parents: 52
diff changeset
   119
          if hostname == NICClient.DENICHOST:
52
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   120
              queryBytes = ("-T dn,ace -C UTF-8 " + query + "\r\n").encode('idna')
60
7801a420f679 added support for native client
Richard Penman
parents: 52
diff changeset
   121
          elif hostname == 'com.whois-servers.net':
7801a420f679 added support for native client
Richard Penman
parents: 52
diff changeset
   122
              queryBytes = ('=' + query + "\r\n").encode('idna')
52
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   123
          else:
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   124
              queryBytes = (query + "\r\n").encode('idna')
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   125
          s.send(queryBytes)
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   126
          """recv returns bytes
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   127
          """
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   128
          response = b''
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   129
          while True:
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   130
              d = s.recv(4096)
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   131
              response += d
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   132
              if not d:
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   133
                  break
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   134
          s.close()
1f80f6dec7ac add socket timeout exception
Jasey Wang <jaseywang@gmail.com>
parents: 45
diff changeset
   135
        except socket.error as socketerror:
60
7801a420f679 added support for native client
Richard Penman
parents: 52
diff changeset
   136
          print "Error: ", socketerror
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   137
        nhost = None
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   138
        response = enforce_ascii(response)
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   139
        if (flags & NICClient.WHOIS_RECURSE and nhost is None):
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   140
            nhost = self.findwhois_server(response.decode(), hostname)
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   141
        if (nhost is not None):
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   142
            response += self.whois(query, nhost, 0)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   143
        return response.decode()
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   144
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   145
    def choose_server(self, domain):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   146
        """Choose initial lookup NIC host"""
36
af839b9c0ed1 Add support for punycode TLDs
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 34
diff changeset
   147
        if type(domain) is not unicode:
af839b9c0ed1 Add support for punycode TLDs
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 34
diff changeset
   148
            domain = domain.decode('utf-8').encode('idna')
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   149
        if (domain.endswith("-NORID")):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   150
            return NICClient.NORIDHOST
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   151
        pos = domain.rfind('.')
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   152
        if (pos == -1):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   153
            return None
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   154
        tld = domain[pos+1:]
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   155
        if (tld[0].isdigit()):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   156
            return NICClient.ANICHOST
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   157
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   158
        return tld + NICClient.QNICHOST_TAIL
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   159
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   160
    def whois_lookup(self, options, query_arg, flags):
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   161
        """Main entry point: Perform initial lookup on TLD whois server,
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   162
        or other server to get region-specific whois server, then if quick
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   163
        flag is false, perform a second lookup on the region-specific
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   164
        server for contact records"""
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   165
        nichost = None
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   166
        # whoud happen when this function is called by other than main
60
7801a420f679 added support for native client
Richard Penman
parents: 52
diff changeset
   167
        if options is None:
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   168
            options = {}
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   169
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   170
        if (('whoishost' not in options or options['whoishost'] is None)
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   171
                and ('country' not in options or options['country'] is None)):
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   172
            self.use_qnichost = True
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   173
            options['whoishost'] = NICClient.NICHOST
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   174
            if (not (flags & NICClient.WHOIS_QUICK)):
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   175
                flags |= NICClient.WHOIS_RECURSE
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   176
60
7801a420f679 added support for native client
Richard Penman
parents: 52
diff changeset
   177
        if 'country' in options and options['country'] is not None:
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   178
            result = self.whois(
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   179
                query_arg,
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   180
                options['country'] + NICClient.QNICHOST_TAIL,
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   181
                flags
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   182
            )
60
7801a420f679 added support for native client
Richard Penman
parents: 52
diff changeset
   183
        elif self.use_qnichost:
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   184
            nichost = self.choose_server(query_arg)
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   185
            if (nichost is not None):
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   186
                result = self.whois(query_arg, nichost, flags)
45
52ce01013731 Handle experimental lookup method for bad domains
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 36
diff changeset
   187
            else:
52ce01013731 Handle experimental lookup method for bad domains
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 36
diff changeset
   188
                result = ''
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   189
        else:
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   190
            result = self.whois(query_arg, options['whoishost'], flags)
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   191
        return result
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   192
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   193
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   194
def parse_command_line(argv):
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   195
    """Options handling mostly follows the UNIX whois(1) man page, except
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   196
    long-form options can also be used.
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   197
    """
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   198
    flags = 0
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   199
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   200
    usage = "usage: %prog [options] name"
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   201
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   202
    parser = optparse.OptionParser(add_help_option=False, usage=usage)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   203
    parser.add_option("-a", "--arin", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   204
                      const=NICClient.ANICHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   205
                      help="Lookup using host " + NICClient.ANICHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   206
    parser.add_option("-A", "--apnic", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   207
                      const=NICClient.PNICHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   208
                      help="Lookup using host " + NICClient.PNICHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   209
    parser.add_option("-b", "--abuse", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   210
                      const=NICClient.ABUSEHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   211
                      help="Lookup using host " + NICClient.ABUSEHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   212
    parser.add_option("-c", "--country", action="store",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   213
                      type="string", dest="country",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   214
                      help="Lookup using country-specific NIC")
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   215
    parser.add_option("-d", "--mil", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   216
                      const=NICClient.DNICHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   217
                      help="Lookup using host " + NICClient.DNICHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   218
    parser.add_option("-g", "--gov", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   219
                      const=NICClient.GNICHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   220
                      help="Lookup using host " + NICClient.GNICHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   221
    parser.add_option("-h", "--host", action="store",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   222
                      type="string", dest="whoishost",
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   223
                      help="Lookup using specified whois host")
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   224
    parser.add_option("-i", "--nws", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   225
                      const=NICClient.INICHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   226
                      help="Lookup using host " + NICClient.INICHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   227
    parser.add_option("-I", "--iana", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   228
                      const=NICClient.IANAHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   229
                      help="Lookup using host " + NICClient.IANAHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   230
    parser.add_option("-l", "--lcanic", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   231
                      const=NICClient.LNICHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   232
                      help="Lookup using host " + NICClient.LNICHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   233
    parser.add_option("-m", "--ra", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   234
                      const=NICClient.MNICHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   235
                      help="Lookup using host " + NICClient.MNICHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   236
    parser.add_option("-p", "--port", action="store",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   237
                      type="int", dest="port",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   238
                      help="Lookup using specified tcp port")
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   239
    parser.add_option("-Q", "--quick", action="store_true",
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   240
                      dest="b_quicklookup",
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   241
                      help="Perform quick lookup")
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   242
    parser.add_option("-r", "--ripe", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   243
                      const=NICClient.RNICHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   244
                      help="Lookup using host " + NICClient.RNICHOST)
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   245
    parser.add_option("-R", "--ru", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   246
                      const="ru", dest="country",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   247
                      help="Lookup Russian NIC")
6
7dee244ba3ef fixed builtin whois parser for pwhois.rotld.ro
Richard Baron Penman
parents: 0
diff changeset
   248
    parser.add_option("-6", "--6bone", action="store_const",
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   249
                      const=NICClient.SNICHOST, dest="whoishost",
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   250
                      help="Lookup using host " + NICClient.SNICHOST)
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   251
    parser.add_option("-?", "--help", action="help")
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   252
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   253
    return parser.parse_args(argv)
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   254
0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   255
if __name__ == "__main__":
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   256
    flags = 0
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   257
    nic_client = NICClient()
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   258
    (options, args) = parse_command_line(sys.argv)
ea0e45971cea initial commit to mercurial
Richard Baron Penman
parents:
diff changeset
   259
    if (options.b_quicklookup is True):
32
5f851e9c196a Stylistic fixes on the NICClient class
Evgeni Kunev <evgeni.kunev@gmail.com>
parents: 12
diff changeset
   260
        flags = flags | NICClient.WHOIS_QUICK
60
7801a420f679 added support for native client
Richard Penman
parents: 52
diff changeset
   261
    print nic_client.whois_lookup(options.__dict__, args[1], flags)