X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/c0e64855a967519169d9c5d8747edbdeb85e49ec..6d821072f645e107e02e661ee937745642dc3588:/code/main.py diff --git a/code/main.py b/code/main.py index 9f57f84..e5722fa 100755 --- a/code/main.py +++ b/code/main.py @@ -51,11 +51,7 @@ class InvirtUnauthWeb(View): @cherrypy.expose @cherrypy.tools.mako(filename="/unauth.mako") def index(self): - d = dict(simple=True) - if os.path.exists("/etc/invirt/message"): - f = open('/etc/invirt/message') - d['serviceMessage']= f.read() - return d + return dict(simple=True) class InvirtWeb(View): def __init__(self): @@ -101,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, @@ -172,8 +171,6 @@ wiki, including steps to prepare an HVM guest to boot as a ParaVM
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 quotas. It must be the name of a
@@ -197,6 +194,7 @@ your machine will run just fine, but the applet's display of the
console will suffer artifacts.
""",
'Windows': """
+Windows 7: The Windows 7 image is licensed for all MIT students and will automatically activate off the network; see the licensing agreement for details. The installer requires 512 MiB RAM and at least 15 GiB disk space (20 GiB or more recommended).
Windows Vista: The Vista image is licensed for all MIT students and will automatically activate off the network; see the licensing confirmation e-mail for details. The installer requires 512 MiB RAM and at least 7.5 GiB disk space (15 GiB or more recommended).
Windows XP: 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 http://msca.mit.edu/ if you are staff/faculty to request one.
"""
@@ -460,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):
@@ -524,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
@@ -538,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]
@@ -545,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):
@@ -588,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'),