import traceback, sys, string, time, socket, os import who_calls #DUMP_DIR = "/neo/data/bugs" DUMP_DIR = "/tmp/bugs" Warning = "handle_error.Warning" # levels LV_MESSAGE = "LV_MESSAGE" LV_WARNING = "LV_WARNING" LV_ERROR = "LV_ERROR" Count = 0 gErrorCount = 0 DISABLE_DUMP = 0 def exceptionReason(): return "%s.%s" % (str(sys.exc_type), str(sys.exc_value)) def exceptionString(): tb_list = traceback.format_exception(sys.exc_type,sys.exc_value,sys.exc_traceback) return string.join(tb_list,"") #### old way import StringIO ## get the traceback message sfp = StringIO.StringIO() traceback.print_exc(file=sfp) exception = sfp.getvalue() sfp.close() return exception def handleException (msg=None, lvl=LV_ERROR, dump = 1): global gErrorCount gErrorCount = gErrorCount + 1 tb_list = traceback.format_exception(sys.exc_type,sys.exc_value,sys.exc_traceback) if msg: sys.stderr.write ("%s\n" % msg) else: msg = "Unhandled Exception" sys.stderr.write (string.join(tb_list,"")) try: if dump: dump_bug(lvl, "handleException", msg, string.join(tb_list, "")) except: handleException("Unable to dump_bug", dump = 0) def handleWarning (msg=""): header = "*** handleWarning: %s\n" % msg sys.stderr.write(header) tb = who_calls.pretty_who_calls(strip=1) + "\n" sys.stderr.write(tb) try: dump_bug(LV_WARNING, "handleException", msg, tb) except: handleException("Unable to dump_bug", dump = 0) def checkPaths(): paths = (DUMP_DIR, os.path.join (DUMP_DIR, "tmp"), os.path.join (DUMP_DIR, "new")) for path in paths: if not os.path.isdir(path): os.mkdir(path, 0755) def dump_bug (level, etype, msg, location=None, nhdf=None): global DISABLE_DUMP if DISABLE_DUMP: return now = int(time.time()) pid = os.getpid() import neo_cgi, neo_util hdf = neo_util.HDF() hdf.setValue("Required.Level", level) hdf.setValue("Required.When", str(int(time.time()))) hdf.setValue("Required.Type", etype) hdf.setValue("Required.Title", msg) hdf.setValue("Optional.Hostname", socket.gethostname()) if location: hdf.setValue("Optional.Location", location) for (key, value) in os.environ.items(): hdf.setValue ("Environ.%s" % key, value) global Count Count = Count + 1 fname = "%d.%d_%d.%s" % (now, pid, Count, socket.gethostname()) checkPaths() tpath = os.path.join (DUMP_DIR, "tmp", fname) npath = os.path.join (DUMP_DIR, "new", fname) hdf.writeFile(tpath) os.rename(tpath, npath)