From 3a5e72c2ed76f73a02ddaf57c6dadc807f413be7 Mon Sep 17 00:00:00 2001 From: who Date: Mon, 12 Nov 2007 12:01:37 +0100 Subject: [PATCH] changes --- server/WebHandler.py | 303 ++++++++----------------------------------- server/yadyn | 4 + 2 files changed, 56 insertions(+), 251 deletions(-) diff --git a/server/WebHandler.py b/server/WebHandler.py index 05441a0..e08dd09 100644 --- a/server/WebHandler.py +++ b/server/WebHandler.py @@ -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() - diff --git a/server/yadyn b/server/yadyn index 9942188..6da1354 100755 --- a/server/yadyn +++ b/server/yadyn @@ -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)