Get username and state from CherryPy request
[invirt/packages/invirt-web.git] / code / main.py
index 438144a..fd95e84 100755 (executable)
@@ -12,8 +12,9 @@ import simplejson
 import sys
 import time
 import urllib
+import socket
+import cherrypy
 from StringIO import StringIO
-
 def revertStandardError():
     """Move stderr to stdout, and return the contents of the old stderr."""
     errio = sys.stderr
@@ -44,6 +45,31 @@ from invirt.database import Machine, CDROM, session, connect, MachineAccess, Typ
 from invirt.config import structs as config
 from invirt.common import InvalidInput, CodeError
 
+from view import View
+
+class InvirtWeb(View):
+    def __init__(self):
+        super(self.__class__,self).__init__()
+        connect()
+        self._cp_config['tools.require_login.on'] = True
+
+    @cherrypy.expose
+    @cherrypy.tools.mako(filename="/list.mako")
+    def list(self):
+        """Handler for list requests."""
+        checkpoint.checkpoint('Getting list dict')
+        d = getListDict(cherrypy.request.login, cherrypy.request.state)
+        checkpoint.checkpoint('Got list dict')
+        return d
+    index=list
+
+    @cherrypy.expose
+    @cherrypy.tools.mako(filename="/helloworld.mako")
+    def helloworld(self):
+        return {}
+        return "Hello world!\nYour request: "+repr(dir(cherrypy.request))
+    helloworld._cp_config['tools.require_login.on'] = False
+
 def pathSplit(path):
     if path.startswith('/'):
         path = path[1:]
@@ -150,7 +176,7 @@ def parseCreate(username, state, fields):
     kws = dict([(kw, fields.getfirst(kw)) for kw in 'name description owner memory disksize vmtype cdrom autoinstall'.split()])
     validate = validation.Validate(username, state, strict=True, **kws)
     return dict(contact=username, name=validate.name, description=validate.description, memory=validate.memory,
-                disksize=validate.disksize, owner=validate.owner, machine_type=validate.vmtype,
+                disksize=validate.disksize, owner=validate.owner, machine_type=getattr(validate, 'vmtype', Defaults.type),
                 cdrom=getattr(validate, 'cdrom', None),
                 autoinstall=getattr(validate, 'autoinstall', None))
 
@@ -216,13 +242,6 @@ def getListDict(username, state):
              can_clone=can_clone)
     return d
 
-def listVms(username, state, path, fields):
-    """Handler for list requests."""
-    checkpoint.checkpoint('Getting list dict')
-    d = getListDict(username, state)
-    checkpoint.checkpoint('Got list dict')
-    return templates.list(searchList=[d])
-
 def vnc(username, state, path, fields):
     """VNC applet page.
 
@@ -479,7 +498,7 @@ power on and off the machine.  This can be either a user or a moira
 group.""",
                     'Quotas': """
 Quotas are determined on a per-locker basis.  Each locker may have a
-maximum of 512 megabytes of active ram, 50 gigabytes of disk, and 4
+maximum of 512 mebibytes of active ram, 50 gibibytes of disk, and 4
 active machines.""",
                     'Console': """
 <strong>Framebuffer:</strong> At a Linux boot prompt in your VM, try
@@ -488,7 +507,7 @@ your machine will run just fine, but the applet's display of the
 console will suffer artifacts.
 """,
                     'Windows': """
-<strong>Windows Vista:</strong> The Vista image is licensed for all MIT students and will automatically activate off the network; see <a href="/static/msca-email.txt">the licensing confirmation e-mail</a> for details. The installer req    uires 512 MB RAM and at least 7.5 GB disk space (15 GB or more recommended).<br>
+<strong>Windows Vista:</strong> The Vista image is licensed for all MIT students and will automatically activate off the network; see <a href="/static/msca-email.txt">the licensing confirmation e-mail</a> for details. The installer requires 512 MiB RAM and at least 7.5 GiB disk space (15 GiB or more recommended).<br>
 <strong>Windows XP:</strong> This is the volume license CD image. You will need your own volume license key to complete the install. We do not have these available for the general MIT community; ask your department if they have one.
 """
                     }
@@ -606,16 +625,17 @@ def info(username, state, path, fields):
 
 def unauthFront(_, _2, _3, fields):
     """Information for unauth'd users."""
-    return templates.unauth(searchList=[{'simple' : True}])
+    return templates.unauth(searchList=[{'simple' : True, 
+            'hostname' : socket.getfqdn()}])
 
 def admin(username, state, path, fields):
     if path == '':
         return ({'Status': '303 See Other',
                  'Location': 'admin/'},
                 "You shouldn't see this message.")
-    if not username in getAfsGroupMembers(config.web.adminacl, 'athena.mit.edu'):
+    if not username in getAfsGroupMembers(config.adminacl, 'athena.mit.edu'):
         raise InvalidInput('username', username,
-                           'Not in admin group %s.' % config.web.adminacl)
+                           'Not in admin group %s.' % config.adminacl)
     newstate = State(username, isadmin=True)
     newstate.environ = state.environ
     return handler(username, newstate, path, fields)
@@ -624,7 +644,7 @@ def throwError(_, __, ___, ____):
     """Throw an error, to test the error-tracing mechanisms."""
     raise RuntimeError("test of the emergency broadcast system")
 
-mapping = dict(list=listVms,
+mapping = dict(#list=listVms,
                vnc=vnc,
                command=command,
                modify=modify,