Browse Source

BC with webserver embbeded

pull/3/head
psy 11 years ago
parent
commit
04c99401d5
  1. 2
      bc
  2. 20
      bc_gtk.py
  3. 18
      builder.xml
  4. 11
      main.py
  5. 108
      main_gtk.py
  6. 2
      options.py
  7. 0
      web/__init__.py
  8. 0
      web/images/WM1.svg
  9. 12
      web/index.py
  10. 137
      webserver.py

2
bc

@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
"""
BC (Border-Check) is a tool to retrieve info of traceroute tests over website navigation routes.

20
bc_gtk.py

@ -1,20 +0,0 @@
#!/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 by psy (epsylon@riseup.net)
"""
from main_gtk import GuiStarter, GuiUtils
try:
import gtk, gtk.glade
except:
print ("\nError importing: Gtk/Glade libs. \n\nOn Debian based systems, please try like root:\n\n $ apt-get install python-gtk2\n")
sys.exit(2)
class BCGTK():
@staticmethod
def run():
GuiStarter()
gtk.main()

18
builder.xml

@ -1,18 +0,0 @@
<?xml version="1.0"?>
<interface>
<!-- interface-requires gtk+ 2.12 -->
<!-- interface-naming-policy toplevel-contextual -->
<object class="GtkTextBuffer" id="textbuffer1"/>
<object class="GtkAction" id="action1"/>
<object class="GtkWindow" id="window">
<property name="visible">True</property>
<property name="title" translatable="yes">Border Check - GTK Version</property>
<property name="window_position">center</property>
<child>
<object class="GtkImage" id="map1">
<property name="visible">True</property>
<property name="pixbuf">WM1.svg</property>
</object>
</child>
</object>
</interface>

11
main.py

@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
"""
BC (Border-Check) is a tool to retrieve info of traceroute tests over website navigation routes.
@ -19,7 +19,7 @@ except:
import subprocess, socket
from options import BCOptions
from bc_gtk import BCGTK
from webserver import BorderCheckWebserver
# set to emit debug messages about errors (0 = off).
DEBUG = 1
@ -77,7 +77,7 @@ class bc(object):
b = subprocess.Popen(['locate', 'places.sqlite']) # check for Firefox
if b != "":
self.browser = "F" #Firefox
self.browser_path = "/Users/ARRA/Library/Application Support/Firefox/Profiles/m9absgs2.default/places.sqlite" #automatic extracion of path
self.browser_path = "" #automatic extracion of path
else:
self.browser = "C" #Chrome
self.browser_path = ""
@ -145,8 +145,9 @@ class bc(object):
# extract url
url = self.try_running(self.getURL, "\nInternal error getting urls from browser's database.")
print "url:", self.url
# start gtk mode
BCGTK.run()
# start web mode
print("Running webserver\n")
BorderCheckWebserver(self)
while True:
url = urlparse(self.url[0]).netloc

108
main_gtk.py

@ -1,108 +0,0 @@
#!/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 by psy (epsylon@riseup.net)
"""
import sys
try:
import gtk, gtk.glade
except:
print ("\nError importing: Gtk/Glade libs. \n\nOn Debian based systems, please try like root:\n\n $ apt-get install python-gtk2\n")
sys.exit(2)
class GuiUtils(object):
@staticmethod
def GetBuilder(name):
builder = gtk.Builder()
if not builder.add_from_file('builder.xml'):
print 'XML file not found!'
sys.exit(1)
else:
return builder
@staticmethod
def Error(title, text):
"""Show error popup"""
dialog = gtk.MessageDialog(
parent = None,
flags = gtk.DIALOG_DESTROY_WITH_PARENT,
type = gtk.MESSAGE_ERROR,
buttons = gtk.BUTTONS_OK,
message_format = text)
dialog.set_title(title)
dialog.connect('response', lambda dialog, response: dialog.destroy())
dialog.show()
print text
@staticmethod
def Info(title, text):
"""Show info popup"""
dialog = gtk.MessageDialog(
parent = None,
flags = gtk.DIALOG_DESTROY_WITH_PARENT,
type = gtk.MESSAGE_INFO,
buttons = gtk.BUTTONS_OK,
message_format = text)
dialog.set_title(title)
dialog.connect('response', lambda dialog, response: dialog.destroy())
dialog.show()
@staticmethod
def Loading(title, text):
"""Show loading popup"""
dialog = gtk.MessageDialog(
parent = None,
flags = gtk.DIALOG_DESTROY_WITH_PARENT,
type = gtk.MESSAGE_INFO,
buttons = gtk.BUTTONS_NONE,
message_format = text)
dialog.set_title(title)
dialog.connect('response', lambda dialog, response: dialog.destroy())
dialog.show()
return dialog
@staticmethod
def Warning(title, text):
"""Show warning popup"""
dialog = gtk.MessageDialog(
parent = None,
flags = gtk.DIALOG_DESTROY_WITH_PARENT,
type = gtk.MESSAGE_WARNING,
buttons = gtk.BUTTONS_OK,
message_format = text)
dialog.set_title(title)
dialog.connect('response', lambda dialog, response: dialog.destroy())
dialog.show()
return dialog
@staticmethod
def Question(title, text):
"""Show question popup"""
dialog = gtk.MessageDialog(
parent = None,
flags = gtk.DIALOG_DESTROY_WITH_PARENT,
type = gtk.MESSAGE_QUESTION,
buttons = gtk.BUTTONS_YES_NO,
message_format = text)
dialog.set_title(title)
dialog.connect('response', lambda dialog, response: dialog.destroy())
dialog.show()
return dialog
class GuiStarter(object):
"""
Init the starter GUI box.
"""
def __init__(self):
"""
Start the GUI up and set the connections with the components.
"""
builder = GuiUtils.GetBuilder('builder')
# get objects
self.window = builder.get_object('builder')
# defaults
# signals

2
options.py

@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
"""
BC (Border-Check) is a tool to retrieve info of traceroute tests over website navigation routes.

0
web/__init__.py

0
WM1.svg → web/images/WM1.svg

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

12
web/index.py

@ -0,0 +1,12 @@
output = """
<html>
<head>
<title>Border Check</title>
</head>
<body>
<div>
<center><img src="images/WM1.svg"><center>
</div>
</body>
</html>
"""

137
webserver.py

@ -0,0 +1,137 @@
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
"""
BC (Border-Check) is a tool to retrieve info of traceroute tests over website navigation routes.
GPLv3 - 2013 by psy (epsylon@riseup.net)
"""
import os
import sys
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
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 = "<html><body><h2>Traceback (most recent call last):<h2 />"
ret += "<pre>"
list = traceback.format_tb(tb, limit) + \
traceback.format_exception_only(type, value)
ret += "exception error"
ret += "%s: %s<br/>\n" % ( ("\n".join(list[:-1])), (list[-1]))
ret +="</body></html>"
del tb
return ret
class HttpHandler(BaseHTTPRequestHandler):
# TODO: whitelist out there
def client_not_allowed(self, addr):
return False
if addr == "127.0.0.1":
return False
print ("Client not allowed ",addr)
return True
def serve(self):
output = ""
uri = self.path
tmp = uri.find ('?')
args = parse_qs(urlparse(uri)[4])
#from ipdb import set_trace;set_trace()
if tmp != -1:
uri = uri[0:tmp]
for a in uri[tmp:-1].split("&"):
sep = a.find ("=")
if sep != -1:
print "%s)(%s"%(a[0:sep],a[sep:-1])
args[a[0:sep]]=a[sep:-1]
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
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,
"headers": self.headers,
"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 "http://127.0.0.1:%d/ : Serving directory '%s/www'" % (port, os.getcwd())
try:
httpd.serve_forever()
except KeyboardInterrupt:
print 'Server killed on user request (keyboard interrupt).'
if __name__=="__main__":
wwwroot = "www"
httpd = HTTPServer(('', port), HttpHandler)
print "http://127.0.0.1:%d/ : Serving directory '%s/www'" % (port, os.getcwd())
try:
httpd.serve_forever()
except KeyboardInterrupt:
print 'Server killed on user request (keyboard interrupt).'
Loading…
Cancel
Save