This commit is contained in:
who 2007-11-12 12:01:37 +01:00
parent 57a658bf5c
commit 3a5e72c2ed
2 changed files with 56 additions and 251 deletions

View File

@ -1,275 +1,76 @@
#!/usr/bin/python
from change_password import change_password #@UnusedImport
from db_helper import Db, getAuthTuple
from hscException import HscException
from loader_personal_statistics import loader_personal_statistics #@UnusedImport
from logger import Logger
from mandant import add_mandant, loader_change_mandant, change_mandant, change_mandant2, delete_really #@UnusedImport
from params import Params
from person import person #@UnusedImport
from session import Session, SessionContainer
import BaseHTTPServer
import Cheetah.Template
import Cookie
#import Cheetah.Template
import SocketServer
import StringIO
import cgi
import getopt
import os
import sys
import uuid
pidfile_name = "/tmp/hsc.pid"
foreGround = False
templateDir = "./templates"
port = 8000
DSN = "host=127.0.0.1 dbname=radius user=webapp password=webapp123"
class HscWebApp(object):
def __init__(self, sid):
self.buf = StringIO.StringIO()
self.params = None
self.session = sessionContainer.get(sid)
self.error_msg = None
self.msg = None
self.sid = sid
def finish(self):
pass
def log(self, msg):
Logger.log(msg)
def setParams(self, p):
self.params = p
def showPage(self, forcePage=''):
if self.session:
if forcePage != '':
page = forcePage
else:
page = self.session.redirectTarget
else:
page = 'login'
if page == 'logout':
sessionContainer.delete(self.sid)
self.session = None
page = 'login'
templateFile = page + '.tmpl'
try:
if self.session:
self.log("showPage, session: %s" % str(self.session))
self.log("showPage, params: %s" % str(self.session.params))
self.session.setShownPage(page)
try:
loaderObjectClass = eval("loader_" + page)
loaderObject = loaderObjectClass(self.session)
loaderObject.mergeAdditionalData()
except NameError, e:
self.log("loader class for %s not found: %s" % (page, str(e)))
except HscException, e:
s = "HSC Failure loading data: %s" % str(e)
self.log(s)
raise Exception(s)
tmpl = Cheetah.Template.Template(file=templateDir + '/' + templateFile,
searchList=[self])
#self.log("OUTPUT: %s" % str(tmpl))
self.buf.write(str(tmpl))
if self.session:
self.session.clearMsgs()
except Exception, e:
sessionContainer.delete(self.sid)
self.buf.write("Problems to show this page: %s %s" % (e.__class__.__name__, str(e)))
finally:
pass
def processAction(self):
if self.params.action == "Login":
authTuple = getAuthTuple(self.params.username, self.params.password)
if authTuple:
self.params = Params({})
self.sid = str(uuid.uuid1())
session = Session(self.sid, self.params)
session.setAuthTuple(authTuple)
session.setGoodMsg("Welcome")
session.setRedirectTarget("menu")
sessionContainer.add(session)
else:
self.sid = 0
else:
if self.session == None:
self.sid = 0
else:
shownPage = self.session.getShownPage()
self.session.setParams(self.params)
self.log("shownPage: %s" % shownPage)
try:
dataObjectClass = eval(shownPage)
dataObject = dataObjectClass(self.session)
dataObject.process()
self.session.setGoodMsg("Action on %s performed successfully" % shownPage)
self.session.setRedirectTarget(dataObject.getNextPage())
except NameError, e:
self.log("processAction, NameError PARAMS: %s" % str(self.session.params))
s = "Internal program error: %s" % str(e)
self.session.setBadMsg(s)
self.log(s)
self.session.setRedirectTarget("menu")
except HscException, e:
self.log("processAction, HscException PARAMS: %s" % str(self.session.params))
s = "HSC Failure: %s" % str(e)
self.session.setBadMsg(s)
self.log(s)
self.session.setRedirectTarget(shownPage)
def __str__(self):
return self.buf.getvalue()
#import cgi
import threading
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
server_version = "MyHscWebAppHTTP/1.0"
server_version = "yadynHTTP/1.0"
def log_message(self, format, *args):
Logger.log(format%args)
@classmethod
def setParams(cls, entries):
cls.entries = entries
def getSidFromCookie(self):
try:
cookie = Cookie.SimpleCookie(self.headers.get('Cookie'))
sid = cookie['sid'].value
except KeyError:
sid = None
return sid
def setSidInCookie(self, sid):
cookie = Cookie.SimpleCookie()
cookie['sid'] = sid
cookie['sid']['Max-Age'] = 10*60
self.wfile.write(str(cookie) + '\r\n')
def do_POST(self):
self.log_message("Request: %s", self.path)
sid = self.getSidFromCookie()
self.log_message("Cookie: %s" % self.headers.get('Cookie'))
d = HscWebApp(sid)
l = int(self.headers.get('Content-Length', '0'))
q = self.rfile.read(l)
e = cgi.parse_qs(q)
self.log_message("QUERY: %s" % str(e))
d.setParams(Params(e))
d.processAction()
self.send_response(303, "See Other")
self.setSidInCookie(d.sid)
self.send_header("Location", "/")
self.end_headers()
d.finish()
# def do_POST(self):
# self.log_message("Request: %s", self.path)
# sid = self.getSidFromCookie()
# self.log_message("Cookie: %s" % self.headers.get('Cookie'))
#
# d = HscWebApp(sid)
#
# l = int(self.headers.get('Content-Length', '0'))
# q = self.rfile.read(l)
# e = cgi.parse_qs(q)
# self.log_message("QUERY: %s" % str(e))
# d.setParams(Params(e))
#
# d.processAction()
#
# self.send_response(303, "See Other")
# self.setSidInCookie(d.sid)
# self.send_header("Location", "/")
# self.end_headers()
#
# d.finish()
def do_GET(self):
self.log_message("Request: %s", self.path)
sid = self.getSidFromCookie()
self.log_message("SID: %s" % sid)
cmd = self.path.split('/')[1]
dynid = self.path.split('/')[2]
d = HscWebApp(sid)
d.showPage(self.path.split('/')[1])
d = ''
if cmd == 'status':
if dynid == 'all':
for entry in self.entries.values():
d += str(entry) + '\n'
elif self.entries.has_key(dynid):
d = str(self.entries[dynid])
else:
d = "unknown dynid"
else:
d = "unknown cmd"
self.send_response(200, "OK")
self.send_header("Content-Type", "text/html")
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(str(d))
d.finish()
class MyServer(SocketServer.ThreadingTCPServer):
class WebServer(SocketServer.ThreadingTCPServer):
def __init__(self, server_address, RequestHandlerClass):
self.allow_reuse_address = True
SocketServer.ThreadingTCPServer.__init__(self, server_address, RequestHandlerClass)
class WebHandler(threading.Thread):
def __init__(self, webAddr, entries):
threading.Thread.__init__(self)
self.webAddr = webAddr
MyHandler.setParams(entries)
self.setDaemon(True)
def run(self):
WebServer(self.webAddr, MyHandler).serve_forever()
def usage():
print "Usage"
Logger.openlog()
try:
opts, args = getopt.getopt(sys.argv[1:], "hp:dFD:", ["help", "port=", "debug" "ForeGround", "DSN="])
except getopt.GetoptError:
usage()
sys.exit(2)
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
if o in ("-F", "--ForeGround"):
foreGround = True
if o in ("-p", "--port"):
port = int(a)
if o in ("-d", "--debug"):
foreGround = True
Logger.debugEnable()
if o in ("-D", "--DSN"):
DSN=a
Db.setDSN(DSN)
if foreGround:
pid = 0
else:
pid = os.fork()
if pid:
pidFile = file(pidfile_name, mode='w')
pidFile.write("%i\n" % pid)
pidFile.close()
print "daemon started with pid ", pid
sys.exit(0)
else:
Logger.log("Daemon started")
sessionContainer = SessionContainer(60, 600)
sessionContainer.setDaemon(True)
sessionContainer.start()
MyServer(('', port), MyHandler).serve_forever()

View File

@ -8,6 +8,7 @@ import DynHandler
# import DnsHandler
import Expirer
import DynReceiver
import WebHandler
import Entry
import Event
@ -43,6 +44,9 @@ try:
expirer = Expirer.Expirer(entries, EVENT_LIFE_TIME, NULL_ADDRESS)
expirer.start()
webHandler = WebHandler.WebHandler(("", 8080), entries)
webHandler.start()
while True:
entries.sync()
time.sleep(10)