Initial commit
commit
6ffb044f8e
@ -0,0 +1 @@
|
||||
*.pyc
|
@ -0,0 +1,7 @@
|
||||
#!/usr/local/bin/python
|
||||
from flup.server.fcgi import WSGIServer
|
||||
from app import app
|
||||
from werkzeug.contrib.fixers import LighttpdCGIRootFix
|
||||
|
||||
if __name__ == '__main__':
|
||||
WSGIServer(LighttpdCGIRootFix(app)).run()
|
@ -0,0 +1,123 @@
|
||||
import subprocess, datetime, time
|
||||
|
||||
try:
|
||||
import json
|
||||
except ImportError:
|
||||
import simplejson as json
|
||||
|
||||
try:
|
||||
import pythonwhois
|
||||
except ImportError:
|
||||
print "pythonwhois is not installed!"
|
||||
exit(1)
|
||||
|
||||
try:
|
||||
import pymongo
|
||||
except ImportError:
|
||||
print "pymongo is not installed!"
|
||||
exit(1)
|
||||
|
||||
from flask import Flask, request, render_template, flash, redirect, url_for
|
||||
app = Flask(__name__)
|
||||
app.secret_key = "er4988n439h981359n5n9n5954b0fsdfkjglqrekjt0314njn"
|
||||
app.debug=True
|
||||
db = pymongo.Connection()['crytowhois']
|
||||
|
||||
def format_date(dates):
|
||||
if dates is None:
|
||||
return None
|
||||
else:
|
||||
return dates[0].isoformat()
|
||||
|
||||
def get_first(options):
|
||||
if options is None:
|
||||
return None
|
||||
else:
|
||||
return options[0]
|
||||
|
||||
def whois(domain):
|
||||
result = pythonwhois.whois(domain)
|
||||
|
||||
if result['creation_date'] is None and result['expiration_date'] is None and result['registrar'] is None and result['name_servers'] is None:
|
||||
return None
|
||||
else:
|
||||
creation_date = format_date(result['creation_date'])
|
||||
expiration_date = format_date(result['expiration_date'])
|
||||
updated_date = format_date(result['updated_date'])
|
||||
registrar = get_first(result['registrar'])
|
||||
whois_server = get_first(result['whois_server'])
|
||||
emails = result['emails']
|
||||
nameservers = result['name_servers']
|
||||
|
||||
return {
|
||||
'creation_date': creation_date,
|
||||
'expiration_date': expiration_date,
|
||||
'updated_date': updated_date,
|
||||
'registrar': registrar,
|
||||
'whois_server': whois_server,
|
||||
'emails': emails,
|
||||
'nameservers': nameservers
|
||||
}
|
||||
|
||||
@app.route('/', methods=["GET"])
|
||||
def home():
|
||||
return render_template("home.tpl")
|
||||
|
||||
def find_whois(domain):
|
||||
db_results = db['responses'].find_one({'domain': domain})
|
||||
|
||||
if db_results is not None:
|
||||
return (db_results['timestamp'], db_results['response'])
|
||||
else:
|
||||
result = whois(domain)
|
||||
|
||||
if result is not None:
|
||||
db['responses'].insert({
|
||||
'domain': domain,
|
||||
'response': result,
|
||||
'timestamp': time.time()
|
||||
})
|
||||
|
||||
return (time.time(), result)
|
||||
else:
|
||||
return (time.time(), None)
|
||||
|
||||
@app.route('/query', methods=["POST"])
|
||||
def query():
|
||||
try:
|
||||
domain = request.form['domain']
|
||||
|
||||
if domain == "":
|
||||
flash("You did not enter a domain.")
|
||||
return render_template("home.tpl")
|
||||
else:
|
||||
return redirect(url_for('query_html', domain=domain))
|
||||
except KeyError, e:
|
||||
flash("You did not specify a domain.")
|
||||
return render_template("home.tpl")
|
||||
|
||||
@app.route('/query/html/<domain>', methods=["GET"])
|
||||
def query_html(domain):
|
||||
retrieval_date, result = find_whois(domain)
|
||||
|
||||
if result is None:
|
||||
flash("The specified domain does not exist.")
|
||||
return render_template("home.tpl"), 404
|
||||
else:
|
||||
retrieval_timestamp = datetime.datetime.fromtimestamp(int(retrieval_date))
|
||||
return render_template("result.tpl", domain=domain, retrieval_date=retrieval_timestamp.isoformat(), **result)
|
||||
|
||||
|
||||
@app.route('/query/json/<domain>', methods=["GET"])
|
||||
def query_json(domain):
|
||||
if domain is not None:
|
||||
retrieval_date, result = find_whois(domain)
|
||||
|
||||
result['retrieval_date'] = int(retrieval_date)
|
||||
|
||||
return json.dumps(result)
|
||||
else:
|
||||
return json.dumps(None)
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host="0.0.0.0", port=1234, debug=True)
|
@ -0,0 +1,22 @@
|
||||
server.event-handler = "poll"
|
||||
|
||||
$HTTP["host"] =~ "whois.cryto.net" {
|
||||
server.document-root = "/var/apps/whois"
|
||||
|
||||
fastcgi.server = ("/" =>
|
||||
((
|
||||
"socket" => "/tmp/whoisapp-fcgi.sock",
|
||||
"bin-path" => "/var/apps/whois/app.fcgi",
|
||||
"check-local" => "disable",
|
||||
"max-procs" => 1
|
||||
))
|
||||
)
|
||||
|
||||
alias.url = (
|
||||
"/static" => "/var/apps/whois/static"
|
||||
)
|
||||
|
||||
url.rewrite-once = (
|
||||
"^(/static($|/.*))$" => "$1"
|
||||
)
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
from tornado.wsgi import WSGIContainer
|
||||
from tornado.httpserver import HTTPServer
|
||||
from tornado.ioloop import IOLoop
|
||||
from app import app
|
||||
|
||||
http_server = HTTPServer(WSGIContainer(app))
|
||||
http_server.listen(1234)
|
||||
IOLoop.instance().start()
|
@ -0,0 +1,104 @@
|
||||
body
|
||||
{
|
||||
background-color: #FBFBFB;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
font-family: 'Orienta', 'Open Sans', sans-serif;
|
||||
}
|
||||
|
||||
label, input, button
|
||||
{
|
||||
font-family: 'Source Sans Pro', 'Open Sans', sans-serif;
|
||||
}
|
||||
|
||||
#header
|
||||
{
|
||||
padding: 11px 18px;
|
||||
background-color: #505050;
|
||||
color: white;
|
||||
}
|
||||
|
||||
#contents
|
||||
{
|
||||
padding: 13px 18px;
|
||||
}
|
||||
|
||||
h1
|
||||
{
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
#whois_form
|
||||
{
|
||||
padding: 6px 18px;
|
||||
background-color: #E3E3E3;
|
||||
border: 2px solid #252525;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
#whois_form label, input, button
|
||||
{
|
||||
font-size: 22px;
|
||||
color: #2D2D2D;
|
||||
}
|
||||
|
||||
#whois_form label
|
||||
{
|
||||
margin-right: 10px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#whois_form button
|
||||
{
|
||||
padding: 2px 12px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
#whois_form input
|
||||
{
|
||||
padding: 3px 7px;
|
||||
width: 400px;
|
||||
}
|
||||
|
||||
h2
|
||||
{
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
table th, td
|
||||
{
|
||||
text-align: left;
|
||||
border: 1px solid #636363;
|
||||
padding: 4px 9px;
|
||||
}
|
||||
|
||||
table
|
||||
{
|
||||
border-collapse: collapse;
|
||||
border: 2px solid black;
|
||||
}
|
||||
|
||||
#flashes
|
||||
{
|
||||
list-style: none;
|
||||
margin: 18px 13px 6px 18px;
|
||||
border: 1px solid red;
|
||||
padding: 6px 8px;
|
||||
background-color: #FFBFBF;
|
||||
}
|
||||
|
||||
#footer
|
||||
{
|
||||
margin: 9px 18px;
|
||||
background-color: #2F2F2F;
|
||||
color: white;
|
||||
padding: 8px 12px;
|
||||
border: 1px solid black;
|
||||
border-radius: 7px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
#footer a
|
||||
{
|
||||
color: #FFFB85;
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Cryto WHOIS</title>
|
||||
<link rel="stylesheet" href="/static/style.css">
|
||||
<link href='http://fonts.googleapis.com/css?family=Orienta' rel='stylesheet' type='text/css'>
|
||||
<link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:400,700' rel='stylesheet' type='text/css'>
|
||||
</head>
|
||||
<body>
|
||||
<div id="header">
|
||||
<h1>Cryto WHOIS</h1>
|
||||
Free and unlimited WHOIS lookups and JSON API
|
||||
</div>
|
||||
{% with messages = get_flashed_messages() %}
|
||||
{% if messages %}
|
||||
<ul id="flashes">
|
||||
{% for message in messages %}
|
||||
<li>{{ message }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
<div id="contents">
|
||||
<form id="whois_form" method="post" action="/query">
|
||||
<label for="domain_input">Look up a domain:</label>
|
||||
<input id="domain_input" type="text" name="domain">
|
||||
<button type="submit" name="submit">WHOIS!</button>
|
||||
</form>
|
||||
{% block body %}
|
||||
It would seem the page you requested was not found.
|
||||
{% endblock %}
|
||||
</div>
|
||||
<div id="footer">
|
||||
<strong>Hi. Thanks for using Cryto WHOIS.</strong> I live off donations, so any financial contribution would be <a href="http://cryto.net/~joepie91/donate.html">very welcome</a>! Source code for this site is coming soon.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,4 @@
|
||||
{% extends "base.tpl" %}
|
||||
{% block body %}
|
||||
|
||||
{% endblock %}
|
@ -0,0 +1,62 @@
|
||||
{% extends "base.tpl" %}
|
||||
{% block body %}
|
||||
<div class="whois-results">
|
||||
<h2>WHOIS results</h2>
|
||||
<table>
|
||||
<tr>
|
||||
<th>WHOIS record retrieval date:</th>
|
||||
<td>{{ retrieval_date }}</td>
|
||||
</tr>
|
||||
{% if registrar != None %}
|
||||
<tr>
|
||||
<th>Registrar:</th>
|
||||
<td>{{ registrar }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if whois_server != None %}
|
||||
<tr>
|
||||
<th>WHOIS server:</th>
|
||||
<td>{{ whois_server }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if creation_date != None %}
|
||||
<tr>
|
||||
<th>Creation date:</th>
|
||||
<td>{{ creation_date }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if expiration_date != None %}
|
||||
<tr>
|
||||
<th>Expiration date:</th>
|
||||
<td>{{ expiration_date }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if updated_date != None %}
|
||||
<tr>
|
||||
<th>Record/database last updated:</th>
|
||||
<td>{{ updated_date }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% if nameservers != None %}
|
||||
{% for nameserver in nameservers %}
|
||||
<tr>
|
||||
<th>Nameserver:</th>
|
||||
<td>{{ nameserver }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% if emails != None %}
|
||||
{% for email in emails %}
|
||||
<tr>
|
||||
<th>Contact e-mail:</th>
|
||||
<td>{{ email }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
</table>
|
||||
<p>
|
||||
Need JSON? Try <a href="/query/json/{{ domain }}">http://whois.cryto.net/query/json/{{ domain }}</a>
|
||||
</p>
|
||||
</div>
|
||||
{% endblock %}
|
Loading…
Reference in New Issue