corrected terminate / update template / etc.
authorBarthaM@N3SIM1218.D03.arc.local
Thu, 22 May 2014 16:01:28 +0100
changeset 17081d5f845d966
parent 169 a133c8d03ef8
child 171 2701e921bf4c
corrected terminate / update template / etc.
OpenSecurity/bin/opensecurityd.pyw
OpenSecurity/bin/vmmanager.pyw
     1.1 --- a/OpenSecurity/bin/opensecurityd.pyw	Thu May 22 12:17:57 2014 +0200
     1.2 +++ b/OpenSecurity/bin/opensecurityd.pyw	Thu May 22 16:01:28 2014 +0100
     1.3 @@ -124,7 +124,7 @@
     1.4  
     1.5          machine_folder = Cygwin.cygPath(gvm_mgr.getMachineFolder()) 
     1.6          download_initial_image_script = Cygwin.cygPath(os.path.abspath(os.path.join(os.path.split(__file__)[0], 'download_initial_image.sh')))
     1.7 -        Cygwin.bashExecute(download_initial_image_script + ' \'' + machine_folder + '\'', wait_return = False, stdout = trace_file, stderr = trace_file) 
     1.8 +        Cygwin.bashExecute('\\"' + download_initial_image_script + '\\" \'' + machine_folder + '\'', wait_return = False, stdout = trace_file, stderr = trace_file) 
     1.9  
    1.10          res = '{ "fetch_log": "' + trace_file_name.replace('\\', '\\\\') + '" }'
    1.11          return res
    1.12 @@ -140,12 +140,22 @@
    1.13          log_call(web.ctx.environ)
    1.14          global gvm_mgr
    1.15  
    1.16 +        gvm_mgr.stop()
    1.17 +        gvm_mgr.cleanup()
    1.18 +        
    1.19 +        if gvm_mgr.vmRootName in gvm_mgr.listVM():
    1.20 +            gvm_mgr.poweroffVM(gvm_mgr.vmRootName)
    1.21 +            gvm_mgr.storageDetach(gvm_mgr.vmRootName)
    1.22 +            gvm_mgr.removeSnapshots(gvm_mgr.vmRootName)
    1.23 +            #TODO:// unregister vmdk with the vbox
    1.24 +            gvm_mgr.removeVMFolder(gvm_mgr.vmRootName)
    1.25 +        
    1.26          trace_file_name = os.path.join(Environment('OpenSecurity').log_path, 'OpenSecurity_initial_import.log')
    1.27          trace_file = open(trace_file_name, 'w+')
    1.28  
    1.29          vm_image = Cygwin.cygPath(gvm_mgr.getMachineFolder()) + '/OsecVM.ova'
    1.30          initial_import_script = Cygwin.cygPath(os.path.abspath(os.path.join(os.path.split(__file__)[0], 'initial_vm.sh')))
    1.31 -        Cygwin.bashExecute(initial_import_script + ' \'' + vm_image + '\'', wait_return = False, stdout = trace_file, stderr = trace_file) 
    1.32 +        Cygwin.bashExecute('\\"' + initial_import_script + '\\" \'' + vm_image + '\'', wait_return = False, stdout = trace_file, stderr = trace_file) 
    1.33  
    1.34          res = '{ "init_log": "' + trace_file_name.replace('\\', '\\\\') + '" }'
    1.35          return res
    1.36 @@ -348,6 +358,7 @@
    1.37      def GET(self):
    1.38          log_call(web.ctx.environ)
    1.39          global gvm_mgr
    1.40 +        gvm_mgr.stop()
    1.41          gvm_mgr.cleanup()
    1.42          global server
    1.43          server.stop()
    1.44 @@ -427,9 +438,8 @@
    1.45      # gracefully
    1.46      sys.exit(0)
    1.47  
    1.48 -
    1.49 -
    1.50  # start
    1.51  if __name__ == "__main__":
    1.52      main()
    1.53 +    sys.exit(0)
    1.54  
     2.1 --- a/OpenSecurity/bin/vmmanager.pyw	Thu May 22 12:17:57 2014 +0200
     2.2 +++ b/OpenSecurity/bin/vmmanager.pyw	Thu May 22 16:01:28 2014 +0100
     2.3 @@ -78,10 +78,7 @@
     2.4          # only proceed if we have a working background environment
     2.5          if self.backend_ok():
     2.6              self.cleanup()
     2.7 -            self.browsingManager = BrowsingManager(self)
     2.8 -            self.browsingManager.start()
     2.9 -            self.rsdHandler = DeviceHandler(self)
    2.10 -            self.rsdHandler.start()
    2.11 +            self.start()
    2.12          else:
    2.13              logger.critical(self.status_message)
    2.14      
    2.15 @@ -122,18 +119,34 @@
    2.16          self.status_message = 'All is ok.'
    2.17  
    2.18          return True
    2.19 -
    2.20 -
    2.21 -    def cleanup(self):
    2.22 +    
    2.23 +    def stop(self):
    2.24          if self.rsdHandler != None:
    2.25              self.rsdHandler.stop()
    2.26              self.rsdHandler.join()
    2.27 +            self.rsdHandler = None
    2.28 +            
    2.29 +        if self.browsingManager != None:
    2.30 +            self.browsingManager.stop()
    2.31 +            self.browsingManager.join()
    2.32 +            self.browsingManager = None
    2.33 +    
    2.34 +    def start(self):
    2.35 +        self.stop()
    2.36 +        self.browsingManager = BrowsingManager(self)
    2.37 +        self.browsingManager.start()
    2.38 +        self.rsdHandler = DeviceHandler(self)
    2.39 +        self.rsdHandler.start()
    2.40 +        
    2.41 +
    2.42 +    def cleanup(self):
    2.43 +        self.stop()
    2.44          drives = self.getNetworkDrives()
    2.45          for drive in drives.keys():
    2.46              try:
    2.47                  result = urllib2.urlopen('http://127.0.0.1:8090/netumount?'+'drive_letter='+drive).readline()
    2.48              except urllib2.URLError:
    2.49 -                logger.error("Network drive disconnect failed. OpenSecurity Tray client not running.")
    2.50 +                logger.info("Network drive disconnect skipped. OpenSecurity Tray client not started yet.")
    2.51              
    2.52          for vm in self.listSDVM():
    2.53              self.poweroffVM(vm)
    2.54 @@ -291,18 +304,7 @@
    2.55      def changeStorageType(self, filename, storage_type):
    2.56          Cygwin.checkResult(Cygwin.vboxExecute('modifyhd \"' + filename + '\" --type ' + storage_type))
    2.57      
    2.58 -    # list storage snaphots for VM
    2.59 -    def updateTemplate(self):
    2.60 -
    2.61 -        self.cleanup()
    2.62 -        self.poweroffVM('SecurityDVM')
    2.63 -        self.waitShutdown('SecurityDVM')
    2.64 -        
    2.65 -        # check for updates
    2.66 -        self.genCertificateISO('SecurityDVM')
    2.67 -        self.attachCertificateISO('SecurityDVM')
    2.68 -        
    2.69 -        self.storageDetach('SecurityDVM')
    2.70 +    def removeSnapshots(self, vm_name):
    2.71          results = Cygwin.checkResult(Cygwin.vboxExecute('list hdds'))[1]
    2.72          results = results.replace('Parent UUID', 'Parent')
    2.73          items = list( "UUID:"+result for result in results.split('UUID:') if result != '')
    2.74 @@ -316,8 +318,7 @@
    2.75                      props[k] = v;
    2.76              snaps[props['UUID']] = props
    2.77          
    2.78 -        
    2.79 -        template_storage = self.machineFolder + '\SecurityDVM\SecurityDVM.vmdk'
    2.80 +        template_storage = self.machineFolder + '\\' + vm_name + '\\' + vm_name + '.vmdk'
    2.81          
    2.82          # find template uuid
    2.83          template_uuid = ''
    2.84 @@ -333,7 +334,23 @@
    2.85                  logger.debug('removing snapshot ' + hdd['UUID'])
    2.86                  Cygwin.checkResult(Cygwin.vboxExecute('closemedium disk {' + hdd['UUID'] + '} --delete'))#[1]
    2.87                  # parse result 0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
    2.88 +                
    2.89 +    # list storage snaphots for VM
    2.90 +    def updateTemplate(self):
    2.91 +        self.stop()
    2.92 +        self.cleanup()
    2.93 +        self.poweroffVM('SecurityDVM')
    2.94 +        self.waitShutdown('SecurityDVM')
    2.95          
    2.96 +        # check for updates
    2.97 +        self.genCertificateISO('SecurityDVM')
    2.98 +        self.attachCertificateISO('SecurityDVM')
    2.99 +        
   2.100 +        self.storageDetach('SecurityDVM')
   2.101 +        self.removeSnapshots('SecurityDVM')
   2.102 +        
   2.103 +        template_storage = self.machineFolder + '\\' + 'SecurityDVM' + '\\' + 'SecurityDVM' + '.vmdk'
   2.104 +        #TODO:// modify to take vm name as argument
   2.105          self.changeStorageType(template_storage,'normal')
   2.106          self.storageAttach('SecurityDVM')
   2.107          self.startVM('SecurityDVM')
   2.108 @@ -346,13 +363,18 @@
   2.109          self.storageDetach('SecurityDVM')
   2.110          self.changeStorageType(template_storage,'immutable')
   2.111          self.storageAttach('SecurityDVM')
   2.112 -        self.rsdHandler = DeviceHandler(self)
   2.113 -        self.rsdHandler.start()
   2.114 +        
   2.115 +        self.start()
   2.116      
   2.117      #remove VM from the system. should be used on VMs returned by listSDVMs    
   2.118      def removeVM(self, vm_name):
   2.119          logger.info('Removing ' + vm_name)
   2.120          Cygwin.checkResult(Cygwin.vboxExecute('unregistervm ' + vm_name + ' --delete'))
   2.121 +        #TODO:// try to close medium if still existing
   2.122 +        #Cygwin.checkResult(Cygwin.vboxExecute('closemedium disk {' + hdd['UUID'] + '} --delete'))#[1]
   2.123 +        self.removeVMFolder(vm_name)
   2.124 +    
   2.125 +    def removeVMFolder(self, vm_name):
   2.126          machineFolder = Cygwin.cygPath(self.machineFolder)
   2.127          Cygwin.checkResult(Cygwin.bashExecute('/usr/bin/rm -rf \\\"' + machineFolder + '/' + vm_name + '\\\"'))
   2.128      
   2.129 @@ -629,7 +651,10 @@
   2.130          self.vmm = vmmanager
   2.131          self.restart = threading.Event()
   2.132          self.started = threading.Event()
   2.133 -        
   2.134 +    
   2.135 +    def stop(self):
   2.136 +        self.running = False
   2.137 +        self.restart.set()   
   2.138       
   2.139      def run(self):
   2.140          while self.running: