Updated help text with formatting changes.
[invirt/packages/invirt-web.git] / code / main.py
index b05906e..e5722fa 100755 (executable)
@@ -51,13 +51,7 @@ class InvirtUnauthWeb(View):
     @cherrypy.expose
     @cherrypy.tools.mako(filename="/unauth.mako")
     def index(self):
-        if(os.path.exists("/etc/invirt/message")):
-            f = open('/etc/invirt/message')
-            message = f.read()
-        else:message = None
-        d = dict(simple = True, serviceMessage = message)
-        return d
-
+        return dict(simple=True)
 
 class InvirtWeb(View):
     def __init__(self):
@@ -103,6 +97,9 @@ class InvirtWeb(View):
         return d
 
     def __getattr__(self, name):
+        # At the point __getattr__ is called, tools haven't been run. Make sure the user is logged in.
+        cherrypy.tools.remote_user_login.callable()
+
         if name in ("admin", "overlord"):
             if not cherrypy.request.login in getAfsGroupMembers(config.adminacl, config.authz.afs.cells[0].cell):
                 raise InvalidInput('username', cherrypy.request.login,
@@ -174,8 +171,6 @@ wiki</a>, including steps to prepare an HVM guest to boot as a ParaVM
 
 <p>We recommend using a ParaVM when possible and an HVM when necessary.
 """,
-            'CPU Weight': """
-Don't ask us!  We're as mystified as you are.""",
             'Owner': """
 The owner field is used to determine <a
 href="help?subject=Quotas">quotas</a>.  It must be the name of a
@@ -199,6 +194,7 @@ your machine will run just fine, but the applet's display of the
 console will suffer artifacts.
 """,
             'Windows': """
+<strong>Windows 7:</strong> The Windows 7 image is licensed for all MIT students and will automatically activate off the network; see <a href="/static/msca-7.txt">the licensing agreement</a> for details. The installer requires 512 MiB RAM and at least 15 GiB disk space (20 GiB 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, or visit <a href="http://msca.mit.edu/">http://msca.mit.edu/</a> if you are staff/faculty to request one.
 """
@@ -462,7 +458,8 @@ def getListDict(username, state):
              defaults=defaults,
              machines=machines,
              has_vnc=has_vnc,
-             installing=installing)
+             installing=installing,
+             disable_creation=False)
     return d
 
 def getHostname(nic):
@@ -526,9 +523,9 @@ def modifyDict(username, state, machine_id, fields):
     olddisk = {}
     session.begin()
     try:
-        kws = dict([(kw, fields[kw]) for kw in
+        kws = dict((kw, fields[kw]) for kw in
          'owner admin contact name description memory vmtype disksize'.split()
-                    if fields[kw]])
+                    if fields.get(kw))
         kws['machine_id'] = machine_id
         validate = validation.Validate(username, state, **kws)
         machine = validate.machine
@@ -540,6 +537,26 @@ def modifyDict(username, state, machine_id, fields):
         if hasattr(validate, 'vmtype'):
             machine.type = validate.vmtype
 
+        update_acl = False
+        if hasattr(validate, 'owner') and validate.owner != machine.owner:
+            machine.owner = validate.owner
+            update_acl = True
+        if hasattr(validate, 'description'):
+            machine.description = validate.description
+        if hasattr(validate, 'admin') and validate.admin != machine.administrator:
+            machine.administrator = validate.admin
+            update_acl = True
+        if hasattr(validate, 'contact'):
+            machine.contact = validate.contact
+
+        session.save_or_update(machine)
+        session.commit()
+    except:
+        session.rollback()
+        raise
+
+    session.begin()
+    try:
         if hasattr(validate, 'disksize'):
             disksize = validate.disksize
             disk = machine.disks[0]
@@ -547,35 +564,32 @@ def modifyDict(username, state, machine_id, fields):
                 olddisk[disk.guest_device_name] = disksize
                 disk.size = disksize
                 session.save_or_update(disk)
+        for diskname in olddisk:
+            controls.resizeDisk(oldname, diskname, str(olddisk[diskname]))
+        session.save_or_update(machine)
+        session.commit()
+    except:
+        session.rollback()
+        raise
 
-        update_acl = False
-        if hasattr(validate, 'owner') and validate.owner != machine.owner:
-            machine.owner = validate.owner
-            update_acl = True
+    session.begin()
+    try:
         if hasattr(validate, 'name'):
             machine.name = validate.name
             for n in machine.nics:
                 if n.hostname == oldname:
                     n.hostname = validate.name
-        if hasattr(validate, 'description'):
-            machine.description = validate.description
-        if hasattr(validate, 'admin') and validate.admin != machine.administrator:
-            machine.administrator = validate.admin
-            update_acl = True
-        if hasattr(validate, 'contact'):
-            machine.contact = validate.contact
-
+        if hasattr(validate, 'name'):
+            controls.renameMachine(machine, oldname, validate.name)
         session.save_or_update(machine)
-        if update_acl:
-            cache_acls.refreshMachine(machine)
         session.commit()
     except:
         session.rollback()
         raise
-    for diskname in olddisk:
-        controls.resizeDisk(oldname, diskname, str(olddisk[diskname]))
-    if hasattr(validate, 'name'):
-        controls.renameMachine(machine, oldname, validate.name)
+
+    if update_acl:
+        cache_acls.refreshMachine(machine)
+
     return dict(machine=machine)
 
 def infoDict(username, state, machine):
@@ -590,8 +604,12 @@ def infoDict(username, state, machine):
     else:
         main_status = dict(status[1:])
         main_status['host'] = controls.listHost(machine)
-        start_time = float(main_status.get('start_time', 0))
-        uptime = datetime.timedelta(seconds=int(time.time()-start_time))
+        start_time = main_status.get('start_time')
+        if start_time is None:
+            uptime = "Still booting?"
+        else:
+            start_time = float(start_time)
+            uptime = datetime.timedelta(seconds=int(time.time()-start_time))
         cpu_time_float = float(main_status.get('cpu_time', 0))
         cputime = datetime.timedelta(seconds=int(cpu_time_float))
     display_fields = [('name', 'Name'),