#!/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