# HG changeset patch # User Bartha Mihai # Date 1413995764 -7200 # Node ID 63f6861d0ad9e99c418234600ab7e646567a95ab # Parent 8bfcfd4dd6adfc6afde18214967fdfc1d11685c2 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 diff -r 8bfcfd4dd6ad -r 63f6861d0ad9 OpenSecurity/bin/vmmanager.pyw --- a/OpenSecurity/bin/vmmanager.pyw Fri Oct 03 11:05:36 2014 +0200 +++ b/OpenSecurity/bin/vmmanager.pyw Wed Oct 22 18:36:04 2014 +0200 @@ -283,7 +283,8 @@ for vm in self.listSDVM(): self.poweroffVM(vm) self.removeVM(vm) - + self.vms = dict() + # list all existing VMs registered with VBox def listVMS(self): result = Cygwin.vboxExecute('list vms')[1] @@ -763,16 +764,36 @@ if sid == None: logger.error("Failed converting SID for account " + account_name[0]) return None - return sid - - def getAppDataDir(self, sid): + return sid + + def getAppDataDirReg(self, sid): key = win32api.RegOpenKey(win32con.HKEY_USERS, sid + '\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders') value, _ = win32api.RegQueryValueEx(key, "AppData") win32api.RegCloseKey(key) return value - #key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' + '\\' + sid) - #value, type = win32api.RegQueryValueEx(key, "ProfileImagePath") - #print value + + def getAppDataDir(self): + user = self.getActiveUserName() + if user == None: + logger.error("Cannot get active user name") + raise OpenSecurityException("Cannot get active user name") + else: + logger.info('Got active user name ' + user) + sid = self.getUserSID(user) + if sid == None: + logger.error("Cannot get SID for active user") + raise OpenSecurityException("Cannot get SID for active user") + else: + logger.info("Got active user SID " + sid + " for user " + user) + + path = self.getAppDataDirReg(sid) + if path == None: + logger.error("Cannot get AppDataDir for active user") + raise OpenSecurityException("Cannot get AppDataDir for active user") + else: + logger.info("Got AppData dir for user " + user + ': ' + path) + + return Cygwin.cygPath(path) #import initial template def importTemplate(self, image_path): @@ -910,13 +931,13 @@ def startUpdateTemplate(self): if self.updateHandler and self.updateHandler.isAlive(): - import_logger.info("Initial import already running.") + import_logger.info("Template update already running.") return self.updateHandler = UpdateHandler(self) self.updateHandler.start() - import_logger.info("Initial import started.") + import_logger.info("Template update started.") - def createSession(self): + def createSession(self, browsing=False): new_sdvm = self.newSDVM() self.attachVDisk(new_sdvm, 'SATA', '0', '0', self.templateImage) self.genCertificate(new_sdvm) @@ -930,7 +951,19 @@ return None else: logger.info("Got IP address for " + new_sdvm + ' ' + new_ip) - self.vms[new_sdvm] = {'vm_name' : new_sdvm, 'ip_addr' : new_ip, 'used' : False, 'running' : True} + self.vms[new_sdvm] = {'vm_name' : new_sdvm, 'ip_addr' : new_ip, 'used' : False, 'running' : True, 'browsing' : browsing } + if browsing: + # restore browser settings + appDataDir = self.getAppDataDir() + logger.info("Restoring browser settings in AppData dir " + appDataDir) + # create OpenSecurity settings dir on local machine user home /AppData/Roaming + Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity\\\"') + # create chromium settings dir on local machine if not existing + Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity/chromium\\\"') + # create chromium settings dir on remote machine if not existing + Cygwin.sshExecute('"mkdir -p \\\"/home/osecuser/.config\\\""', new_ip, 'osecuser', Cygwin.cygPath(self.getMachineFolder()) + '/' + new_sdvm + '/dvm_key') + #restore settings on vm + self.restoreFile(new_sdvm, new_ip, appDataDir + '/OpenSecurity/chromium', '/home/osecuser/.config/') return self.vms[new_sdvm] def releaseSession(self, vm_name): @@ -939,14 +972,29 @@ self.removeVM(vm_name) self.sdvmFactory.trigger() - def getSession(self): + def getSession(self, browsing = False): # return first found unused SDVM for vm in self.vms.values(): - if vm['used'] == False: + if vm['used'] == False and vm['browsing'] == browsing: vm['used'] = True self.sdvmFactory.trigger() return vm - return self.createSession() + return self.createSession(browsing) + + + def backupFile(self, vm_name, ip_addr, src, dest): + global backup_lock + with backup_lock: + certificate = Cygwin.cygPath(self.getMachineFolder()) + '/' + vm_name + '/dvm_key' + command = '-r -o StrictHostKeyChecking=no -i "' + certificate + '" "osecuser@' + ip_addr + ':' + src + '" "' + dest + '"' + return Cygwin.execute(Cygwin.cygwin_scp, command, wait_return=True, window=False) + + def restoreFile(self, vm_name, ip_addr, src, dest): + certificate = Cygwin.cygPath(self.getMachineFolder()) + '/' + vm_name + '/dvm_key' + command = '-r -o StrictHostKeyChecking=no -i "' + certificate + '" "' + src + '" "osecuser@' + ip_addr + ':' + dest + '"' + return Cygwin.execute(Cygwin.cygwin_scp, command, wait_return=True, window=False) + + class SDVMFactory(threading.Thread): vmm = None @@ -962,18 +1010,23 @@ while self.running: self.triggerEv.clear() - if len(self.vmm.vms) < 2: - self.vmm.createSession() - continue - unused = 0 + # find existance of free device and browsing sessions + freeDeviceSession = False + freeBrowsingSession = False for vm in self.vmm.vms.values(): - if vm['used'] == False: - unused+=1 - if unused == 0: - self.vmm.createSession() + if vm['used'] == False and vm['browsing'] == False: + freeDeviceSession = True + if vm['used'] == False and vm['browsing'] == True: + freeBrowsingSession = True + + #prepare new sessions if none + if not freeDeviceSession: + self.vmm.createSession(False) + if not freeBrowsingSession: + self.vmm.createSession(True) self.triggerEv.wait() - def trigger(self): + def trigger(self, ): self.triggerEv.set() def stop(self): @@ -998,7 +1051,7 @@ def run(self): session = None try: - appDataDir = self.getAppDataDir() + #appDataDir = self.getAppDataDir() session = self.vmm.getSession() if not session: @@ -1008,17 +1061,17 @@ self.vm_name = session['vm_name'] self.net_resource = '\\\\' + self.ip_addr + '\\Download' - urllib2.urlopen('http://127.0.0.1:8090/netmount?'+'net_resource='+self.net_resource).readline() + urllib2.urlopen('http://127.0.0.1:8090/netmount?'+'net_resource='+self.net_resource)#.readline() - logger.info("Restoring browser settings in AppData dir " + appDataDir) + #logger.info("Restoring browser settings in AppData dir " + appDataDir) # create OpenSecurity settings dir on local machine user home /AppData/Roaming - Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity\\\"') + #Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity\\\"') # create chromium settings dir on local machine if not existing - Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity/chromium\\\"') + #Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + appDataDir + '/OpenSecurity/chromium\\\"') # create chromium settings dir on remote machine if not existing - Cygwin.sshExecute('"mkdir -p \\\"/home/osecuser/.config\\\""', self.ip_addr, 'osecuser', Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key') + #Cygwin.sshExecute('"mkdir -p \\\"/home/osecuser/.config\\\""', self.ip_addr, 'osecuser', Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key') #restore settings on vm - self.restoreFile(appDataDir + '/OpenSecurity/chromium', '/home/osecuser/.config/') + #self.restoreFile(appDataDir + '/OpenSecurity/chromium', '/home/osecuser/.config/') if self.wpad: browser = '\\\"/usr/bin/chromium --proxy-pac-url=\\\"'+self.wpad+'\\\"\\\"' @@ -1028,7 +1081,8 @@ browser = '\\\"/usr/bin/chromium\\\"' Cygwin.sshExecuteX11(browser, self.ip_addr, 'osecuser', Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key') - self.backupFile('/home/osecuser/.config/chromium', appDataDir + '/OpenSecurity/') + appDataDir = self.vmm.getAppDataDir() + self.vmm.backupFile(self.vm_name, self.ip_addr, '/home/osecuser/.config/chromium', appDataDir + '/OpenSecurity/') except urllib2.URLError: logger.error("Network drive connect failed. OpenSecurity Tray client not running.") @@ -1051,40 +1105,7 @@ self.vmm.sdvmFactory.trigger() - def backupFile(self, src, dest): - global backup_lock - with backup_lock: - certificate = Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key' - command = '-r -o StrictHostKeyChecking=no -i "' + certificate + '" "osecuser@' + self.ip_addr + ':' + src + '" "' + dest + '"' - return Cygwin.execute(Cygwin.cygwin_scp, command, wait_return=True, window=False) - def restoreFile(self, src, dest): - certificate = Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key' - command = '-r -o StrictHostKeyChecking=no -i "' + certificate + '" "' + src + '" "osecuser@' + self.ip_addr + ':' + dest + '"' - return Cygwin.execute(Cygwin.cygwin_scp, command, wait_return=True, window=False) - - def getAppDataDir(self): - user = self.vmm.getActiveUserName() - if user == None: - logger.error("Cannot get active user name") - raise OpenSecurityException("Cannot get active user name") - else: - logger.info('Got active user name ' + user) - sid = self.vmm.getUserSID(user) - if sid == None: - logger.error("Cannot get SID for active user") - raise OpenSecurityException("Cannot get SID for active user") - else: - logger.info("Got active user SID " + sid + " for user " + user) - - path = self.vmm.getAppDataDir(sid) - if path == None: - logger.error("Cannot get AppDataDir for active user") - raise OpenSecurityException("Cannot get AppDataDir for active user") - else: - logger.info("Got AppData dir for user " + user + ': ' + path) - - return Cygwin.cygPath(path) class DeviceHandler(threading.Thread):