diff --git a/.gitignore b/.gitignore index d2d6f36..7afb2cd 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,5 @@ nosetests.xml .mr.developer.cfg .project .pydevproject + +test.py diff --git a/src/parse.py b/src/error.py similarity index 100% rename from src/parse.py rename to src/error.py diff --git a/src/parser.py b/src/parser.py new file mode 100644 index 0000000..1b756c7 --- /dev/null +++ b/src/parser.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- + +import error +import re + +class Parser(object): + def __init__(self, domain, text, whoisServer=None): + self.domain = domain + self.text = text + self.whoisServer = whoisServer and whoisServer or "default" + + self.tld = self.domain.split(".")[-1] + + self.parseDefaultConf = {} + execfile("tlds/default", {}, self.parseDefaultConf) + self.parseDefaultConf = self.parseDefaultConf.get("parse") + + self.parseConf = {} + + try: + execfile("tlds/%s"%(self.tld), {}, self.parseConf) + + self.parseConf = self.parseConf.get("parse") + + if not self.parseConf and whoisServer not in self.parseDefaultConf: + self.parseConf = self.parseDefaultConf.get("default") + + elif not self.parseConf: + self.parseConf = self.parseDefaultConf.get(whoisServer) + + elif self.whoisServer in self.parseConf: + self.parseConf = self.parseConf.get(self.whoisServer) + + elif "default" in self.parseConf: + self.parseConf = self.parseConf.get("default") + + else: + self.parseConf = self.parseDefaultConf.get("default") + + # Check for LoadConf + _parseConf = self.parseConf + self.parseConf = {} + + if "LoadConf" in _parseConf: + try: + # / + # e.g. org/whois.publicinternetregistry.net + lc = _parseConf["LoadConf"].split("/", 1) + + lcTLD = lc[0] + lcWS = lc[1] + + lcConf = {} + execfile("tlds/%s"%(lcTLD), {}, lcConf) + lcConf = lcConf.get("parse") + + self.parseConf.update(lcConf.get(lcWS)) + + except: + pass + + self.parseConf.update(_parseConf) + + except: + self.parseConf = self.parseDefaultConf.get("default") + + def run(self): + result = {} + for key in self.parseConf: + matches = re.findall(self.parseConf[key], self.text, re.MULTILINE) + if matches: + result.update({key: map(lambda x: x.strip(), matches)}) + + print result diff --git a/src/tlds/default b/src/tlds/default new file mode 100644 index 0000000..d7aa1a5 --- /dev/null +++ b/src/tlds/default @@ -0,0 +1,13 @@ +parse = { + "default": { + "DomainName": "Domain Name:\s?(.+)", + "Registrar": "Registrar:\s?(.+)", + "WhoisServer": "Whois Server: \s?(.+)", + "ReferralURL": "Referral URL:\s?(.+)", + "UpdatedDate": "Updated Date:\s?(.+)", + "CreationDate": "Creation Date:\s?(.+)", + "ExpirationDate": "Expiration Date:\s?(.+)", + "NameServer": "Name Server:\s?(.+)", + "Status": "Status:\s?(.+)", + }, +} diff --git a/src/tlds/org b/src/tlds/org index 8dfbdc8..bee5cd8 100644 --- a/src/tlds/org +++ b/src/tlds/org @@ -1,11 +1,12 @@ server = { "host": "org.whois-servers.net", + "port": 43, } parse = { - "regex": { - "default": { - - } + "default": { + # "LoadConf": "default/default", + "NotFound": "NOT FOUND", + "DomainName": "Domain Name:(.+)", } } diff --git a/src/whois.py b/src/whois.py index d8e0a58..bf2e630 100644 --- a/src/whois.py +++ b/src/whois.py @@ -5,6 +5,8 @@ import os import socket import re +import error + class Whois(object): def __init__(self, domain): self.domain = domain @@ -17,12 +19,15 @@ class Whois(object): self.settings = {} if self.tld in self.tldList: - self.settings = {} - execfile(os.path.join(self.tldPath, self.tld), {}, self.settings) + _settings = {} + execfile(os.path.join(self.tldPath, self.tld), {}, _settings) + + if "server" in _settings: + self.settings.update(_settings["server"]) def chooseServer(self): if "server" in self.settings: - return self.settings["server"]["host"] + return self.settings["host"] else: return self.tld + ".whois-servers.net" @@ -51,16 +56,18 @@ class Whois(object): return result def run(self, redirect=True): - result = self.query(self.chooseServer()) + whoisServer = self.chooseServer() + result = self.query(whoisServer) - if redirect: - redirection = re.findall(self.settings["server"]["redirect"], result, re.MULTILINE) + if redirect and "redirect" in self.settings: + redirection = re.findall(self.settings["redirect"], result, re.MULTILINE) while redirection and len(redirection) >= 1: - result = self.query(redirection[0]) - redirection = re.findall(self.settings["server"]["redirect"], result) + whoisServer = redirection[0] + result = self.query(whoisServer) + redirection = re.findall(self.settings["redirect"], result) - return result + return whoisServer, result