def __init__(self, old_version): self._scenarios = {} if isinstance(old_version, OSVersion): self._old_version = old_version else: self._old_version = OSVersion.from_version_string(old_version) self._mapping()
def check_disk_space(priority): ''' Check for available disk space before updating ''' apt_handle = AptWrapper.get_instance() mb_free = get_free_space() required_space = apt_handle.get_required_upgrade_space() + SPACE_BUFFER # Allowance for installing extra packages in the postupdate scenarios # during the update to 3.8.0 system_version = get_system_version() if system_version < OSVersion.from_version_string("Kanux-Beta-3.8.0"): required_space += UPGRADE_3_8_0_SPACE required_space = max(required_space, MIN_REQ_SPACE) if mb_free < required_space: err_msg = N_("Only {}MB free, at least {}MB is needed.").format( mb_free, required_space) return False, err_msg return True, None
def add_scenario(self, from_version, to_version, func): from_version = OSVersion.from_version_string(from_version) to_version = OSVersion.from_version_string(to_version) self._scenarios[(from_version, to_version)] = func
def do_install(progress, status): status.state = UpdaterStatus.INSTALLING_UPDATES status.save() progress.split( Phase('init', _('Starting Update'), 10, is_main=True), Phase('updating-itself', _('Updating Itself'), 10, is_main=True), Phase('preupdate', _('Running The Preupdate Scripts'), 10, is_main=True), Phase('updating-pip-packages', _('Updating Pip Packages'), 15, is_main=True), Phase('updating-deb-packages', _('Updating Deb Packages'), 15, is_main=True), Phase('postupdate', _('Running The Postupdate Scripts'), 10, is_main=True), Phase('aux-tasks', 'Performing auxiliary tasks', 10, is_main=True)) progress.start('init') apt_handle.clear_cache() apt_handle.fix_broken(progress) # determine the versions (from and to) system_version = OSVersion.from_version_file(SYSTEM_VERSION_FILE) msg = "Upgrading from {} to {}".format(system_version, TARGET_VERSION) logger.info(msg) # set up the scenarios and check whether they cover updating # from this version preup = PreUpdate(system_version) postup = PostUpdate(system_version) if not (preup.covers_update() and postup.covers_update()): title = _('Unfortunately, your version of Kano OS is too old ' 'to be updated through the updater.') description = _('You will need to download the image of the ' 'OS and reflash your SD card.') msg = "{}: {}".format(title, description) logger.error("Updating from a version that is no longer supported" + \ "()".format(system_version)) progress.error(msg) raise InstallError(msg) old_updater = apt_handle.get_package('kano-updater').installed.version progress.start('updating-itself') apt_handle.upgrade('kano-updater', progress) # relaunch if the updater has changed new_updater = apt_handle.get_package('kano-updater') if old_updater != new_updater.installed.version: # Remove the installation in progress status so it doesn't # block the start of the new instance. status.state = UpdaterStatus.UPDATES_DOWNLOADED status.save() logger.info(_('The updater has been updated, relaunching.')) progress.relaunch() return False progress.start('preupdate') try: preup.run() except Exception as e: logger.error('The pre-update scenarios failed.') logger.error(str(e)) progress.abort(_('The pre-update tasks failed.')) raise logger.debug('Updating pip packages') progress.start('updating-pip-packages') install_pip_packages(progress) logger.debug('Updating deb packages') progress.start('updating-deb-packages') install_deb_packages(progress) progress.start('postupdate') try: postup.run() except Exception as e: logger.error('The post-update scenarios failed.') logger.error(str(e)) progress.abort(_('The post-update tasks failed.')) raise bump_system_version() # We don't care too much when these fail progress.start('aux-tasks') run_aux_tasks(progress) status.state = UpdaterStatus.UPDATES_INSTALLED status.last_update = int(time.time()) status.save() progress.finish('Update completed') return True
# # version.py # # Copyright (C) 2018-2019 Kano Computing Ltd. # License: http://www.gnu.org/licenses/gpl-2.0.txt GNU GPL v2 # # Fixtures for acertaining the system version # import pytest from kano_updater.os_version import OSVersion VERSIONS = [ OSVersion(devstage='Beta', version='1.0.3'), OSVersion(devstage='Beta', version='1.1.0'), OSVersion(devstage='Beta', version='1.1.1'), OSVersion(devstage='Beta', version='1.2.0'), OSVersion(devstage='Beta', version='1.2.1'), OSVersion(devstage='Beta', version='1.2.2'), OSVersion(devstage='Beta', version='1.2.3'), OSVersion(devstage='Beta', version='1.2.4'), OSVersion(devstage='Beta', version='1.2.5'), OSVersion(devstage='Beta', version='1.3.1'), OSVersion(devstage='Beta', version='1.3.2'), OSVersion(devstage='Beta', version='1.3.3'), OSVersion(devstage='Beta', version='1.3.4'), OSVersion(devstage='Beta', version='2.0.0'), OSVersion(devstage='Beta', version='2.0.1'), OSVersion(devstage='Beta', version='2.1.0'),
def install_standard(progress, status): progress.split( Phase( 'init', _("Starting Update"), 10, is_main=True ), Phase( 'updating-itself', _("Updating Itself"), 10, is_main=True ), Phase( 'preupdate', _("Running The Preupdate Scripts"), 10, is_main=True ), Phase( 'updating-pip-packages', _("Updating Pip Packages"), 15, is_main=True ), Phase( 'updating-deb-packages', _("Updating Deb Packages"), 15, is_main=True ), Phase( 'postupdate', _("Running The Postupdate Scripts"), 10, is_main=True ), Phase( 'aux-tasks', _("Performing auxiliary tasks"), 10, is_main=True ) ) progress.start('init') apt_handle.clear_cache() apt_handle.fix_broken(progress) # determine the versions (from and to) system_version = OSVersion.from_version_file(SYSTEM_VERSION_FILE) msg = "Upgrading from {} to {}".format(system_version, TARGET_VERSION) logger.info(msg) # set up the scenarios and check whether they cover updating # from this version preup = PreUpdate(system_version) postup = PostUpdate(system_version) if not (preup.covers_update() and postup.covers_update()): title = _("Unfortunately, your version of Kano OS is too old " \ "to be updated through the updater.") description = _("You will need to download the image of the " \ "OS and reflash your SD card.") msg = "{}: {}".format(title, description) logger.error("Updating from a version that is no longer supported ({})" .format(system_version)) progress.fail(msg) raise InstallError(msg) old_updater = apt_handle.get_package('kano-updater').installed.version progress.start('updating-itself') apt_handle.upgrade('kano-updater', progress) # relaunch if the updater has changed new_updater = apt_handle.get_package('kano-updater') if old_updater != new_updater.installed.version: # Remove the installation in progress status so it doesn't # block the start of the new instance. status.state = UpdaterStatus.UPDATES_DOWNLOADED status.save() logger.info("The updater has been updated, relaunching.") progress.relaunch() return False progress.start('preupdate') try: preup.run() except Exception as err: logger.error("The pre-update scenarios failed.") logger.error(err.encode('utf-8')) progress.abort("The pre-update tasks failed.") raise logger.debug("Updating pip packages") progress.start('updating-pip-packages') install_pip_packages(progress) logger.debug("Updating deb packages") progress.start('updating-deb-packages') install_deb_packages(progress) progress.start('postupdate') try: postup.run() except Exception as err: logger.error("The post-update scenarios failed.") logger.error(err.encode('utf-8')) progress.abort("The post-update tasks failed.") raise bump_system_version() # We don't care too much when these fail progress.start('aux-tasks') run_aux_tasks(progress)