OpenSecurity/bin/vmmanager.pyw
changeset 135 c9499f5166c7
parent 133 6649faffb63c
child 141 ca6622112caa
     1.1 --- a/OpenSecurity/bin/vmmanager.pyw	Fri Apr 25 13:23:20 2014 +0200
     1.2 +++ b/OpenSecurity/bin/vmmanager.pyw	Tue Apr 29 15:40:48 2014 +0100
     1.3 @@ -54,7 +54,6 @@
     1.4      #    return self.coords[item]
     1.5   
     1.6  class VMManager(object):
     1.7 -
     1.8      vmRootName = "SecurityDVM"
     1.9      systemProperties = None
    1.10      _instance = None
    1.11 @@ -121,7 +120,8 @@
    1.12              self.rsdHandler.join()
    1.13          drives = self.getNetworkDrives()
    1.14          for drive in drives.keys():
    1.15 -            self.unmapNetworkDrive(drive)
    1.16 +            driveHandler = UnmapDriveHandler(self, drive)
    1.17 +            driveHandler.start()
    1.18          for vm in self.listSDVM():
    1.19              self.poweroffVM(vm)
    1.20              self.removeVM(vm)
    1.21 @@ -458,19 +458,13 @@
    1.22          handler.start()
    1.23          return 'ok'
    1.24      
    1.25 -    #Small function to check the availability of network resource.
    1.26 -    #def isAvailable(self, path):
    1.27 -        #return os.path.exists(path)
    1.28 -        #result = Cygwin.cmdExecute('IF EXIST "' + path + '" echo YES')
    1.29 -        #return string.find(result[1], 'YES',)
    1.30 -    
    1.31 -    #Small function to check if the mention location is a directory
    1.32 +    #Small function to check if the mentioned location is a directory
    1.33      def isDirectory(self, path):
    1.34          result = checkResult(Cygwin.cmdExecute('dir ' + path + ' | FIND ".."'))
    1.35          return string.find(result[1], 'DIR',)
    1.36  
    1.37      def mapNetworkDrive(self, drive, networkPath, user, password):
    1.38 -        self.unmapNetworkDrive(drive)
    1.39 +        #self.unmapNetworkDrive(drive)
    1.40          #Check for drive availability
    1.41          if os.path.exists(drive):
    1.42              logger.error("Drive letter is already in use: " + drive)
    1.43 @@ -483,24 +477,25 @@
    1.44                  return -1
    1.45              logger.info("Path not accessible: " + networkPath + " retrying")
    1.46              retry-=1
    1.47 -            #return -1
    1.48      
    1.49          command = 'USE ' + drive + ' ' + networkPath + ' /PERSISTENT:NO'
    1.50          if user != None:
    1.51              command += ' ' + password + ' /User' + user
    1.52      
    1.53 -        #TODO: Execute 'NET USE' command with authentication
    1.54 -        result = checkResult(Cygwin.execute('C:\\Windows\\system32\\net.exe', command))
    1.55 +        result = checkResult(Cygwin.execute('C:\\Windows\\system32\\NET ', command))
    1.56 +        #result = checkResult(Cygwin.cmdExecute('NET ' + command))
    1.57          if string.find(result[1], 'successfully',) == -1:
    1.58              logger.error("Failed: NET " + command)
    1.59              return -1
    1.60          return 1
    1.61      
    1.62      def unmapNetworkDrive(self, drive):
    1.63 -        drives = self.getNetworkDrives()
    1.64 -        if drive not in drives.keys():
    1.65 -            return 1 
    1.66 -        result = checkResult(Cygwin.execute('C:\\Windows\\system32\\net.exe', 'USE ' + drive + ' /DELETE /YES'))
    1.67 +        #drives = self.getNetworkDrives()
    1.68 +        #if drive not in drives.keys():
    1.69 +        #    return 1 
    1.70 +        command = 'USE ' + drive + ' /DELETE /YES' #' ' + networkPath +
    1.71 +        result = checkResult(Cygwin.execute('C:\\Windows\\system32\\net.exe', command)) 
    1.72 +        #result = checkResult(Cygwin.cmdExecute('NET ' + command)) 
    1.73          if string.find(str(result[1]), 'successfully',) == -1:
    1.74              logger.error(result[2])
    1.75              return -1
    1.76 @@ -531,7 +526,7 @@
    1.77          for line in result[1].splitlines():
    1.78              if line != None and ip in line:
    1.79                  parts = line.split()
    1.80 -                return parts[0]
    1.81 +                return parts[1]
    1.82      @staticmethod
    1.83      def getLogicalDrives():
    1.84          drive_bitmask = ctypes.cdll.kernel32.GetLogicalDrives()
    1.85 @@ -565,12 +560,30 @@
    1.86  
    1.87  def checkResult(result):
    1.88      if result[0] != 0:
    1.89 -        logger.error('Command failed:\n' + result[2])
    1.90 +        logger.error('Command failed:' + ''.join(result[2]))
    1.91          raise OpenSecurityException('Command failed:' + ''.join(result[2]))
    1.92      return result
    1.93  
    1.94 -
    1.95 -            
    1.96 +# handles browsing request                    
    1.97 +class UnmapDriveHandler(threading.Thread): 
    1.98 +    vmm = None
    1.99 +    drive = None
   1.100 +    running = True
   1.101 +    #Cygwin.start_X11()
   1.102 +    def __init__(self, vmmanager, drv):
   1.103 +        threading.Thread.__init__(self)
   1.104 +        self.vmm = vmmanager            
   1.105 +        self.drive = drv
   1.106 +        
   1.107 +    def run(self):
   1.108 +        while self.running:
   1.109 +             self.vmm.unmapNetworkDrive(self.drive)
   1.110 +             mappedDrives = self.vmm.getNetworkDrives()
   1.111 +             #logger.info(mappedDrives)
   1.112 +             #logger.info(self.drive)
   1.113 +             if self.drive not in mappedDrives.keys():
   1.114 +                 self.running = False
   1.115 +    
   1.116  # handles browsing request                    
   1.117  class BrowsingHandler(threading.Thread):   
   1.118      vmm = None
   1.119 @@ -581,6 +594,7 @@
   1.120       
   1.121      def run(self):
   1.122          drive = None
   1.123 +        networkPath = None
   1.124          try:
   1.125              new_sdvm = self.vmm.generateSDVMName()
   1.126              self.vmm.createVM(new_sdvm)
   1.127 @@ -591,7 +605,8 @@
   1.128              new_ip = self.vmm.waitStartup(new_sdvm)
   1.129              drive = self.vmm.genNetworkDrive()
   1.130              if new_ip != None:
   1.131 -                self.vmm.mapNetworkDrive(drive, '\\\\' + new_ip + '\\Download', None, None)
   1.132 +                networkPath = '\\\\' + new_ip + '\\Download'
   1.133 +                self.vmm.mapNetworkDrive(drive, networkPath, None, None)
   1.134              #browser = '/usr/bin/iceweasel'
   1.135              #browser = '/usr/bin/midori'
   1.136              #browser = '/usr/bin/chromium '
   1.137 @@ -603,8 +618,13 @@
   1.138              result = checkResult(Cygwin.sshExecuteX11(browser, new_ip, 'osecuser', Cygwin.cygPath(self.vmm.getMachineFolder()) + '/' + new_sdvm + '/dvm_key'))
   1.139          except:
   1.140              logger.error("BrowsingHandler failed. Cleaning up")
   1.141 -        if drive != None:    
   1.142 -            self.vmm.unmapNetworkDrive(drive)
   1.143 +        
   1.144 +        if drive != None: # and networkPath != None:    
   1.145 +            #self.vmm.unmapNetworkDrive(drive) #, networkPath)
   1.146 +            driveHandler = UnmapDriveHandler(self.vmm, drive)
   1.147 +            driveHandler.start()
   1.148 +
   1.149 +            
   1.150          self.vmm.poweroffVM(new_sdvm)
   1.151          self.vmm.removeVM(new_sdvm)
   1.152                  
   1.153 @@ -622,6 +642,7 @@
   1.154          
   1.155      def run(self):
   1.156          self.connectedRSDs = dict()
   1.157 +        
   1.158          while self.running:
   1.159              tmp_rsds = self.vmm.getConnectedRSDS()
   1.160              
   1.161 @@ -629,11 +650,14 @@
   1.162              for vm_name in self.attachedRSDs.keys():
   1.163                  if self.attachedRSDs[vm_name] not in tmp_rsds.values():
   1.164                      drive = self.vmm.getNetworkDrive(vm_name)
   1.165 -                    self.vmm.unmapNetworkDrive(drive)
   1.166                      #self.stopVM(vm_name)
   1.167                      self.vmm.detachRSD(vm_name)
   1.168                      self.vmm.poweroffVM(vm_name)
   1.169                      self.vmm.removeVM(vm_name)
   1.170 +                    if drive != None:
   1.171 +                        #self.vmm.unmapNetworkDrive(drive)
   1.172 +                        driveHandler = UnmapDriveHandler(self.vmm, drive)
   1.173 +                        driveHandler.start()
   1.174                      break
   1.175                      
   1.176                      
   1.177 @@ -644,9 +668,7 @@
   1.178              
   1.179              logger.info("Something's changed")          
   1.180              self.connectedRSDs = tmp_rsds
   1.181 -            
   1.182 -            
   1.183 -            
   1.184 +           
   1.185              #create new vm for attached device if any
   1.186              self.attachedRSDs = self.vmm.getAttachedRSDs()
   1.187              self.connectedRSDs = self.vmm.getConnectedRSDS()