one world, one error-reporting mechanism
[invirt/packages/invirt-web.git] / code / main.py
index 7531852..646f7d0 100755 (executable)
@@ -30,7 +30,6 @@ def printError():
 if __name__ == '__main__':
     import atexit
     atexit.register(printError)
-    sys.stderr = StringIO()
 
 sys.path.append('/home/ecprice/.local/lib/python2.5/site-packages')
 
@@ -118,13 +117,14 @@ class Defaults:
 
 DEFAULT_HEADERS = {'Content-Type': 'text/html'}
 
-def error(op, username, fields, err, emsg):
-    """Print an error page when a CodeError occurs"""
+def error(op, username, fields, err, emsg, traceback):
+    """Print an error page when an exception occurs"""
+    d = dict(op=op, user=username, fields=fields,
+             errorMessage=str(err), stderr=emsg, traceback=traceback)
+    details = templates.error_raw(searchList=[d])
     send_error_mail('xvm error on %s for %s: %s' % (op, username, err),
-                    'error on %s for %s: %s\n\n%s\n'
-                    % (op, username, err, emsg))
-    d = dict(op=op, user=username, errorMessage=str(err),
-             stderr=emsg)
+                    details)
+    d['details'] = details
     return templates.error(searchList=[d])
 
 def invalidInput(op, username, fields, err, emsg):
@@ -584,7 +584,7 @@ def unauthFront(_, _2, fields):
 
 def throwError(_, __, ___):
     """Throw an error, to test the error-tracing mechanisms."""
-    raise CodeError("test of the emergency broadcast system")
+    raise RuntimeError("test of the emergency broadcast system")
 
 mapping = dict(list=listVms,
                vnc=vnc,
@@ -636,8 +636,8 @@ class App:
         self.state.environ = environ
 
     def __iter__(self):
+        sys.stderr = StringIO()
         fields = cgi.FieldStorage(fp=self.environ['wsgi.input'], environ=self.environ)
-        print >> sys.stderr, fields
         operation = self.environ.get('PATH_INFO', '')
         if not operation:
             self.start("301 Moved Permanently", [('Location',
@@ -677,33 +677,19 @@ class App:
             checkpoint.checkpoint('output as a string')
         except Exception, err:
             if not fields.has_key('js'):
-                if isinstance(err, CodeError):
-                    self.start('500 Internal Server Error', [('Content-Type', 'text/html')])
-                    e = revertStandardError()
-                    s = error(operation, self.username, fields, err, e)
-                    yield str(s)
-                    return
                 if isinstance(err, InvalidInput):
                     self.start('200 OK', [('Content-Type', 'text/html')])
                     e = revertStandardError()
                     yield str(invalidInput(operation, self.username, fields, err, e))
                     return
-            self.start('500 Internal Server Error', [('Content-Type', 'text/plain')])
             import traceback
-            send_error_mail('xvm error: %s' % (err,),
-                            '%s\n' % (traceback.format_exc(),))
-            yield '''Uh-oh!  We experienced an error.
-Sorry about that.  We've gotten mail about it.
-
-Feel free to poke us at xvm@mit.edu if this bug is
-consistently biting you and we don't seem to be fixing it.
-
-In case you're curious, the gory details are here.
-----
-%s
-----
-%s
-----''' % (str(err), traceback.format_exc())
+            self.start('500 Internal Server Error',
+                       [('Content-Type', 'text/html')])
+            e = revertStandardError()
+            s = error(operation, self.username, fields,
+                           err, e, traceback.format_exc())
+            yield str(s)
+            return
         status = headers.setdefault('Status', '200 OK')
         del headers['Status']
         self.start(status, headers.items())