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
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):