|
|
|
#!/usr/bin/python
|
|
|
|
|
|
|
|
import logging
|
|
|
|
import cgi
|
|
|
|
import os
|
|
|
|
import socket
|
|
|
|
from BaseHTTPServer import HTTPServer
|
|
|
|
import SimpleHTTPServer
|
|
|
|
import urlparse
|
|
|
|
import unicodedata
|
|
|
|
import logging, logging.config
|
|
|
|
|
|
|
|
logging.config.fileConfig('pylog.conf')
|
|
|
|
logger = logging.getLogger('meshenger'+'.clientserve')
|
|
|
|
|
|
|
|
class ClientServeHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
|
|
|
|
|
|
|
|
messageDir = "msg"
|
|
|
|
|
|
|
|
def do_GET(self):
|
|
|
|
"""
|
|
|
|
Serve index and messages
|
|
|
|
"""
|
|
|
|
|
|
|
|
if self.path == '/index' or self.path.startswith( "/"+self.messageDir ):
|
|
|
|
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
|
|
|
|
elif self.path == '/id':
|
|
|
|
if meshenger and meshenger.own_hash:
|
|
|
|
self.send_response(200)
|
|
|
|
self.send_header('Content-type', 'text-html')
|
|
|
|
self.end_headers()
|
|
|
|
self.wfile.write(meshenger.own_hash)
|
|
|
|
else:
|
|
|
|
self.send_error(404,'Id not yet available')
|
|
|
|
elif self.path == '/log':
|
|
|
|
self.send_response(200)
|
|
|
|
self.send_header('Content-type', 'text-html')
|
|
|
|
self.end_headers()
|
|
|
|
f = os.path.relpath('log/meshenger.log')
|
|
|
|
with open( f, 'r') as the_file:
|
|
|
|
self.wfile.write(the_file.read())
|
|
|
|
elif self.path.startswith('/web'):
|
|
|
|
|
|
|
|
f = os.path.relpath(self.path[1:])
|
|
|
|
if not os.path.exists( f ) or os.path.isdir( f ):
|
|
|
|
f = os.path.join('web', 'index.html')
|
|
|
|
|
|
|
|
self.path = '/'+f
|
|
|
|
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
|
|
|
|
elif self.path == '/old':
|
|
|
|
self.send_response(200) #serve the webapp on every url requested
|
|
|
|
self.send_header('Content-type', 'text/html')
|
|
|
|
self.end_headers()
|
|
|
|
f = os.path.relpath( 'webapp.html')
|
|
|
|
with open( f, 'r') as the_file:
|
|
|
|
self.wfile.write(the_file.read())
|
|
|
|
|
|
|
|
else:
|
|
|
|
self.path = '/' + os.path.join('web', 'index.html')
|
|
|
|
return SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
|
|
|
|
|
|
|
|
|
|
|
|
def do_POST(self):
|
|
|
|
"""
|
|
|
|
Allow clients to post messages
|
|
|
|
"""
|
|
|
|
if self.path == '/send':
|
|
|
|
logger.info('incoming message from client!')
|
|
|
|
length = int(self.headers['Content-Length'])
|
|
|
|
post_data = urlparse.parse_qs(self.rfile.read(length).decode('utf-8'))
|
|
|
|
|
|
|
|
self.writeMessage( post_data["time"][0].encode('ascii','ignore'), post_data["message"][0])
|
|
|
|
|
|
|
|
self.send_response(200)
|
|
|
|
self.send_header('Content-type', 'text/html')
|
|
|
|
self.end_headers()
|
|
|
|
self.wfile.write('message created')
|
|
|
|
|
|
|
|
#let main rebuild message index
|
|
|
|
try:
|
|
|
|
logger.debug('try to call meshenger.build_index: %s', repr(meshenger))
|
|
|
|
meshenger.build_index()
|
|
|
|
except:
|
|
|
|
logger.error('failed to call meshenger.build_index')
|
|
|
|
pass
|
|
|
|
|
|
|
|
def writeMessage(self, time, message):
|
|
|
|
"""
|
|
|
|
Write message to disk
|
|
|
|
"""
|
|
|
|
f = os.path.join( self.messageDir, time)
|
|
|
|
if os.path.isfile( f ):
|
|
|
|
return
|
|
|
|
with open( f, 'a') as the_file:
|
|
|
|
the_file.write(message)
|
|
|
|
|
|
|
|
|
|
|
|
class ClientServe():
|
|
|
|
def __init__(self, port):
|
|
|
|
logger.info('ClientServe.__init__')
|
|
|
|
server = HTTPServer( ('', port), ClientServeHandler)
|
|
|
|
server.serve_forever()
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
clientServe = ClientServe(80)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|