OpenSecurity/bin/vmmanager.pyw
changeset 167 1e1811fa44bc
parent 166 6718e19352e6
child 169 a133c8d03ef8
     1.1 --- a/OpenSecurity/bin/vmmanager.pyw	Tue May 20 15:10:33 2014 +0100
     1.2 +++ b/OpenSecurity/bin/vmmanager.pyw	Thu May 22 11:00:33 2014 +0200
     1.3 @@ -183,6 +183,10 @@
     1.4      # check if the device is mass storage type
     1.5      @staticmethod
     1.6      def isMassStorageDevice(device):
     1.7 +        #TODO: implement filtering for card readers (this is olivers) 
     1.8 +        #      alternatively implement handling of multiple drives on same USB client
     1.9 +        if device.vendorid == '058f' and  device.productid=='6362':
    1.10 +            return False
    1.11          keyname = 'SYSTEM\CurrentControlSet\Enum\USB' + '\VID_' + device.vendorid+'&'+'PID_'+ device.productid
    1.12          key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, keyname)
    1.13          #subkeys = _winreg.QueryInfoKey(key)[0]
    1.14 @@ -375,7 +379,7 @@
    1.15      # stop VM
    1.16      def hibernateVM(self, vm_name):
    1.17          logger.info('Sending hibernate-disk signal to ' + vm_name)
    1.18 -        Cygwin.checkResult(Cygwin.sshExecute( '"sudo hibernate-disk&"', VMManager.getHostOnlyIP(vm_name), 'osecuser', Cygwin.cygPath(self.machineFolder) + '/' + vm_name + '/dvm_key', wait_return=False))
    1.19 +        Cygwin.checkResult(Cygwin.sshBackgroundExecute( '"sudo hibernate-disk"', VMManager.getHostOnlyIP(vm_name), 'osecuser', Cygwin.cygPath(self.machineFolder) + '/' + vm_name + '/dvm_key', wait_return=False))
    1.20              
    1.21      # poweroff VM
    1.22      def poweroffVM(self, vm_name):
    1.23 @@ -481,19 +485,14 @@
    1.24          ip = ip[:ip.rindex('.')]
    1.25          drives = dict()    
    1.26          result = Cygwin.checkResult(Cygwin.execute('C:\\Windows\\system32\\net.exe', 'USE'))
    1.27 +
    1.28 +        #logger.info( result[1] )
    1.29          for line in result[1].splitlines():
    1.30              if ip in line:
    1.31                  parts = line.split()
    1.32                  drives[parts[1]] = parts[2]
    1.33 +
    1.34          return drives
    1.35 -            
    1.36 -    def genNetworkDrive(self):
    1.37 -        network_drives = self.getNetworkDrives()
    1.38 -        logical_drives = VMManager.getLogicalDrives()
    1.39 -        drives = list(map(chr, range(68, 91)))  
    1.40 -        for drive in drives:
    1.41 -            if drive+':' not in network_drives and drive not in logical_drives:
    1.42 -                return drive+':'
    1.43  
    1.44      def getNetworkDrive(self, vm_name):
    1.45          ip = self.getHostOnlyIP(vm_name)
    1.46 @@ -502,6 +501,16 @@
    1.47              if line != None and ip in line:
    1.48                  parts = line.split()
    1.49                  return parts[1]
    1.50 +    
    1.51 +    def genNetworkDrive(self):
    1.52 +        network_drives = self.getNetworkDrives()
    1.53 +        logger.info("Used network drive letters: "+ str(network_drives.keys()).strip('[]') ) 
    1.54 +        logical_drives = VMManager.getLogicalDrives()
    1.55 +        logger.info("Used logical drive letters: "+ str(logical_drives).strip('[]') )
    1.56 +        drives = list(map(chr, range(68, 91)))  
    1.57 +        for drive in drives:
    1.58 +            if drive+':' not in network_drives and drive not in logical_drives:
    1.59 +                return drive+':'
    1.60              
    1.61      @staticmethod
    1.62      def getLogicalDrives():
    1.63 @@ -548,8 +557,15 @@
    1.64          return user_name
    1.65          
    1.66      def getUserSID(self, user_name):
    1.67 -        account_name = win32security.LookupAccountName(None, user_name)
    1.68 +        domain, user = user_name.split("\\")
    1.69 +        account_name = win32security.LookupAccountName(domain, user)
    1.70 +        if account_name == None:
    1.71 +            logger.error("Failed lookup account name for user " + user_name)
    1.72 +            return None
    1.73          sid = win32security.ConvertSidToStringSid(account_name[0])
    1.74 +        if sid == None:
    1.75 +            logger.error("Failed converting SID for account " + account_name[0])
    1.76 +            return None
    1.77          return sid
    1.78          
    1.79      def getAppDataDir(self, sid):    
    1.80 @@ -643,10 +659,17 @@
    1.81                  self.vmm.startVM(self.vm_name)
    1.82                  self.ip_addr = self.vmm.waitStartup(self.vm_name)
    1.83                  if self.ip_addr == None:
    1.84 +                    logger.error("Failed to get ip address")
    1.85                      continue
    1.86 +                else:
    1.87 +                    logger.info("Got IP address for " + self.vm_name + ' ' + self.ip_addr)
    1.88 +                
    1.89                  self.drive = self.vmm.genNetworkDrive()
    1.90                  if self.drive == None:
    1.91 +                    logger.error("Failed to assign Network drive letter")
    1.92                      continue
    1.93 +                else:
    1.94 +                    logger.info("Assigned drive " + self.drive + " to " + self.vm_name)
    1.95                  
    1.96                  try:
    1.97                      net_resource = '\\\\' + self.ip_addr + '\\Download'
    1.98 @@ -655,14 +678,29 @@
    1.99                      logger.error("Network drive connect failed. OpenSecurity Tray client not running.")
   1.100                      self.drive = None
   1.101                      continue
   1.102 -                        
   1.103 -                
   1.104 -                self.started.set()
   1.105                  
   1.106                  user = self.vmm.getActiveUserName()
   1.107 +                if user == None:
   1.108 +                    logger.error("Cannot get active user name")
   1.109 +                    continue
   1.110 +                else:
   1.111 +                    logger.info('Got active user name ' + user)
   1.112                  sid = self.vmm.getUserSID(user)
   1.113 +                if sid == None:
   1.114 +                    logger.error("Cannot get SID for active user")
   1.115 +                    continue
   1.116 +                else:
   1.117 +                    logger.info("Got active user SID " + sid + " for user " + user)
   1.118 +                    
   1.119                  path = self.vmm.getAppDataDir(sid)
   1.120 +                if path == None:
   1.121 +                    logger.error("Cannot get AppDataDir for active user")
   1.122 +                    continue
   1.123 +                else:
   1.124 +                    logger.info("Got AppData dir for user " + user + ': ' + path)
   1.125 +                
   1.126                  self.appDataDir = Cygwin.cygPath(path)
   1.127 +                logger.info("Restoring browser settings in AppData dir " + self.appDataDir)
   1.128                  # create OpenSecurity settings dir on local machine user home /AppData/Roaming 
   1.129                  Cygwin.checkResult(Cygwin.bashExecute('/usr/bin/mkdir -p \\\"' + self.appDataDir + '/OpenSecurity\\\"'))
   1.130                  # create chromium settings dir on local machine if not existing
   1.131 @@ -671,6 +709,8 @@
   1.132                  Cygwin.checkResult(Cygwin.sshExecute('"mkdir -p \\\"/home/osecuser/.config\\\""', self.ip_addr, 'osecuser', Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + self.vm_name + '/dvm_key'))
   1.133                  #restore settings on vm
   1.134                  self.vmm.restoreFile(self.appDataDir + '/OpenSecurity/chromium', '/home/osecuser/.config/')
   1.135 +                self.started.set()
   1.136 +                logger.error("Browsing SDVM running.")
   1.137                  self.restart.wait()
   1.138              except:
   1.139                  logger.error("BrowsingHandler failed. Cleaning up")