From e20bd0db8d618051ba0ea6b48ddea949e9c266ff Mon Sep 17 00:00:00 2001 From: Stephane Wirtel Date: Thu, 22 Jan 2009 14:23:38 +0100 Subject: [PATCH] [IMP] Error handling and don't save the zip file in the addons path for the migration, but only the module directory bzr revid: stephane@tinyerp.com-20090122132338-0mz0hh320e59t8ce --- bin/service/web_services.py | 40 ++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/bin/service/web_services.py b/bin/service/web_services.py index 04dd0f7d306..44c853a6d4b 100644 --- a/bin/service/web_services.py +++ b/bin/service/web_services.py @@ -401,24 +401,54 @@ GNU Public Licence. zips = rc.retrieve_updates(rc.id) - from shutil import rmtree + from shutil import rmtree, copytree, copy + + backup_directory = os.path.join(tools.config['root_path'], 'backup', time.strftime('%Y-%m-%d-%H-%M')) + if zips and not os.path.isdir(backup_directory): + l.notifyChannel('migration', netsvc.LOG_INFO, 'create a new backup directory to \ + store the old modules: %s' % (backup_directory,)) + os.makedirs(backup_directory) + for module in zips: l.notifyChannel('migration', netsvc.LOG_INFO, 'upgrade module %s' % (module,)) mp = addons.get_module_path(module) if mp: if os.path.isdir(mp): + copytree(mp, os.path.join(backup_directory, module)) if os.path.islink(mp): os.unlink(mp) else: rmtree(mp) else: + copy(mp + 'zip', backup_directory) os.unlink(mp + '.zip') - mp = os.path.join(tools.config['addons_path'], module + '.zip') + try: + try: + base64_decoded = base64.decodestring(zips[module]) + except: + l.notifyChannel('migration', netsvc.LOG_ERROR, 'unable to read the module %s' % (module,)) + raise - zip = open(mp, 'w') - zip.write(base64.decodestring(zips[module])) - zip.close() + zip_contents = cStringIO.StringIO(base64_decoded) + zip_contents.seek(0) + try: + try: + tools.extract_zip_file(zip_contents, tools.config['addons_path'] ) + except: + l.notifyChannel('migration', netsvc.LOG_ERROR, 'unable to extract the module %s' % (module, )) + rmtree(module) + raise + finally: + zip_contents.close() + except: + l.notifyChannel('migration', netsvc.LOG_ERROR, 'restore the previous version of the module %s' % (module, )) + nmp = os.path.join(backup_directory, module) + if os.path.isdir(nmp): + copytree(nmp, tools.config['addons_path']) + else: + copy(nmp+'.zip', tools.config['addons_path']) + raise return True except tm.RemoteContractException, e: