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)
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)
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()
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)
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()
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()
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')
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))
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
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
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()