Example #1
0
    def cleanup(self):
        log.debug('Beginning removal of old updates')

        filename = get_filename(self.name, self.version, self.platform,
                                self.easy_data)

        cleanup_old_archives(filename, self.update_folder)
Example #2
0
    def cleanup(self):
        log.debug('Beginning removal of old updates')

        filename = get_filename(self.name, self.version,
                                self.platform, self.easy_data)

        remove_previous_versions(self.update_folder, filename)
Example #3
0
    def _patch_update(self, name, version):  # pragma: no cover
        log.info('Starting patch update')
        filename = get_filename(name, version, self.platform, self.easy_data)
        log.debug('Archive filename: %s', filename)
        if filename is None:
            log.warning('Make sure version numbers are correct. '
                        'Possible TRAP!')
            return False
        latest = get_highest_version(name, self.platform, self.channel,
                                     self.easy_data)
        # Just checking to see if the zip for the current version is
        # available to patch If not we'll just do a full binary download
        if not os.path.exists(os.path.join(self.update_folder, filename)):
            log.warning(
                '%s got deleted. No base binary to start patching '
                'form', filename)
            return False

        # Initilize Patch object with all required information
        p = Patcher(name=name,
                    json_data=self.json_data,
                    current_version=version,
                    latest_version=latest,
                    update_folder=self.update_folder,
                    update_urls=self.update_urls,
                    verify=self.verify,
                    progress_hooks=self.progress_hooks)

        # Returns True if everything went well
        # If False is returned then we will just do the full
        # update.
        return p.start()
Example #4
0
    def _remove_old_updates(self):
        try:
            filename = get_filename(self.name, self.version,
                                    self.platform, self.easy_data)
        except KeyError:  # pragma: no cover
            # We will not delete anything if we can't get
            # a filename
            filename = '0.0.0'

        # In case we get None from get_filename()
        if filename is None:
            filename = '0.0.0'
        try:
            current_version = Version(filename)
        except (UtilsError, VersionError):  # pragma: no cover
            log.warning('Cannot parse version info')
            current_version = Version('0.0.0')
        log.debug('Current verion: {}'.format(str(current_version)))
        with jms_utils.paths.ChDir(self.update_folder):
            temp = os.listdir(os.getcwd())
            for t in temp:
                try:
                    old_version = Version(t)
                except UtilsError:  # pragma: no cover
                    log.warning('Cannot parse version info')
                    # Skip file since we can't parse
                    continue
                log.debug('Old version: {}'.format(str(old_version)))
                # Only attempt to remove old files of the one we
                # are updating
                if self.name in t and old_version < current_version:
                    log.info('Removing old update: {}'.format(t))
                    os.remove(t)
Example #5
0
    def _patch_update(self, name, version):  # pragma: no cover
        log.debug('Starting patch update')
        filename = get_filename(name, version, self.platform, self.easy_data)
        log.debug('Archive filename: %s', filename)
        if filename is None:
            log.debug('Make sure version numbers are correct. '
                        'Possible TRAP!')
            return False
        latest = get_highest_version(name, self.platform,
                                     self.channel, self.easy_data)
        # Just checking to see if the zip for the current version is
        # available to patch If not we'll just do a full binary download
        if not os.path.exists(os.path.join(self.update_folder, filename)):
            log.debug('%s got deleted. No base binary to start patching '
                        'form', filename)
            return False

        # Initilize Patch object with all required information
        p = Patcher(name=name, json_data=self.json_data,
                    current_version=version, latest_version=latest,
                    update_folder=self.update_folder,
                    update_urls=self.update_urls, verify=self.verify,
                    progress_hooks=self.progress_hooks)

        # Returns True if everything went well
        # If False is returned then we will just do the full
        # update.
        return p.start()
Example #6
0
    def _remove_old_updates(self):
        try:
            filename = get_filename(self.name, self.version, self.platform,
                                    self.easy_data)
        except KeyError:  # pragma: no cover
            # We will not delete anything if we can't get
            # a filename
            filename = '0.0.0'

        # In case we get None from get_filename()
        if filename is None:
            filename = '0.0.0'
        try:
            current_version = Version(filename)
        except (UtilsError, VersionError):  # pragma: no cover
            log.warning('Cannot parse version info')
            current_version = Version('0.0.0')
        log.debug('Current verion: {}'.format(str(current_version)))
        with jms_utils.paths.ChDir(self.update_folder):
            temp = os.listdir(os.getcwd())
            for t in temp:
                try:
                    old_version = Version(t)
                except UtilsError:  # pragma: no cover
                    log.warning('Cannot parse version info')
                    # Skip file since we can't parse
                    continue
                log.debug('Old version: {}'.format(str(old_version)))
                # Only attempt to remove old files of the one we
                # are updating
                if self.name in t and old_version < current_version:
                    log.info('Removing old update: {}'.format(t))
                    os.remove(t)
Example #7
0
    def cleanup(self):
        log.debug('Beginning removal of old updates')

        filename = get_filename(self.name, self.version,
                                self.platform, self.easy_data)

        cleanup_old_archives(filename, self.update_folder)
Example #8
0
    def __init__(self, data):
        self.updates_key = settings.UPDATES_KEY
        self.update_urls = data.get('update_urls')
        self.name = data.get('name')
        self.current_version = data.get('version')
        self.easy_data = data.get('easy_data')
        # Raw form of easy_data
        self.json_data = data.get('json_data')
        self.data_dir = data.get('data_dir')
        self.platform = data.get('platform')
        self.app_name = data.get('app_name')
        self.channel = data.get('channel', 'stable')
        self.progress_hooks = data.get('progress_hooks')
        self.update_folder = os.path.join(self.data_dir,
                                          settings.UPDATE_FOLDER)
        self.verify = data.get('verify', True)
        self.current_app_dir = os.path.dirname(sys.executable)
        self.status = False
        # If user is using async download this will be True.
        # Future calls to an download methods will not run
        # until the current download is complete. Which will
        # set this back to False.
        self._is_downloading = False

        # Used to generate file name of archive
        self.latest = get_highest_version(self.name, self.platform,
                                          self.channel, self.easy_data)

        self.current_archive_filename = get_filename(self.name,
                                                     self.current_version,
                                                     self.platform,
                                                     self.easy_data)

        # Get full filename of latest update archive
        self.filename = get_filename(self.name, self.latest,
                                     self.platform, self.easy_data)
        assert self.filename is not None

        # Removes old versions, of this asset, from
        # the updates folder.
        self.cleanup()
Example #9
0
    def _extract_update(self):
        with jms_utils.paths.ChDir(self.update_folder):
            platform_name = self.name
            # Ensuring we only add .exe when applicable
            if sys.platform == 'win32' and \
                    self.name == self.app_name:  # pragma: no cover
                # We only add .exe to app executable.  Not libs or dll
                log.debug('Adding .exe to filename for windows main '
                          'app udpate.')
                platform_name += '.exe'

            # Ensuring we extract the latest version
            latest = get_highest_version(self.name, self.platform,
                                         self.easy_data)
            # Get full filename of latest update archive
            filename = get_filename(self.name, latest, self.platform,
                                    self.easy_data)
            if not os.path.exists(filename):
                log.error('File does not exists')
                raise ClientError('File does not exists')

            log.info('Extracting Update')
            archive_ext = os.path.splitext(filename)[1].lower()
            # Handles extracting gzip or zip archives
            if archive_ext == '.gz':
                try:
                    with tarfile.open(filename, 'r:gz') as tfile:
                        # Extract file update to current
                        # directory.
                        tfile.extractall()
                except Exception as err:  # pragma: no cover
                    log.error(err)
                    log.debug(str(err), exc_info=True)
                    raise ClientError('Error reading gzip file')
            elif archive_ext == '.zip':
                try:
                    with zipfile.ZipFile(filename, 'r') as zfile:
                        # Extract update file to current
                        # directory.
                        zfile.extractall()
                except Exception as err:  # pragma: no cover
                    log.error(str(err))
                    log.debug(str(err), exc_info=True)
                    raise ClientError('Error reading zip file')
            else:
                raise ClientError('Unknown filetype')
Example #10
0
    def _extract_update(self):
        with jms_utils.paths.ChDir(self.update_folder):
            platform_name = self.name
            # Ensuring we only add .exe when applicable
            if sys.platform == 'win32' and \
                    self.name == self.app_name:  # pragma: no cover
                # We only add .exe to app executable.  Not libs or dll
                log.debug('Adding .exe to filename for windows main '
                          'app udpate.')
                platform_name += '.exe'

            # Ensuring we extract the latest version
            latest = get_highest_version(self.name, self.platform,
                                         self.easy_data)
            # Get full filename of latest update archive
            filename = get_filename(self.name, latest, self.platform,
                                    self.easy_data)
            if not os.path.exists(filename):
                log.error('File does not exists')
                raise ClientError('File does not exists')

            log.info('Extracting Update')
            archive_ext = os.path.splitext(filename)[1].lower()
            # Handles extracting gzip or zip archives
            if archive_ext == '.gz':
                try:
                    with tarfile.open(filename, 'r:gz') as tfile:
                        # Extract file update to current
                        # directory.
                        tfile.extractall()
                except Exception as err:  # pragma: no cover
                    log.error(err)
                    log.debug(str(err), exc_info=True)
                    raise ClientError('Error reading gzip file')
            elif archive_ext == '.zip':
                try:
                    with zipfile.ZipFile(filename, 'r') as zfile:
                        # Extract update file to current
                        # directory.
                        zfile.extractall()
                except Exception as err:  # pragma: no cover
                    log.error(str(err))
                    log.debug(str(err), exc_info=True)
                    raise ClientError('Error reading zip file')
            else:
                raise ClientError('Unknown filetype')
Example #11
0
    def _remove_old_updates(self):
        log.debug('Beginning removal of old updates')

        filename = get_filename(self.name, self.version,
                                self.platform, self.easy_data)

        # In case we get None from get_filename()
        if filename is None:
            filename = '0.0.0'
        try:
            current_version = Version(filename)
        except (UtilsError, VersionError):  # pragma: no cover
            log.warning('Cannot parse version info')
            current_version = Version('0.0.0')

        log.debug('Current verion: {}'.format(str(current_version)))
        with jms_utils.paths.ChDir(self.update_folder):
            temp = os.listdir(os.getcwd())
            for t in temp:
                log.debug('Checking: {}'.format(t))
                # Only attempt to remove old files of the one we
                # are updating
                if self.name not in t:
                    log.debug('File does not match name of current binary')
                    continue
                else:
                    log.debug('Found possible match')
                    log.debug('Update name: {}'.format(self.name))
                    log.debug('Archive name: {}'.format(t))

                try:
                    old_version = Version(t)
                except (UtilsError, VersionError):  # pragma: no cover
                    log.warning('Cannot parse version info')
                    # Skip file since we can't parse
                    continue
                log.debug('Found version: {}'.format(str(old_version)))

                if old_version < current_version:
                    log.info('Removing old update: {}'.format(t))
                    os.remove(t)
                else:
                    log.debug('Old version: {}'.format(old_version))
                    log.debug('Current version: '
                              '{}'.format(current_version))
Example #12
0
    def _full_update(self, name):
        log.info('Starting full update')
        latest = get_highest_version(name, self.platform, self.easy_data)

        filename = get_filename(name, latest, self.platform, self.easy_data)

        hash_key = '{}*{}*{}*{}*{}'.format(self.updates_key, name, latest,
                                           self.platform, 'file_hash')
        file_hash = self.easy_data.get(hash_key)

        with jms_utils.paths.ChDir(self.update_folder):
            log.info('Downloading update...')
            fd = FileDownloader(filename, self.update_urls, file_hash,
                                self.verify, self.progress_hooks)
            result = fd.download_verify_write()
            if result:
                log.info('Download Complete')
                return True
            else:  # pragma: no cover
                log.error('Failed To Download Latest Version')
                return False
Example #13
0
    def _full_update(self, name):
        log.info('Starting full update')
        latest = get_highest_version(name, self.platform, self.easy_data)

        filename = get_filename(name, latest, self.platform, self.easy_data)

        hash_key = '{}*{}*{}*{}*{}'.format(self.updates_key, name,
                                           latest, self.platform,
                                           'file_hash')
        file_hash = self.easy_data.get(hash_key)

        with jms_utils.paths.ChDir(self.update_folder):
            log.info('Downloading update...')
            fd = FileDownloader(filename, self.update_urls,
                                file_hash, self.verify, self.progress_hooks)
            result = fd.download_verify_write()
            if result:
                log.info('Download Complete')
                return True
            else:  # pragma: no cover
                log.error('Failed To Download Latest Version')
                return False
Example #14
0
    def _is_downloaded(self, name):
        latest = get_highest_version(name, self.platform, self.easy_data)

        filename = get_filename(name, latest, self.platform, self.easy_data)

        hash_key = '{}*{}*{}*{}*{}'.format(self.updates_key, name, latest,
                                           self.platform, 'file_hash')
        _hash = self.easy_data.get(hash_key)
        # Comparing file hashes to ensure security
        with jms_utils.paths.ChDir(self.update_folder):
            if not os.path.exists(filename):
                return False
            try:
                with open(filename, 'rb') as f:
                    data = f.read()
            except Exception as err:
                log.debug(err, exc_info=True)
                return False
            if _hash == get_hash(data):
                return True
            else:
                return False
Example #15
0
    def _is_downloaded(self, name):
        latest = get_highest_version(name, self.platform, self.easy_data)

        filename = get_filename(name, latest, self.platform, self.easy_data)

        hash_key = '{}*{}*{}*{}*{}'.format(self.updates_key, name,
                                           latest, self.platform,
                                           'file_hash')
        _hash = self.easy_data.get(hash_key)
        # Comparing file hashes to ensure security
        with jms_utils.paths.ChDir(self.update_folder):
            if not os.path.exists(filename):
                return False
            try:
                with open(filename, 'rb') as f:
                    data = f.read()
            except Exception as err:
                log.debug(err, exc_info=True)
                return False
            if _hash == get_hash(data):
                return True
            else:
                return False
Example #16
0
    def __init__(self, data):
        self.updates_key = settings.UPDATES_KEY
        self.update_urls = data.get('update_urls')
        self.name = data.get('name')
        self.version = data.get('version')
        self.easy_data = data.get('easy_data')
        # Raw form of easy_data
        self.json_data = data.get('json_data')
        self.data_dir = data.get('data_dir')
        self.platform = data.get('platform')
        self.app_name = data.get('app_name')
        self.channel = data.get('channel', 'stable')
        self.progress_hooks = data.get('progress_hooks')
        self.update_folder = os.path.join(self.data_dir,
                                          settings.UPDATE_FOLDER)
        self.verify = data.get('verify', True)
        self.current_app_dir = os.path.dirname(sys.executable)
        self.status = False
        # If user is using async download this will be True.
        # Future calls to an download methods will not run
        # until the current download is complete. Which will
        # set this back to False.
        self._is_downloading = False

        # Used to generate file name of archive
        latest = get_highest_version(self.name, self.platform, self.channel,
                                     self.easy_data)
        # Get full filename of latest update archive
        self.filename = get_filename(self.name, latest, self.platform,
                                     self.easy_data)
        assert self.filename is not None
        self.abspath = os.path.join(self.update_folder, self.filename)
        # Removes old versions, of update being checked, from
        # updates folder.  Since we only start patching from
        # the current binary this shouldn't be a problem.
        self.cleanup()