Index: trunk/packages/sipb-xen-www/code/main.py
===================================================================
--- trunk/packages/sipb-xen-www/code/main.py	(revision 629)
+++ trunk/packages/sipb-xen-www/code/main.py	(revision 632)
@@ -40,4 +40,13 @@
 from webcommon import InvalidInput, CodeError, State
 import controls
+from getafsgroups import getAfsGroupMembers
+
+def pathSplit(path):
+    if path.startswith('/'):
+        path = path[1:]
+    i = path.find('/')
+    if i == -1:
+        i = len(path)
+    return path[:i], path[i:]
 
 class Checkpoint:
@@ -142,5 +151,5 @@
                 autoinstall=getattr(validate, 'autoinstall', None))
 
-def create(username, state, fields):
+def create(username, state, path, fields):
     """Handler for create requests."""
     try:
@@ -205,5 +214,5 @@
     return d
 
-def listVms(username, state, fields):
+def listVms(username, state, path, fields):
     """Handler for list requests."""
     checkpoint.checkpoint('Getting list dict')
@@ -212,5 +221,5 @@
     return templates.list(searchList=[d])
 
-def vnc(username, state, fields):
+def vnc(username, state, path, fields):
     """VNC applet page.
 
@@ -309,5 +318,5 @@
     return disk_fields
 
-def command(username, state, fields):
+def command(username, state, path, fields):
     """Handler for running commands like boot and delete on a VM."""
     back = fields.getfirst('back')
@@ -395,5 +404,5 @@
                 machine=machine)
 
-def modify(username, state, fields):
+def modify(username, state, path, fields):
     """Handler for modifying attributes of a machine."""
     try:
@@ -415,5 +424,5 @@
 
 
-def helpHandler(username, state, fields):
+def helpHandler(username, state, path, fields):
     """Handler for help messages."""
     simple = fields.getfirst('simple')
@@ -466,5 +475,5 @@
 
 
-def badOperation(u, s, e):
+def badOperation(u, s, p, e):
     """Function called when accessing an unknown URI."""
     return ({'Status': '404 Not Found'}, 'Invalid operation.')
@@ -565,5 +574,5 @@
     return d
 
-def info(username, state, fields):
+def info(username, state, path, fields):
     """Handler for info on a single VM."""
     machine = validation.Validate(username, state, machine_id=fields.getfirst('machine_id')).machine
@@ -572,9 +581,16 @@
     return templates.info(searchList=[d])
 
-def unauthFront(_, _2, fields):
+def unauthFront(_, _2, _3, fields):
     """Information for unauth'd users."""
     return templates.unauth(searchList=[{'simple' : True}])
 
-def throwError(_, __, ___):
+def overlord(username, state, path, fields):
+    if not username in getAfsGroupMembers('system:xvm', 'athena.mit.edu'):
+        raise InvalidInput('username', username, 'Not an overlord.')
+    newstate = State(username, overlord=True)
+    newstate.environ = state.environ
+    return handler(username, newstate, path, fields)
+
+def throwError(_, __, ___, ____):
     """Throw an error, to test the error-tracing mechanisms."""
     raise RuntimeError("test of the emergency broadcast system")
@@ -588,4 +604,5 @@
                help=helpHandler,
                unauth=unauthFront,
+               overlord=overlord,
                errortest=throwError)
 
@@ -626,4 +643,12 @@
     return environ.get('REMOTE_USER', None)
 
+def handler(username, state, path, fields):
+    operation, path = pathSplit(path)
+    if not operation:
+        operation = 'list'
+    print 'Starting', operation
+    fun = mapping.get(operation, badOperation)
+    return fun(username, state, path, fields)
+
 class App:
     def __init__(self, environ, start_response):
@@ -636,4 +661,5 @@
 
     def __iter__(self):
+        start_time = time.time()
         sipb_xen_database.clear_cache()
         sys.stderr = StringIO()
@@ -646,15 +672,8 @@
         if self.username is None:
             operation = 'unauth'
-        if operation.startswith('/'):
-            operation = operation[1:]
-        if not operation:
-            operation = 'list'
-        print 'Starting', operation
-
-        start_time = time.time()
-        fun = mapping.get(operation, badOperation)
+
         try:
             checkpoint.checkpoint('Before')
-            output = fun(self.username, self.state, fields)
+            output = handler(self.username, self.state, operation, fields)
             checkpoint.checkpoint('After')
 
