X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/blobdiff_plain/230d47ec0096ba45aeb3a690fa2c4551f4fcbb16..0a65acc5524cc443e1682f4d524d387b9577e5c1:/code/main.py diff --git a/code/main.py b/code/main.py index 9caf7c4..24fe062 100755 --- a/code/main.py +++ b/code/main.py @@ -11,6 +11,7 @@ import sha import simplejson import sys import time +import urllib from StringIO import StringIO def revertStandardError(): @@ -36,8 +37,10 @@ sys.path.append('/home/ecprice/.local/lib/python2.5/site-packages') import templates from Cheetah.Template import Template -from sipb_xen_database import Machine, CDROM, ctx, connect, MachineAccess +import sipb_xen_database +from sipb_xen_database import Machine, CDROM, ctx, connect, MachineAccess, Type, Autoinstall import validation +import cache_acls from webcommon import InvalidInput, CodeError, g import controls @@ -56,12 +59,15 @@ class Checkpoint: checkpoint = Checkpoint() +def jquote(string): + return "'" + string.replace('\\', '\\\\').replace("'", "\\'").replace('\n', '\\n') + "'" def helppopup(subj): """Return HTML code for a (?) link to a specified help topic""" - return ('(?)') + return ('(?)') def makeErrorPre(old, addition): if addition is None: @@ -71,6 +77,7 @@ def makeErrorPre(old, addition): else: return '
STDERR:
' + str(addition) + '' +Template.sipb_xen_database = sipb_xen_database Template.helppopup = staticmethod(helppopup) Template.err = None @@ -96,9 +103,10 @@ class Defaults: memory = 256 disk = 4.0 cdrom = '' + autoinstall = '' name = '' - vmtype = 'hvm' def __init__(self, max_memory=None, max_disk=None, **kws): + self.type = Type.get('linux-hvm') if max_memory is not None: self.memory = min(self.memory, max_memory) if max_disk is not None: @@ -219,8 +227,7 @@ def getListDict(user): defaults=defaults, machines=machines, has_vnc=has_vnc, - uptimes=g.uptimes, - cdroms=CDROM.select()) + uptimes=g.uptimes) return d def listVms(user, fields): @@ -284,7 +291,7 @@ def getHostname(nic): if nic.hostname and '.' in nic.hostname: return nic.hostname elif nic.machine: - return nic.machine.name + '.servers.csail.mit.edu' + return nic.machine.name + '.xvm.mit.edu' else: return None @@ -379,6 +386,10 @@ def modifyDict(user, fields): memory = validation.validMemory(user, memory, machine, on=False) machine.memory = memory + vm_type = validation.validVmType(fields.getfirst('vmtype')) + if vm_type is not None: + machine.type = vm_type + disksize = validation.testDisk(user, fields.getfirst('disk')) if disksize is not None: disksize = validation.validDisk(user, disksize, machine) @@ -388,16 +399,21 @@ def modifyDict(user, fields): disk.size = disksize ctx.current.save(disk) - if owner is not None: + update_acl = False + if owner is not None and owner != machine.owner: machine.owner = owner + update_acl = True if name is not None: machine.name = name - if admin is not None: + if admin is not None and admin != machine.administrator: machine.administrator = admin + update_acl = True if contact is not None: machine.contact = contact ctx.current.save(machine) + if update_acl: + cache_acls.refreshMachine(machine) transaction.commit() except: transaction.rollback() @@ -560,12 +576,11 @@ def infoDict(user, machine): checkpoint.checkpoint('Got mem') max_disk = validation.maxDisk(user, machine) defaults = Defaults() - for name in 'machine_id name administrator owner memory contact'.split(): + for name in 'machine_id name administrator owner memory contact type'.split(): setattr(defaults, name, getattr(machine, name)) defaults.disk = "%0.2f" % (machine.disks[0].size/1024.) checkpoint.checkpoint('Got defaults') d = dict(user=user, - cdroms=CDROM.select(), on=status is not None, machine=machine, defaults=defaults, @@ -585,13 +600,18 @@ def info(user, fields): checkpoint.checkpoint('Got infodict') return templates.info(searchList=[d]) +def unauthFront(_, fields): + """Information for unauth'd users.""" + return templates.unauth(searchList=[{'simple' : True}]) + mapping = dict(list=listVms, vnc=vnc, command=command, modify=modify, info=info, create=create, - help=helpHandler) + help=helpHandler, + unauth=unauthFront) def printHeaders(headers): """Print a dictionary as HTTP headers.""" @@ -602,8 +622,10 @@ def printHeaders(headers): def getUser(): """Return the current user based on the SSL environment variables""" - username = os.environ['SSL_CLIENT_S_DN_Email'].split("@")[0] - return username + email = os.environ.get('SSL_CLIENT_S_DN_Email', None) + if email is None: + return None + return email.split("@")[0] def main(operation, user, fields): start_time = time.time() @@ -659,6 +681,9 @@ if __name__ == '__main__': print 'Location: ' + os.environ['SCRIPT_NAME']+'/\n' sys.exit(0) + if u is None: + operation = 'unauth' + if operation.startswith('/'): operation = operation[1:] if not operation: