Пример #1
0
    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()
Пример #2
0
    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()
Пример #3
0
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
Пример #4
0
 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
Пример #5
0
 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
Пример #6
0
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
Пример #7
0
#
# 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'),
Пример #8
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)