#!/usr/bin/env python # -*- coding: iso-8859-15 -*- """ BC (Border-Check) is a tool to retrieve info of traceroute tests over website navigation routes. GPLv3 - 2013-2014-2015 by psy (epsylon@riseup.net) """ import os import sys import urllib2 from SocketServer import ForkingMixIn, ThreadingMixIn from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer from runpy import run_module from urlparse import urlparse from cgi import parse_qs #, parse_header, parse_multipart import cgi from options import BCOptions port = 8080 wwwroot = "web/" http = {} # global storage class ForkingTCPServer(ForkingMixIn, HTTPServer): pass class ThreadingTCPServer(ThreadingMixIn, HTTPServer): pass def print_exception(type=None, value=None, tb=None, limit=None): if type is None: type, value, tb = sys.exc_info() import traceback ret = "
"
list = traceback.format_tb(tb, limit) + \
traceback.format_exception_only(type, value)
ret += "exception error"
ret += "%s: %s
\n" % ( ("\n".join(list[:-1])), (list[-1]))
ret +=""
del tb
return ret
def set_options(self, options):
self.options = options
def create_options(self, args=None):
self.optionParser = BCOptions()
self.options = self.optionParser.get_options(args)
if not self.options:
return False
return self.options
class HttpHandler(BaseHTTPRequestHandler):
def client_not_allowed(self, addr):
return False
if addr == "127.0.0.1":
return False
print ("Client not allowed ",addr)
return True
def is_valid_url(self,url):
import re
regex = re.compile(
r'^https?://' # http:// or https://
r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' # domain...
r'localhost|' # localhost...
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
r'(?::\d+)?' # optional port
r'(?:/?|[/?]\S+)$', re.IGNORECASE)
return url is not None and regex.search(url)
def is_online_url(self,url):
status_reply = urllib2.urlopen("http://downforeveryoneorjustme.com/"+str(url)).read()
if not 'is up' in status_reply:
self.online_url = False
else:
self.online_url = True
def serve(self):
output = ""
uri = self.path
tmp = uri.find ('?')
args = parse_qs(urlparse(uri)[4])
if 'hostname' in args:
if (self.is_valid_url(args['hostname'][0])):
online = self.is_online_url(args['hostname'][0])
if self.online_url == True:
options = create_options(BCOptions)
if options.debug == True:
print "saving hostname : "+str(args['hostname'])
with open('hostname.submit', 'w') as file:
file.write(str(args['hostname'][0]))
else:
args['error']='invalid url !'
else:
args['error']='invalid url !'
if tmp != -1 :
uri = uri[0:tmp]
file = wwwroot + "/" + uri
if self.client_not_allowed (self.client_address[0]):
self.wfile.write ("HTTP/1.0 503 Not allowed\r\n\r\nYou are not whitelisted")
return
content = ""
try:
ctype,pdict = cgi.parse_header(self.headers.getheader('content-type'))
print "CTYPE IS ",ctype
if ctype == 'multipart/form-data':
query = cgi.parse_multipart(self.rfile, pdict)
content = query.get('upfile')
except:
pass
#print "Request from %s:%d"%self.client_address + " " + uri
# print interactions w server
options = create_options(BCOptions)
if options.debug == True:
print "Request from %s:%d"%self.client_address + " " + uri
if uri[-1] == '/' or os.path.isdir(file):
file = file + "/index.py"
if os.path.isfile(file + ".py"):
file = file + ".py"
if file.find("py") != -1:
modname = file.replace(".py", "")
cwd = modname[0:modname.rfind('/')] + "/"
modname = modname.replace("/", ".")
while modname.find("..") != -1:
modname = modname.replace("..",".")
globals = {
"output": output,
"http": http,
"uri": uri,
"args": args,
"cwd": cwd,
"content": content
}
try:
a = run_module(modname, init_globals=globals)
output = a["output"]
except:
output = print_exception()
else:
try:
f = open (file, "r")
output = f.read ()
f.close ()
except:
output = "404"
if output == "404":
self.wfile.write ("HTTP/1.0 404 Not found\r\n\r\n")
else:
self.wfile.write ("HTTP/1.0 200 OK\r\n\r\n")
self.wfile.write (output)
def do_POST (self):
self.serve ()
def do_GET (self):
self.serve ()
class BorderCheckWebserver():
def __init__(self, ref, *args):
HttpHandler.ref = ref
httpd = HTTPServer(('', port), HttpHandler)
print '='*45 + "\n", "Data Visualization:\n" + '='*45 + "\n"
print "Mode: Webserver\n"
print "Host: http://127.0.0.1:%d/\n\nPath: '%s/web'" % (port, os.getcwd()), "\n"
try:
httpd.serve_forever()
except KeyboardInterrupt:
print 'Server killed on user request (keyboard interrupt).'
if __name__=="__main__":
wwwroot = "web"
httpd = HTTPServer(('', port), HttpHandler)
print "http://127.0.0.1:%d/ : Serving directory '%s/web'" % (port, os.getcwd())
try:
httpd.serve_forever()
except KeyboardInterrupt:
print 'Server killed on user request (keyboard interrupt).'