Home | History | Annotate | Download | only in base
      1 
      2 import traceback, sys, string, time, socket, os
      3 import who_calls
      4 
      5 #DUMP_DIR = "/neo/data/bugs"
      6 DUMP_DIR = "/tmp/bugs"
      7 
      8 Warning = "handle_error.Warning"
      9 
     10 # levels
     11 LV_MESSAGE = "LV_MESSAGE"
     12 LV_WARNING = "LV_WARNING"
     13 LV_ERROR   = "LV_ERROR"
     14 
     15 Count = 0
     16 
     17 gErrorCount = 0
     18 DISABLE_DUMP = 0
     19 
     20 def exceptionReason():
     21   return "%s.%s" % (str(sys.exc_type), str(sys.exc_value))
     22 
     23 def exceptionString():
     24   tb_list = traceback.format_exception(sys.exc_type,sys.exc_value,sys.exc_traceback)
     25   return string.join(tb_list,"")
     26 
     27   #### old way
     28   import StringIO
     29   ## get the traceback message  
     30   sfp = StringIO.StringIO()
     31   traceback.print_exc(file=sfp)
     32   exception = sfp.getvalue()
     33   sfp.close()
     34 
     35   return exception
     36 
     37 
     38 def handleException (msg=None, lvl=LV_ERROR, dump = 1):
     39   global gErrorCount
     40   gErrorCount = gErrorCount + 1
     41 
     42   tb_list = traceback.format_exception(sys.exc_type,sys.exc_value,sys.exc_traceback)
     43   if msg:
     44     sys.stderr.write ("%s\n" % msg)
     45   else:
     46     msg = "Unhandled Exception"
     47         
     48   sys.stderr.write (string.join(tb_list,""))
     49   try:
     50     if dump: dump_bug(lvl, "handleException", msg, string.join(tb_list, ""))
     51   except:
     52     handleException("Unable to dump_bug", dump = 0)
     53 
     54 def handleWarning (msg=""):
     55   header = "*** handleWarning: %s\n" % msg
     56   sys.stderr.write(header)
     57   tb = who_calls.pretty_who_calls(strip=1) + "\n"
     58   sys.stderr.write(tb)
     59 
     60   try:
     61     dump_bug(LV_WARNING, "handleException", msg, tb)
     62   except:
     63     handleException("Unable to dump_bug", dump = 0)
     64 
     65 def checkPaths():
     66   paths = (DUMP_DIR, 
     67            os.path.join (DUMP_DIR, "tmp"),
     68            os.path.join (DUMP_DIR, "new"))
     69   for path in paths:
     70     if not os.path.isdir(path):
     71       os.mkdir(path, 0755)
     72 
     73 
     74 def dump_bug (level, etype, msg, location=None, nhdf=None):
     75     global DISABLE_DUMP
     76     if DISABLE_DUMP: return
     77 
     78     now = int(time.time())
     79     pid = os.getpid()
     80 
     81     import neo_cgi, neo_util
     82     hdf = neo_util.HDF()
     83     hdf.setValue("Required.Level", level)
     84     hdf.setValue("Required.When", str(int(time.time())))
     85     hdf.setValue("Required.Type", etype)
     86     hdf.setValue("Required.Title", msg)
     87     hdf.setValue("Optional.Hostname", socket.gethostname())
     88     if location:
     89         hdf.setValue("Optional.Location", location)
     90 
     91     for (key, value) in os.environ.items():
     92         hdf.setValue ("Environ.%s" % key, value)
     93 
     94     global Count
     95     Count = Count + 1
     96     fname = "%d.%d_%d.%s" % (now, pid, Count, socket.gethostname())
     97     checkPaths()
     98 
     99     tpath = os.path.join (DUMP_DIR, "tmp", fname)
    100     npath = os.path.join (DUMP_DIR, "new", fname)
    101     hdf.writeFile(tpath)
    102     os.rename(tpath, npath)
    103 
    104