| #!/neo/opt/bin/python |
| |
| import neo_cgi |
| import sys, os, string |
| import time |
| from log import * |
| |
| # errors thrown... |
| NoPageName = "NoPageName" |
| NoDisplayMethod = "NoDisplayMethod" |
| |
| # errors signaled back to here |
| Redirected = "Redirected" |
| DisplayDone = "DisplayDone" |
| DisplayError = "DisplayError" |
| |
| class Context: |
| def __init__ (self): |
| self.argv = sys.argv |
| self.stdin = sys.stdin |
| self.stdout = sys.stdout |
| self.stderr = sys.stderr |
| self.environ = os.environ |
| |
| class CSPage: |
| def __init__(self, context, pagename=0,readDefaultHDF=1,israwpage=0,**parms): |
| if pagename == 0: |
| raise NoPageName, "missing pagename" |
| self.pagename = pagename |
| self.readDefaultHDF = readDefaultHDF |
| self._israwpage = israwpage |
| self.context = context |
| self._pageparms = parms |
| |
| self._error_template = None |
| |
| self.page_start_time = time.time() |
| neo_cgi.cgiWrap(context.stdin, context.stdout, context.environ) |
| neo_cgi.IgnoreEmptyFormVars(1) |
| self.ncgi = neo_cgi.CGI() |
| self.ncgi.parse() |
| self._path_num = 0 |
| domain = self.ncgi.hdf.getValue("CGI.ServerName","") |
| domain = self.ncgi.hdf.getValue("HTTP.Host", domain) |
| self.domain = domain |
| self.subclassinit() |
| self.setPaths([self.ncgi.hdf.getValue("CGI.DocumentRoot","")]) |
| |
| def subclassinit(self): |
| pass |
| |
| def setPaths(self, paths): |
| for path in paths: |
| self.ncgi.hdf.setValue("hdf.loadpaths.%d" % self._path_num, path) |
| self._path_num = self._path_num + 1 |
| |
| def redirectUri(self,redirectTo): |
| ncgi = self.ncgi |
| if ncgi.hdf.getIntValue("Cookie.debug",0) == 1: |
| ncgi.hdf.setValue("CGI.REDIRECT_TO",redirectTo) |
| ncgi.display("dbg/redirect.cs") |
| print "<PRE>" |
| print neo_cgi.htmlEscape(ncgi.hdf.dump()) |
| print "</PRE>" |
| raise DisplayDone |
| |
| self.ncgi.redirectUri(redirectTo) |
| raise Redirected, "redirected To: %s" % redirectTo |
| |
| ## ---------------------------------- |
| ## methods to be overridden in subclass when necessary: |
| |
| def setup(self): |
| pass |
| |
| def display(self): |
| raise NoDisplayMethod, "no display method present in %s" % repr(self) |
| |
| def main(self): |
| self.setup() |
| self.handle_actions() |
| self.display() |
| |
| ## ---------------------------------- |
| |
| def handle_actions(self): |
| hdf = self.ncgi.hdf |
| hdfobj = hdf.getObj("Query.Action") |
| if hdfobj: |
| firstchild = hdfobj.child() |
| if firstchild: |
| action = firstchild.name() |
| if firstchild.next(): |
| raise "multiple actions present!!!" |
| |
| method_name = "Action_%s" % action |
| method = getattr(self,method_name) |
| apply(method,[]) |
| |
| def start(self): |
| SHOULD_DISPLAY = 1 |
| if self._israwpage: |
| SHOULD_DISPLAY = 0 |
| |
| ncgi = self.ncgi |
| |
| if self.readDefaultHDF: |
| try: |
| if not self.pagename is None: |
| ncgi.hdf.readFile("%s.hdf" % self.pagename) |
| except: |
| log("Error reading HDF file: %s.hdf" % (self.pagename)) |
| |
| DISPLAY_ERROR = 0 |
| ERROR_MESSAGE = "" |
| # call page main function! |
| try: |
| self.main() |
| except DisplayDone: |
| SHOULD_DISPLAY = 0 |
| except Redirected: |
| # catch redirect exceptions |
| SHOULD_DISPLAY = 0 |
| except DisplayError, num: |
| ncgi.hdf.setValue("Query.error", str(num)) |
| if self._error_template: |
| ncgi.hdf.setValue("Content", self._error_template) |
| else: |
| DISPLAY_ERROR = 1 |
| except: |
| SHOULD_DISPLAY = 0 |
| DISPLAY_ERROR = 1 |
| |
| import handle_error |
| handle_error.handleException("Display Failed!") |
| ERROR_MESSAGE = handle_error.exceptionString() |
| |
| if DISPLAY_ERROR: |
| print "Content-Type: text/html\n\n" |
| |
| # print the page |
| |
| print "<H1> Error in Page </H1>" |
| print "A copy of this error report has been submitted to the developers. " |
| print "The details of the error report are below." |
| |
| |
| print "<PRE>" |
| print neo_cgi.htmlEscape(ERROR_MESSAGE) |
| print "</PRE>\n" |
| # print debug info always on page error... |
| print "<HR>\n" |
| print "<PRE>" |
| print neo_cgi.htmlEscape(ncgi.hdf.dump()) |
| print "</PRE>" |
| |
| |
| etime = time.time() - self.page_start_time |
| ncgi.hdf.setValue("CGI.debug.execute_time","%f" % (etime)) |
| |
| if SHOULD_DISPLAY and self.pagename: |
| debug_output = ncgi.hdf.getIntValue("page.debug",ncgi.hdf.getIntValue("Cookie.debug",0)) |
| |
| # hijack the built-in debug output method... |
| if ncgi.hdf.getValue("Query.debug","") == ncgi.hdf.getValue("Config.DebugPassword","1"): |
| ncgi.hdf.setValue("Config.DebugPassword","CSPage.py DEBUG hijack (%s)" % |
| ncgi.hdf.getValue("Config.DebugPassword","")) |
| debug_output = 1 |
| |
| if not debug_output: |
| ncgi.hdf.setValue("Config.CompressionEnabled","1") |
| |
| # default display |
| template_name = ncgi.hdf.getValue("Content","%s.cs" % self.pagename) |
| # ncgi.hdf.setValue ("cgiout.charset", "utf-8"); |
| |
| try: |
| ncgi.display(template_name) |
| except: |
| print "Content-Type: text/html\n\n" |
| print "CSPage: Error occured" |
| import handle_error |
| print "<pre>" + handle_error.exceptionString() + "</pre>" |
| debug_output = 1 |
| |
| |
| # debug output |
| if debug_output: |
| print "<HR>\n" |
| print "CSPage Debug, Execution Time: %5.3f<BR><HR>" % (etime) |
| print "<PRE>" |
| print neo_cgi.htmlEscape(ncgi.hdf.dump()) |
| print "</PRE>" |
| # ncgi.hdf.setValue("hdf.DEBUG",ncgi.hdf.dump()) |
| # ncgi.display("debug.cs") |
| |
| script_name = ncgi.hdf.getValue("CGI.ScriptName","") |
| if script_name: |
| script_name = string.split(script_name,"/")[-1] |
| |
| log ("[%s] etime/dtime: %5.3f/%5.3f %s (%s)" % (self.domain, etime, time.time() - etime - self.page_start_time, script_name, self.pagename)) |
| |
| # a protected output function to catch the output errors that occur when |
| # the server is either restarted or the user pushes the stop button on the |
| # browser |
| def output(self, str): |
| try: |
| self.context.stdout.write(str) |
| except IOError, reason: |
| log("IOError: %s" % (repr(reason))) |
| raise DisplayDone |
| |
| |
| def allQuery (self, s): |
| l = [] |
| if self.ncgi.hdf.getValue ("Query.%s.0" % s, ""): |
| obj = self.ncgi.hdf.getChild ("Query.%s" % s) |
| while obj: |
| l.append(obj.value()) |
| obj = obj.next() |
| else: |
| t = self.ncgi.hdf.getValue ("Query.%s" % s, "") |
| if t: l.append(t) |
| return l |