OpenSecurity/bin/vmmanager.pyw
changeset 237 63f6861d0ad9
parent 235 8fd7b197735c
child 238 d33edf5c2717
     1.1 --- a/OpenSecurity/bin/vmmanager.pyw	Thu Oct 02 18:29:40 2014 +0100
     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):