# HG changeset patch # User Richard Baron Penman # Date 1357621459 -39600 # Node ID 7dee244ba3ef5ba172178c2ae5f72663ed3a8543 # Parent 7ace7955a1316fa5295eec6495ef466b25537049 fixed builtin whois parser for pwhois.rotld.ro diff -r 7ace7955a131 -r 7dee244ba3ef pywhois/__init__.py --- a/pywhois/__init__.py Tue Jan 08 15:59:07 2013 +1100 +++ b/pywhois/__init__.py Tue Jan 08 16:04:19 2013 +1100 @@ -9,6 +9,7 @@ # clean domain to expose netloc domain = extract_domain(url) try: + raise OSError('') # try native whois command first r = subprocess.Popen(['whois', domain], stdout=subprocess.PIPE) text = r.stdout.read() diff -r 7ace7955a131 -r 7dee244ba3ef pywhois/parser.py --- a/pywhois/parser.py Tue Jan 08 15:59:07 2013 +1100 +++ b/pywhois/parser.py Tue Jan 08 16:04:19 2013 +1100 @@ -53,7 +53,6 @@ } def __init__(self, domain, text, regex=None): - print text self.domain = domain self.text = text if regex is not None: diff -r 7ace7955a131 -r 7dee244ba3ef pywhois/whois.py --- a/pywhois/whois.py Tue Jan 08 15:59:07 2013 +1100 +++ b/pywhois/whois.py Tue Jan 08 16:04:19 2013 +1100 @@ -35,6 +35,18 @@ import optparse #import pdb +def enforce_ascii(a): + if isinstance(a, str) or isinstance(a, unicode): + # return a.encode('ascii', 'replace') + r = "" + for i in a: + if ord(i) >= 128: + r += "?" + else: + r += i + return r + else: + return a class NICClient(object) : @@ -53,7 +65,7 @@ BNICHOST = "whois.registro.br" NORIDHOST = "whois.norid.no" IANAHOST = "whois.iana.org" - GERMNICHOST = "de.whois-servers.net" + DENICHOST = "de.whois-servers.net" DEFAULT_PORT = "nicname" WHOIS_SERVER_ID = "Whois Server:" WHOIS_ORG_SERVER_ID = "Registrant Street1:Whois Server:" @@ -66,44 +78,65 @@ def __init__(self) : self.use_qnichost = False - + def findwhois_server(self, buf, hostname): """Search the initial TLD lookup results for the regional-specifc whois server for getting contact details. """ + #print 'finding whois server' + #print 'parameters:', buf, 'hostname', hostname nhost = None parts_index = 1 start = buf.find(NICClient.WHOIS_SERVER_ID) + #print 'start', start if (start == -1): start = buf.find(NICClient.WHOIS_ORG_SERVER_ID) parts_index = 2 - - if (start > -1): + + if (start > -1): end = buf[start:].find('\n') + #print 'end:', end whois_line = buf[start:end+start] - whois_parts = whois_line.split(':') - nhost = whois_parts[parts_index].strip() + #print 'whois_line', whois_line + nhost = whois_line.split(NICClient.WHOIS_SERVER_ID+' ').pop() + nhost = nhost.split('http://').pop() + #if the whois address is domain.tld/something then + #s.connect((hostname, 43)) does not work + if nhost.count('/') > 0: + nhost = None + #print 'nhost:',nhost elif (hostname == NICClient.ANICHOST): for nichost in NICClient.ip_whois: if (buf.find(nichost) != -1): nhost = nichost break return nhost - + def whois(self, query, hostname, flags): """Perform initial lookup with TLD whois server - then, if the quick flag is false, search that result + then, if the quick flag is false, search that result for the region-specifc whois server and do a lookup there for contact details """ + #print 'Performing the whois' + #print 'parameters given:', query, hostname, flags #pdb.set_trace() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((hostname, 43)) - if (hostname == NICClient.GERMNICHOST): - s.send("-T dn,ace -C US-ASCII " + query + "\r\n") + """send takes bytes as an input + """ + queryBytes = None + if (hostname == NICClient.DENICHOST): + #print 'the domain is in NIC DENIC' + queryBytes = ("-T dn,ace -C UTF-8 " + query + "\r\n").encode() + #print 'queryBytes:', queryBytes else: - s.send(query + "\r\n") - response = '' + queryBytes = (query + "\r\n").encode() + s.send(queryBytes) + """recv returns bytes + """ + #print s + response = b'' while True: d = s.recv(4096) response += d @@ -112,12 +145,19 @@ s.close() #pdb.set_trace() nhost = None + #print 'response', response + response = enforce_ascii(response) if (flags & NICClient.WHOIS_RECURSE and nhost == None): - nhost = self.findwhois_server(response, hostname) + #print 'Inside first if' + nhost = self.findwhois_server(response.decode(), hostname) + #print 'nhost is:', nhost if (nhost != None): + #print 'inside second if' response += self.whois(query, nhost, 0) - return response - + #print 'response', response + #print 'returning whois response' + return response.decode() + def choose_server(self, domain): """Choose initial lookup NIC host""" if (domain.endswith("-NORID")): @@ -128,105 +168,108 @@ tld = domain[pos+1:] if (tld[0].isdigit()): return NICClient.ANICHOST - + return tld + NICClient.QNICHOST_TAIL - + def whois_lookup(self, options, query_arg, flags): - """Main entry point: Perform initial lookup on TLD whois server, - or other server to get region-specific whois server, then if quick - flag is false, perform a second lookup on the region-specific + """Main entry point: Perform initial lookup on TLD whois server, + or other server to get region-specific whois server, then if quick + flag is false, perform a second lookup on the region-specific server for contact records""" + #print 'whois_lookup' nichost = None #pdb.set_trace() - # this would be the case when this function is called by other then main - if (options == None): + # this would be the case when this function is called by other than main + if (options == None): options = {} - if ( (not options.has_key('whoishost') or options['whoishost'] == None) - and (not options.has_key('country') or options['country'] == None)): + if ( (not 'whoishost' in options or options['whoishost'] == None) + and (not 'country' in options or options['country'] == None)): self.use_qnichost = True options['whoishost'] = NICClient.NICHOST if ( not (flags & NICClient.WHOIS_QUICK)): flags |= NICClient.WHOIS_RECURSE - - if (options.has_key('country') and options['country'] != None): + + if ('country' in options and options['country'] != None): result = self.whois(query_arg, options['country'] + NICClient.QNICHOST_TAIL, flags) elif (self.use_qnichost): nichost = self.choose_server(query_arg) if (nichost != None): - result = self.whois(query_arg, nichost, flags) + result = self.whois(query_arg, nichost, flags) else: result = self.whois(query_arg, options['whoishost'], flags) - + #print 'whois_lookup finished' return result #---- END OF NICClient class def --------------------- - + def parse_command_line(argv): """Options handling mostly follows the UNIX whois(1) man page, except long-form options can also be used. """ flags = 0 - + usage = "usage: %prog [options] name" - + parser = optparse.OptionParser(add_help_option=False, usage=usage) - parser.add_option("-a", "--arin", action="store_const", + parser.add_option("-a", "--arin", action="store_const", const=NICClient.ANICHOST, dest="whoishost", help="Lookup using host " + NICClient.ANICHOST) - parser.add_option("-A", "--apnic", action="store_const", + parser.add_option("-A", "--apnic", action="store_const", const=NICClient.PNICHOST, dest="whoishost", help="Lookup using host " + NICClient.PNICHOST) - parser.add_option("-b", "--abuse", action="store_const", + parser.add_option("-b", "--abuse", action="store_const", const=NICClient.ABUSEHOST, dest="whoishost", help="Lookup using host " + NICClient.ABUSEHOST) - parser.add_option("-c", "--country", action="store", + parser.add_option("-c", "--country", action="store", type="string", dest="country", help="Lookup using country-specific NIC") - parser.add_option("-d", "--mil", action="store_const", + parser.add_option("-d", "--mil", action="store_const", const=NICClient.DNICHOST, dest="whoishost", help="Lookup using host " + NICClient.DNICHOST) - parser.add_option("-g", "--gov", action="store_const", + parser.add_option("-g", "--gov", action="store_const", const=NICClient.GNICHOST, dest="whoishost", help="Lookup using host " + NICClient.GNICHOST) - parser.add_option("-h", "--host", action="store", + parser.add_option("-h", "--host", action="store", type="string", dest="whoishost", help="Lookup using specified whois host") - parser.add_option("-i", "--nws", action="store_const", + parser.add_option("-i", "--nws", action="store_const", const=NICClient.INICHOST, dest="whoishost", help="Lookup using host " + NICClient.INICHOST) - parser.add_option("-I", "--iana", action="store_const", + parser.add_option("-I", "--iana", action="store_const", const=NICClient.IANAHOST, dest="whoishost", help="Lookup using host " + NICClient.IANAHOST) - parser.add_option("-l", "--lcanic", action="store_const", + parser.add_option("-l", "--lcanic", action="store_const", const=NICClient.LNICHOST, dest="whoishost", help="Lookup using host " + NICClient.LNICHOST) - parser.add_option("-m", "--ra", action="store_const", + parser.add_option("-m", "--ra", action="store_const", const=NICClient.MNICHOST, dest="whoishost", help="Lookup using host " + NICClient.MNICHOST) - parser.add_option("-p", "--port", action="store", + parser.add_option("-p", "--port", action="store", type="int", dest="port", help="Lookup using specified tcp port") - parser.add_option("-Q", "--quick", action="store_true", - dest="b_quicklookup", + parser.add_option("-Q", "--quick", action="store_true", + dest="b_quicklookup", help="Perform quick lookup") - parser.add_option("-r", "--ripe", action="store_const", + parser.add_option("-r", "--ripe", action="store_const", const=NICClient.RNICHOST, dest="whoishost", help="Lookup using host " + NICClient.RNICHOST) - parser.add_option("-R", "--ru", action="store_const", + parser.add_option("-R", "--ru", action="store_const", const="ru", dest="country", help="Lookup Russian NIC") - parser.add_option("-6", "--6bone", action="store_const", + parser.add_option("-6", "--6bone", action="store_const", const=NICClient.SNICHOST, dest="whoishost", help="Lookup using host " + NICClient.SNICHOST) parser.add_option("-?", "--help", action="help") - + return parser.parse_args(argv) - + if __name__ == "__main__": flags = 0 nic_client = NICClient() (options, args) = parse_command_line(sys.argv) if (options.b_quicklookup is True): flags = flags|NICClient.WHOIS_QUICK - print nic_client.whois_lookup(options.__dict__, args[1], flags) + print(nic_client.whois_lookup(options.__dict__, args[1], flags)) + +