import cgi
import datetime
import hmac
-import os
import sha
import simplejson
import sys
"""Move stderr to stdout, and return the contents of the old stderr."""
errio = sys.stderr
if not isinstance(errio, StringIO):
- return None
+ return ''
sys.stderr = sys.stdout
errio.seek(0)
return errio.read()
if __name__ == '__main__':
import atexit
atexit.register(printError)
- sys.stderr = StringIO()
sys.path.append('/home/ecprice/.local/lib/python2.5/site-packages')
DEFAULT_HEADERS = {'Content-Type': 'text/html'}
-def error(op, username, fields, err, emsg):
- """Print an error page when a CodeError occurs"""
- d = dict(op=op, user=username, errorMessage=str(err),
- stderr=emsg)
+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),
+ details)
+ d['details'] = details
return templates.error(searchList=[d])
def invalidInput(op, username, fields, err, emsg):
on=status,
has_vnc=has_vnc,
machine=machine,
- hostname=os.environ.get('SERVER_NAME', 'localhost'),
+ hostname=state.environ.get('SERVER_NAME', 'localhost'),
authtoken=token)
return templates.vnc(searchList=[d])
return templates.list(searchList=[d])
elif back == 'info':
machine = validation.Validate(username, state, machine_id=fields.getfirst('machine_id')).machine
- return ({'Status': '302',
+ return ({'Status': '303 See Other',
'Location': '/info?machine_id=%d' % machine.machine_id},
"You shouldn't see this message.")
else:
machine.owner = validate.owner
update_acl = True
if hasattr(validate, 'name'):
- machine.name = name
+ machine.name = validate.name
if hasattr(validate, 'admin') and validate.admin != machine.administrator:
machine.administrator = validate.admin
update_acl = True
machine = modify_dict['machine']
result = 'Success!'
err = None
- info_dict = infoDict(username, machine)
+ info_dict = infoDict(username, state, machine)
info_dict['err'] = err
if err:
for field in fields.keys():
"""Information for unauth'd users."""
return templates.unauth(searchList=[{'simple' : True}])
+def throwError(_, __, ___):
+ """Throw an error, to test the error-tracing mechanisms."""
+ raise RuntimeError("test of the emergency broadcast system")
+
mapping = dict(list=listVms,
vnc=vnc,
command=command,
info=info,
create=create,
help=helpHandler,
- unauth=unauthFront)
+ unauth=unauthFront,
+ errortest=throwError)
def printHeaders(headers):
"""Print a dictionary as HTTP headers."""
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"""
self.username = getUser(environ)
self.state = State(self.username)
+ 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',
- os.environ['SCRIPT_NAME']+'/')])
+ self.environ['SCRIPT_NAME']+'/')])
return
if self.username is None:
operation = 'unauth'
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
- yield '''Uh-oh! We experienced an error.'
-Please email xvm-dev@mit.edu with the contents of this page.'
-----
-%s
-----
-%s
-----''' % (str(err), traceback.format_exc())
- self.start('200 OK', headers.items())
+ 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())
yield output_string
if fields.has_key('timedebug'):
yield '<pre>%s</pre>' % cgi.escape(str(checkpoint))