send mail on non-CodeError exceptions
authorGreg Price <price@mit.edu>
Fri, 13 Jun 2008 06:32:32 +0000 (02:32 -0400)
committerGreg Price <price@mit.edu>
Fri, 13 Jun 2008 06:32:32 +0000 (02:32 -0400)
svn path=/trunk/packages/sipb-xen-www/; revision=598

code/main.py

index d05eaca..5874928 100755 (executable)
@@ -579,6 +579,10 @@ def unauthFront(_, _2, fields):
     """Information for unauth'd users."""
     return templates.unauth(searchList=[{'simple' : True}])
 
     """Information for unauth'd users."""
     return templates.unauth(searchList=[{'simple' : True}])
 
+def throwError(_, __, ___):
+    """Throw an error, to test the error-tracing mechanisms."""
+    raise RuntimeError("This is a test of the emergency broadcast system.")
+
 mapping = dict(list=listVms,
                vnc=vnc,
                command=command,
 mapping = dict(list=listVms,
                vnc=vnc,
                command=command,
@@ -586,7 +590,8 @@ mapping = dict(list=listVms,
                info=info,
                create=create,
                help=helpHandler,
                info=info,
                create=create,
                help=helpHandler,
-               unauth=unauthFront)
+               unauth=unauthFront,
+               errortest=throwError)
 
 def printHeaders(headers):
     """Print a dictionary as HTTP headers."""
 
 def printHeaders(headers):
     """Print a dictionary as HTTP headers."""
@@ -594,6 +599,20 @@ def printHeaders(headers):
         print '%s: %s' % (key, value)
     print
 
         print '%s: %s' % (key, value)
     print
 
+def send_error_mail(subject, body):
+    import subprocess
+
+    to = 'xvm@mit.edu'
+    mail = """To: %s
+From: root@xvm.mit.edu
+Subject: %s
+
+%s
+""" % (to, subject, body)
+    p = subprocess.Popen(['/usr/sbin/sendmail', to], stdin=subprocess.PIPE)
+    p.stdin.write(mail)
+    p.stdin.close()
+    p.wait()
 
 def getUser(environ):
     """Return the current user based on the SSL environment variables"""
 
 def getUser(environ):
     """Return the current user based on the SSL environment variables"""
@@ -668,8 +687,15 @@ class App:
                     return
             self.start('500 Internal Server Error', [('Content-Type', 'text/plain')])
             import traceback
                     return
             self.start('500 Internal Server Error', [('Content-Type', 'text/plain')])
             import traceback
-            yield '''Uh-oh!  We experienced an error.'
-Please email xvm-dev@mit.edu with the contents of this page.'
+            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
 ----