def move_in_place(source,rootdir): log_dia_info('Start moving the deltas into their correct locations:') log_dia_info('Source %s' %source) log_dia_info('Target %s' %rootdir) anpattern = re.compile('^([A-Z]+)') ctr = 0 for dir in os.listdir(source): if ctr % CHECK_REMAINING_STORAGE_EVERY == 0: if utils.get_free_space_mb(rootdir) < MIN_DISK_MB: wx.MessageBox('Not enough space left on device, cancelling', 'Info',wx.OK | wx.ICON_WARNING) break if dir[0].isdigit(): if not os.path.exists(rootdir + NBR_FOLDER): os.makedirs(rootdir + NBR_FOLDER) elif anpattern.match(dir[0].upper()): basedir = rootdir + dir[0].upper(); if not os.path.exists(basedir): os.makedirs(basedir) else: if not os.path.exists(rootdir + MISC_FOLDER): os.makedirs(rootdir + MISC_FOLDER) if os.path.isdir(source + dir): target_dir = find_destination_dir(dir.upper(),rootdir) pattern = re.compile('^([A-Z]+)') if dir.upper()[0].isdigit(): target = rootdir + '0-9' + '/' + target_dir + '/' + dir elif pattern.match(dir.upper()[0]): target = rootdir + dir[0].upper() + '/' + target_dir + '/' + dir else: target = rootdir + '___MISC___' + '/' + dir target.replace('\\', '/') for subdir in os.listdir(source + dir): source_folder = source + dir + '/' + subdir target_folder = target + '/' + subdir log_dia_info('Moving entry [%s][%s]' %(source_folder, target_folder)) try: if os.path.exists(target_folder): shutil.rmtree(target_folder,True,None) shutil.copytree(source_folder, target_folder) shutil.copystat(source_folder, target_folder) except WindowsError: log_dia_info('Error during copy from [%s] to [%s]' % (source_folder,target_folder)) else: shutil.copy('%s%s' %(source,dir), rootdir)
def extract_file(location, target,curr_item,was_install): fh = open(location, 'rb') was_cancelled = False ctr = 0 try: z = zipfile.ZipFile(fh) for name in z.namelist(): try: outpath = target z.extract(name, outpath) if ctr % UPDATE_LOG_DIA_EVERY == 0: log_dia('Extracting %s' % name) if ctr % CHECK_REMAINING_STORAGE_EVERY == 0: if get_free_space_mb(target) < MIN_DISK_MB: wx.MessageBox('Not enough space left on device, cancelling', 'Info',wx.OK | wx.ICON_WARNING) was_cancelled = True break if was_dia_cancelled(): was_cancelled = True break ctr += 1 except: log_dia_info('unable to extract [%s]' %name) except: raise InvalidZipFileException('Invalid zipentry') finally: fh.close() if was_cancelled and was_install: folder = '%s/%s' % (target,curr_item.folder) log_dia_info('Cleaned up folder %s after cancel' % folder) delete_folder(folder) curr_item.was_installed = False delete_file(resolveDbFile(target,curr_item.name)) log_dia_info('Done')
def update_item(self, item,dispose_dia = True): post_ga_event('update_item','artifact_%s' % item.name) try: if item.create_delta: for deltaitem in item.deltas: if not utils.check_if_already_updated_with_delta(dir_name, item.name, deltaitem.version): log_dia_info('Updating file %s' % deltaitem.file) retries = 0 nof_retries = 3 while retries < nof_retries: utils.get_file(utils.resolve_delta_dir(item),utils.get_storage_location(deltaitem.file),deltaitem.file,item.name) dia_tick() if was_dia_cancelled(): log_dia_info('Cancelling...') break if item.dynamic_import: utils.delete_folder(utils.user_file_cache_dyn) utils.create_dir(utils.user_file_cache_dyn) try: if was_dia_cancelled(): log_dia_info('Cancelling...') break utils.extract_file(utils.get_storage_location(deltaitem.file), utils.user_file_cache_dyn,item,True) if was_dia_cancelled(): log_dia_info('Cancelling...') break dynamic_import.move_in_place(utils.user_file_cache + 'dyn/%s/' % item.folder, '%s/%s/' % (dir_name, item.folder)) if was_dia_cancelled(): log_dia_info('Cancelling...') update_tree_view(self) break utils.update_db(dir_name, item.name, deltaitem.version) utils.delete_folder(utils.user_file_cache + 'dyn/%s/' % item.folder) item.needs_update = False update_tree_view(self) dia_tick() break except FtpOverloadedException: post_ga_event('update_item_ftp_overload','artifact_%s' % deltaitem.file) raise except InvalidZipFileException as e: post_ga_event('update_item_invalid_zip','artifact_%s' % deltaitem.file) utils.delete_file(utils.get_storage_location(deltaitem.file)) if retries == nof_retries-1: raise else: log_info('Unpacking %s into %s' % (item.name, dir_name)) try: if was_dia_cancelled(): log_dia_info('Cancelling...') break utils.extract_file(utils.get_storage_location(deltaitem.file), dir_name,item,False) if was_dia_cancelled(): log_dia_info('Cancelling...') update_tree_view(self) break utils.update_db(dir_name, item.name, deltaitem.version) target_folder = dir_name + '/' + item.folder log_dia_info('Updated %s with deltafile %s at location %s' % (item.name,deltaitem.file,target_folder)) item.needs_update = False update_tree_view(self) dia_tick() if utils.get_boolean_user_setting(delete_files_after_install): utils.delete_file(utils.get_storage_location(deltaitem.file)) break except FtpOverloadedException: post_ga_event('update_item_ftp_overload','artifact_%s' % deltaitem.file) raise except InvalidZipFileException: post_ga_event('update_item_invalid_zip','artifact_%s' % deltaitem.file) log_dia_info('Invalid deltazifile, delete and retry') utils.delete_file(utils.get_storage_location(deltaitem.file)) if retries == nof_retries-1: raise retries += 1 if dispose_dia: wx.CallAfter(dispose_dialog) except FtpOverloadedException: if dispose_dia: wx.CallAfter(dispose_dialog_fail,'Too many users right now, please try again later') except InvalidZipFileException as e: if dispose_dia: wx.CallAfter(dispose_dialog_fail,e.message) except: if dispose_dia: wx.CallAfter(dispose_dialog_fail,'Unknown error %s:' % sys.exc_info()[0]) finally: update_tree_view(self)
def install_item(self, current_item, dispose_dia = True): post_ga_event('install_item','artifact_%s' % current_item.name) folder = '%s/%s/' % (dir_name, current_item.folder) if not utils.check_if_already_updated_with_delta(dir_name, current_item.name, current_item.version) or not os.path.exists(folder): try: log_dia_info('Getting full entry %s' % current_item.name) retries = 0 nof_retries = 3 while retries < nof_retries: try: utils.get_file(current_item.basedir,utils.get_storage_location(current_item.file),current_item.file,current_item.name) if os.path.exists(folder): log_dia_info('Deleting current folder %s (this may take a while, please be patient)' % folder) utils.delete_folder('%s/%s/' % (dir_name, current_item.folder)) if was_dia_cancelled(): log_dia_info('Downloaded for %s was cancelled' % current_item.name) if dispose_dia: wx.CallAfter(dispose_dialog) return log_dia_info('Downloaded %s' % current_item.name) log_dia_info('Extracting files %s' %dir_name) dia_tick() utils.extract_file(utils.get_storage_location(current_item.file), dir_name,current_item,True) dia_tick() break; except InvalidZipFileException: post_ga_event('install_item_invalid_zip','artifact_%s' % current_item.name) log_info('Invalid zifile, delete and retry') utils.delete_file(utils.get_storage_location(current_item.file)) if retries == nof_retries-1: raise retries+=1 if utils.get_boolean_user_setting(delete_files_after_install): utils.delete_file(utils.get_storage_location(current_item.file)) if was_dia_cancelled(): if dispose_dia: wx.CallAfter(dispose_dialog) return log_dia_info('Update db') utils.update_db(dir_name, current_item.name, current_item.version) current_item.not_installed = False log_dia_info('Done extracting full entry %s at location %s' % (current_item.name, dir_name)) log_dia_info('Install done') if dispose_dia: wx.CallAfter(dispose_dialog) except InvalidZipFileException as e: utils.delete_folder('%s/%s/' % (dir_name, current_item.folder)) log_dia_info('Install failed du to error during fetch or unzip') if dispose_dia: wx.CallAfter(dispose_dialog_fail,e.message) except FtpOverloadedException as e: log_dia_info('Too many users, please try agin in a while') if dispose_dia: wx.CallAfter(dispose_dialog_fail,'Too many users, please try later') except: utils.delete_folder('%s/%s/' % (dir_name, current_item.folder)) log_dia_info('Install failed due to unknown error') if dispose_dia: wx.CallAfter(dispose_dialog_fail,'Unknown error %s:' % sys.exc_info()[0]) finally: update_tree_view(self) else: if dispose_dia: wx.CallAfter(dispose_dialog)