00001
00002 import traceback, sys, string, time, socket, os
00003 import who_calls
00004
00005 import cgitb
00006
00007
00008 DUMP_DIR = "/tmp/bugs"
00009 if os.environ.has_key('PYCLEARSILVER_BUGS_PATH'):
00010 DUMP_DIR = os.environ['PYCLEARSILVER_BUGS_PATH']
00011
00012 Warning = "handle_error.Warning"
00013
00014
00015 LV_MESSAGE = "LV_MESSAGE"
00016 LV_WARNING = "LV_WARNING"
00017 LV_ERROR = "LV_ERROR"
00018
00019 Count = 0
00020
00021 gErrorCount = 0
00022 DISABLE_DUMP = 0
00023
00024 def exceptionReason():
00025 return "%s.%s" % (str(sys.exc_type), str(sys.exc_value))
00026
00027 def exceptionString():
00028 import cStringIO
00029 sfp = cStringIO.StringIO()
00030 handler = cgitb.Hook(file=sfp, display=True)
00031 handler.handle()
00032 exception = sfp.getvalue()
00033 return exception
00034
00035
00036
00037
00038 return exception
00039
00040
00041 def handleException (msg=None, lvl=LV_ERROR, dump = 1):
00042 global gErrorCount
00043 gErrorCount = gErrorCount + 1
00044
00045 tb_list = traceback.format_exception(sys.exc_type,sys.exc_value,sys.exc_traceback)
00046 if msg:
00047 sys.stderr.write ("%s\n" % msg)
00048 else:
00049 msg = "Unhandled Exception"
00050
00051 sys.stderr.write (string.join(tb_list,""))
00052
00053 try:
00054 if dump: dump_bug(lvl, "handleException", msg, string.join(tb_list, ""))
00055 except:
00056 handleException("Unable to dump_bug", dump = 0)
00057
00058 def handleWarning (msg=""):
00059 header = "*** handleWarning: %s\n" % msg
00060 sys.stderr.write(header)
00061 tb = who_calls.pretty_who_calls(strip=1) + "\n"
00062 sys.stderr.write(tb)
00063
00064 try:
00065 dump_bug(LV_WARNING, "handleException", msg, tb)
00066 except:
00067 handleException("Unable to dump_bug", dump = 0)
00068
00069 def checkPaths():
00070 paths = (DUMP_DIR,
00071 os.path.join (DUMP_DIR, "tmp"),
00072 os.path.join (DUMP_DIR, "new"))
00073 for path in paths:
00074 if not os.path.isdir(path):
00075 os.mkdir(path, 0755)
00076
00077
00078 def dump_bug (level, etype, msg, location=None, nhdf=None):
00079 global DISABLE_DUMP
00080 if DISABLE_DUMP: return
00081
00082 now = int(time.time())
00083 pid = os.getpid()
00084
00085 import neo_cgi, neo_util
00086 hdf = neo_util.HDF()
00087 hdf.setValue("Required.Level", level)
00088 hdf.setValue("Required.When", str(int(time.time())))
00089 hdf.setValue("Required.Type", etype)
00090 hdf.setValue("Required.Title", msg)
00091 hdf.setValue("Optional.Hostname", socket.gethostname())
00092 if location:
00093 hdf.setValue("Optional.Location", location)
00094
00095 for (key, value) in os.environ.items():
00096 hdf.setValue ("Environ.%s" % key, value)
00097
00098 global Count
00099 Count = Count + 1
00100 fname = "%d.%d_%d.%s" % (now, pid, Count, socket.gethostname())
00101 checkPaths()
00102
00103 tpath = os.path.join (DUMP_DIR, "tmp", fname)
00104 npath = os.path.join (DUMP_DIR, "new", fname)
00105 try:
00106 hdf.writeFile(tpath)
00107 os.rename(tpath, npath)
00108 except os.error, reason:
00109 warn("unable to write bug file", tpath)
00110 warn("reason:", reason)
00111