moved chromium restore functionality to creation of SDVm in order to reduce startup times
authorBartha Mihai <mihai.bartha@ait.ac.at>
Wed, 22 Oct 2014 18:36:04 +0200
changeset 23763f6861d0ad9
parent 236 8bfcfd4dd6ad
child 238 d33edf5c2717
moved chromium restore functionality to creation of SDVm in order to reduce startup times
new policy ensures that there are at least 2 unused vms running that are available on request
OpenSecurity/bin/vmmanager.pyw
     1.1 --- a/OpenSecurity/bin/vmmanager.pyw	Fri Oct 03 11:05:36 2014 +0200
     1.2 +++ b/OpenSecurity/bin/vmmanager.pyw	Wed Oct 22 18:36:04 2014 +0200
     1.3 @@ -283,7 +283,8 @@
     1.4          for vm in self.listSDVM():
     1.5              self.poweroffVM(vm)
     1.6              self.removeVM(vm)
     1.7 -
     1.8 +        self.vms = dict()
     1.9 +        
    1.10      # list all existing VMs registered with VBox
    1.11      def listVMS(self):
    1.12          result = Cygwin.vboxExecute('list vms')[1]
    1.13 @@ -763,16 +764,36 @@
    1.14          if sid == None:
    1.15              logger.error("Failed converting SID for account " + account_name[0])
    1.16              return None
    1.17 -        return sid
    1.18 -        
    1.19 -    def getAppDataDir(self, sid):    
    1.20 +        return sid    
    1.21 +    
    1.22 +    def getAppDataDirReg(self, sid):    
    1.23          key = win32api.RegOpenKey(win32con.HKEY_USERS, sid + '\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')
    1.24          value, _ = win32api.RegQueryValueEx(key, "AppData")
    1.25          win32api.RegCloseKey(key)
    1.26          return value
    1.27 -        #key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' + '\\' + sid)
    1.28 -        #value, type = win32api.RegQueryValueEx(key, "ProfileImagePath")
    1.29 -        #print value
    1.30 +                   
    1.31 +    def getAppDataDir(self):
    1.32 +        user = self.getActiveUserName()
    1.33 +        if user == None:
    1.34 +            logger.error("Cannot get active user name")
    1.35 +            raise OpenSecurityException("Cannot get active user name")
    1.36 +        else:
    1.37 +            logger.info('Got active user name ' + user)
    1.38 +        sid = self.getUserSID(user)
    1.39 +        if sid == None:
    1.40 +            logger.error("Cannot get SID for active user")
    1.41 +            raise OpenSecurityException("Cannot get SID for active user")
    1.42 +        else:
    1.43 +            logger.info("Got active user SID " + sid + " for user " + user)
    1.44 +            
    1.45 +        path = self.getAppDataDirReg(sid)
    1.46 +        if path == None:
    1.47 +            logger.error("Cannot get AppDataDir for active user")
    1.48 +            raise OpenSecurityException("Cannot get AppDataDir for active user")
    1.49 +        else:
    1.50 +            logger.info("Got AppData dir for user " + user + ': ' + path)
    1.51 +        
    1.52 +        return Cygwin.cygPath(path)
    1.53      
    1.54      #import initial template
    1.55      def importTemplate(self, image_path):
    1.56 @@ -910,13 +931,13 @@
    1.57          
    1.58      def startUpdateTemplate(self):
    1.59          if self.updateHandler and self.updateHandler.isAlive():
    1.60 -            import_logger.info("Initial import already running.")
    1.61 +            import_logger.info("Template update already running.")
    1.62              return
    1.63          self.updateHandler = UpdateHandler(self)
    1.64          self.updateHandler.start()
    1.65 -        import_logger.info("Initial import started.")
    1.66 +        import_logger.info("Template update started.")
    1.67          
    1.68 -    def createSession(self):
    1.69 +    def createSession(self, browsing=False):
    1.70          new_sdvm = self.newSDVM()
    1.71          self.attachVDisk(new_sdvm, 'SATA', '0', '0', self.templateImage)
    1.72          self.genCertificate(new_sdvm)
    1.73 @@ -930,7 +951,19 @@
    1.74              return None
    1.75          else:
    1.76              logger.info("Got IP address for " + new_sdvm + ' ' + new_ip)
    1.77 -            self.vms[new_sdvm] = {'vm_name' : new_sdvm, 'ip_addr' : new_ip, 'used' : False, 'running' : True}
    1.78 +            self.vms[new_sdvm] = {'vm_name' : new_sdvm, 'ip_addr' : new_ip, 'used' : False, 'running' : True, 'browsing' : browsing }
    1.79 +            if browsing:
    1.80 +                # restore browser settings
    1.81 +                appDataDir = self.getAppDataDir()
    1.82 +                logger.info("Restoring browser settings in AppData dir " + appDataDir)
    1.83 +                # create OpenSecurity settings dir on local machine user home /AppData/Roaming 
    1.84 +                Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity\\\"')
    1.85 +                # create chromium settings dir on local machine if not existing
    1.86 +                Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity/chromium\\\"')
    1.87 +                # create chromium settings dir on remote machine if not existing
    1.88 +                Cygwin.sshExecute('"mkdir -p \\\"/home/osecuser/.config\\\""', new_ip, 'osecuser', Cygwin.cygPath(self.getMachineFolder()) + '/' + new_sdvm + '/dvm_key')
    1.89 +                #restore settings on vm
    1.90 +                self.restoreFile(new_sdvm, new_ip, appDataDir + '/OpenSecurity/chromium', '/home/osecuser/.config/')
    1.91              return self.vms[new_sdvm]
    1.92              
    1.93      def releaseSession(self, vm_name):
    1.94 @@ -939,14 +972,29 @@
    1.95          self.removeVM(vm_name)
    1.96          self.sdvmFactory.trigger()
    1.97          
    1.98 -    def getSession(self):
    1.99 +    def getSession(self, browsing = False):
   1.100          # return first found unused SDVM
   1.101          for vm in self.vms.values():
   1.102 -            if vm['used'] == False:
   1.103 +            if vm['used'] == False and vm['browsing'] == browsing:
   1.104                  vm['used'] = True
   1.105                  self.sdvmFactory.trigger()
   1.106                  return vm
   1.107 -        return self.createSession()
   1.108 +        return self.createSession(browsing)
   1.109 +        
   1.110 +            
   1.111 +    def backupFile(self, vm_name, ip_addr, src, dest):
   1.112 +        global backup_lock
   1.113 +        with backup_lock:
   1.114 +            certificate = Cygwin.cygPath(self.getMachineFolder()) + '/' + vm_name + '/dvm_key'
   1.115 +            command = '-r -o StrictHostKeyChecking=no -i "' + certificate + '" "osecuser@' + ip_addr + ':' + src + '" "' + dest + '"'
   1.116 +            return Cygwin.execute(Cygwin.cygwin_scp, command, wait_return=True, window=False)
   1.117 +    
   1.118 +    def restoreFile(self, vm_name, ip_addr, src, dest):
   1.119 +        certificate = Cygwin.cygPath(self.getMachineFolder()) + '/' + vm_name + '/dvm_key'
   1.120 +        command = '-r -o StrictHostKeyChecking=no -i "' + certificate + '" "' + src + '" "osecuser@' + ip_addr + ':' + dest + '"'
   1.121 +        return Cygwin.execute(Cygwin.cygwin_scp, command, wait_return=True, window=False)
   1.122 +
   1.123 +    
   1.124          
   1.125  class SDVMFactory(threading.Thread):
   1.126      vmm = None
   1.127 @@ -962,18 +1010,23 @@
   1.128          while self.running:
   1.129              self.triggerEv.clear()            
   1.130  
   1.131 -            if len(self.vmm.vms) < 2:
   1.132 -                self.vmm.createSession()
   1.133 -                continue
   1.134 -            unused = 0
   1.135 +            # find existance of free device and browsing sessions 
   1.136 +            freeDeviceSession = False
   1.137 +            freeBrowsingSession = False
   1.138              for vm in self.vmm.vms.values():
   1.139 -                if vm['used'] == False:
   1.140 -                    unused+=1
   1.141 -            if unused == 0:
   1.142 -                self.vmm.createSession()
   1.143 +                if vm['used'] == False and vm['browsing'] == False:
   1.144 +                    freeDeviceSession = True
   1.145 +                if vm['used'] == False and vm['browsing'] == True:
   1.146 +                    freeBrowsingSession = True
   1.147 +            
   1.148 +            #prepare new sessions if none
   1.149 +            if not freeDeviceSession:
   1.150 +                self.vmm.createSession(False)
   1.151 +            if not freeBrowsingSession:
   1.152 +                self.vmm.createSession(True)
   1.153              self.triggerEv.wait()
   1.154      
   1.155 -    def trigger(self):
   1.156 +    def trigger(self, ):
   1.157          self.triggerEv.set()
   1.158          
   1.159      def stop(self):
   1.160 @@ -998,7 +1051,7 @@
   1.161      def run(self):
   1.162          session = None
   1.163          try:
   1.164 -            appDataDir = self.getAppDataDir()
   1.165 +            #appDataDir = self.getAppDataDir()
   1.166  
   1.167              session = self.vmm.getSession()
   1.168              if not session:
   1.169 @@ -1008,17 +1061,17 @@
   1.170              self.vm_name = session['vm_name']
   1.171              
   1.172              self.net_resource = '\\\\' + self.ip_addr + '\\Download'
   1.173 -            urllib2.urlopen('http://127.0.0.1:8090/netmount?'+'net_resource='+self.net_resource).readline()
   1.174 +            urllib2.urlopen('http://127.0.0.1:8090/netmount?'+'net_resource='+self.net_resource)#.readline()
   1.175              
   1.176 -            logger.info("Restoring browser settings in AppData dir " + appDataDir)
   1.177 +            #logger.info("Restoring browser settings in AppData dir " + appDataDir)
   1.178              # create OpenSecurity settings dir on local machine user home /AppData/Roaming 
   1.179 -            Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity\\\"')
   1.180 +            #Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity\\\"')
   1.181              # create chromium settings dir on local machine if not existing
   1.182 -            Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity/chromium\\\"')
   1.183 +            #Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity/chromium\\\"')
   1.184              # create chromium settings dir on remote machine if not existing
   1.185 -            Cygwin.sshExecute('"mkdir -p \\\"/home/osecuser/.config\\\""', self.ip_addr, 'osecuser', Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key')
   1.186 +            #Cygwin.sshExecute('"mkdir -p \\\"/home/osecuser/.config\\\""', self.ip_addr, 'osecuser', Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key')
   1.187              #restore settings on vm
   1.188 -            self.restoreFile(appDataDir + '/OpenSecurity/chromium', '/home/osecuser/.config/')
   1.189 +            #self.restoreFile(appDataDir + '/OpenSecurity/chromium', '/home/osecuser/.config/')
   1.190                      
   1.191              if self.wpad:
   1.192                  browser = '\\\"/usr/bin/chromium --proxy-pac-url=\\\"'+self.wpad+'\\\"\\\"'
   1.193 @@ -1028,7 +1081,8 @@
   1.194                  browser = '\\\"/usr/bin/chromium\\\"'
   1.195                  
   1.196              Cygwin.sshExecuteX11(browser, self.ip_addr, 'osecuser', Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key')
   1.197 -            self.backupFile('/home/osecuser/.config/chromium', appDataDir + '/OpenSecurity/')
   1.198 +            appDataDir = self.vmm.getAppDataDir()
   1.199 +            self.vmm.backupFile(self.vm_name, self.ip_addr, '/home/osecuser/.config/chromium', appDataDir + '/OpenSecurity/')
   1.200          
   1.201          except urllib2.URLError:
   1.202              logger.error("Network drive connect failed. OpenSecurity Tray client not running.")
   1.203 @@ -1051,40 +1105,7 @@
   1.204          
   1.205          self.vmm.sdvmFactory.trigger()
   1.206  
   1.207 -    def backupFile(self, src, dest):
   1.208 -        global backup_lock
   1.209 -        with backup_lock:
   1.210 -            certificate = Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key'
   1.211 -            command = '-r -o StrictHostKeyChecking=no -i "' + certificate + '" "osecuser@' + self.ip_addr + ':' + src + '" "' + dest + '"'
   1.212 -            return Cygwin.execute(Cygwin.cygwin_scp, command, wait_return=True, window=False)
   1.213      
   1.214 -    def restoreFile(self, src, dest):
   1.215 -        certificate = Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key'
   1.216 -        command = '-r -o StrictHostKeyChecking=no -i "' + certificate + '" "' + src + '" "osecuser@' + self.ip_addr + ':' + dest + '"'
   1.217 -        return Cygwin.execute(Cygwin.cygwin_scp, command, wait_return=True, window=False)
   1.218 -                
   1.219 -    def getAppDataDir(self):
   1.220 -        user = self.vmm.getActiveUserName()
   1.221 -        if user == None:
   1.222 -            logger.error("Cannot get active user name")
   1.223 -            raise OpenSecurityException("Cannot get active user name")
   1.224 -        else:
   1.225 -            logger.info('Got active user name ' + user)
   1.226 -        sid = self.vmm.getUserSID(user)
   1.227 -        if sid == None:
   1.228 -            logger.error("Cannot get SID for active user")
   1.229 -            raise OpenSecurityException("Cannot get SID for active user")
   1.230 -        else:
   1.231 -            logger.info("Got active user SID " + sid + " for user " + user)
   1.232 -            
   1.233 -        path = self.vmm.getAppDataDir(sid)
   1.234 -        if path == None:
   1.235 -            logger.error("Cannot get AppDataDir for active user")
   1.236 -            raise OpenSecurityException("Cannot get AppDataDir for active user")
   1.237 -        else:
   1.238 -            logger.info("Got AppData dir for user " + user + ': ' + path)
   1.239 -        
   1.240 -        return Cygwin.cygPath(path)
   1.241              
   1.242                  
   1.243  class DeviceHandler(threading.Thread):