示例#1
0
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)
示例#2
0
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')
示例#3
0
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)
示例#4
0
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)