From 49c21cabc8b08850f224c54284981c71a732defc Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Sat, 17 Oct 2020 18:40:16 -0400 Subject: [PATCH] upgrades: Add a setting to enable dist upgrade - Setting is stored in kvstore. - Enable for new installs, and once when upgrading from version without flag. - Split action subcommands for activating backports and for performing dist upgrade. Tests: - Dist upgrade is enabled by default in stable container. - Dist upgrade is disabled by default in testing container. - Enable dist upgrade. Dist upgrade is attempted periodically. - Disable dist upgrade. Dist upgrade is no longer attempted. Signed-off-by: James Valleroy [sunil: kvstore need to be locally imported anymore, import as usual] [sunil: Minor changes to comments for PEP compliance] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- actions/upgrades | 34 ++++++++++++++++-------- plinth/modules/upgrades/__init__.py | 41 ++++++++++++++++++++++++----- plinth/modules/upgrades/forms.py | 5 ++++ plinth/modules/upgrades/views.py | 16 ++++++++++- 4 files changed, 78 insertions(+), 18 deletions(-) diff --git a/actions/upgrades b/actions/upgrades index 36c6cb945..2dd8c84be 100755 --- a/actions/upgrades +++ b/actions/upgrades @@ -92,15 +92,20 @@ def parse_arguments(): subparsers.add_parser('get-log', help='Print the automatic upgrades log') subparsers.add_parser('setup', help='Setup apt preferences') - setup_repositories = subparsers.add_parser( - 'setup-repositories', - help='Setup software repositories for FreedomBox') - setup_repositories.add_argument('--develop', required=False, default=False, + + activate_backports = subparsers.add_parser( + 'activate-backports', help='Activate backports if possible') + activate_backports.add_argument('--develop', required=False, default=False, action='store_true', help='Development mode') - setup_repositories.add_argument( - '--test-upgrade', required=False, default=False, action='store_true', - help='Test dist-upgrade from stable to testing') + + dist_upgrade = subparsers.add_parser( + 'dist-upgrade', help='Perform dist upgrade if possible') + dist_upgrade.add_argument('--develop', required=False, default=False, + action='store_true', help='Development mode') + dist_upgrade.add_argument('--test', required=False, default=False, + action='store_true', + help='Test dist-upgrade from stable to testing') subparsers.required = True return parser.parse_args() @@ -407,17 +412,24 @@ def subcommand_setup(_): _add_apt_preferences() -def subcommand_setup_repositories(arguments): +def subcommand_activate_backports(arguments): """Setup software repositories needed for FreedomBox. Repositories list for now only contains the backports. If the file exists, assume that it contains backports. - Check if a new stable release is available, and perform - dist-upgrade if updates are enabled. """ _check_and_backports_sources(arguments.develop) - _check_and_dist_upgrade(arguments.develop, arguments.test_upgrade) + + +def subcommand_dist_upgrade(arguments): + """Perform major distribution upgrade. + + Check if a new stable release is available, and perform dist-upgrade if + updates are enabled. + + """ + _check_and_dist_upgrade(arguments.develop, arguments.test) def main(): diff --git a/plinth/modules/upgrades/__init__.py b/plinth/modules/upgrades/__init__.py index 88c24b1d3..3312cece2 100644 --- a/plinth/modules/upgrades/__init__.py +++ b/plinth/modules/upgrades/__init__.py @@ -14,11 +14,11 @@ from django.utils.translation import ugettext_noop import plinth from plinth import actions from plinth import app as app_module -from plinth import cfg, glib, menu +from plinth import cfg, glib, kvstore, menu from .manifest import backup # noqa, pylint: disable=unused-import -version = 7 +version = 8 is_essential = True @@ -45,6 +45,8 @@ app = None BACKPORTS_REQUESTED_KEY = 'upgrades_backports_requested' +DIST_UPGRADE_ENABLED_KEY = 'upgrades_dist_upgrade_enabled' + SOURCES_LIST = '/etc/apt/sources.list' BACKPORTS_SOURCES_LIST = '/etc/apt/sources.list.d/freedombox2.list' @@ -128,6 +130,11 @@ def setup(helper, old_version=None): if old_version and old_version < 7: set_backports_requested(can_activate_backports()) + # Enable dist upgrade for new installs, and once when upgrading + # from version without flag. + if not old_version or old_version < 8: + set_dist_upgrade_enabled(can_enable_dist_upgrade()) + # Try to setup apt repositories, if needed, if possible, on first install # and on version increment. helper.call('post', setup_repositories, None) @@ -152,26 +159,42 @@ def disable(): def setup_repositories(data): """Setup apt repositories for backports or new stable release.""" if is_backports_requested(): - command = ['setup-repositories'] + command = ['activate-backports'] if cfg.develop: - command += ['--develop'] + command.append('--develop') + + actions.superuser_run('upgrades', command) + + if is_dist_upgrade_enabled(): + command = ['dist-upgrade'] + if cfg.develop: + command.append('--develop') actions.superuser_run('upgrades', command) def is_backports_requested(): """Return whether user has chosen to activate backports.""" - from plinth import kvstore return kvstore.get_default(BACKPORTS_REQUESTED_KEY, False) def set_backports_requested(requested): """Set whether user has chosen to activate backports.""" - from plinth import kvstore kvstore.set(BACKPORTS_REQUESTED_KEY, requested) logger.info('Backports requested - %s', requested) +def is_dist_upgrade_enabled(): + """Return whether user has enabled dist upgrade.""" + return kvstore.get_default(DIST_UPGRADE_ENABLED_KEY, False) + + +def set_dist_upgrade_enabled(enabled=True): + """Set whether user has enabled dist upgrade.""" + kvstore.set(DIST_UPGRADE_ENABLED_KEY, enabled) + logger.info('Distribution upgrade configured - %s', enabled) + + def is_backports_enabled(): """Return whether backports are enabled in the system configuration.""" return os.path.exists(BACKPORTS_SOURCES_LIST) @@ -208,3 +231,9 @@ def can_activate_backports(): return False return True + + +def can_enable_dist_upgrade(): + """Return whether dist upgrade can be enabled.""" + release, _ = get_current_release() + return release not in ['unstable', 'testing'] diff --git a/plinth/modules/upgrades/forms.py b/plinth/modules/upgrades/forms.py index db4263ef4..3d3fe909a 100644 --- a/plinth/modules/upgrades/forms.py +++ b/plinth/modules/upgrades/forms.py @@ -13,6 +13,11 @@ class ConfigureForm(forms.Form): label=_('Enable auto-update'), required=False, help_text=_( 'When enabled, FreedomBox automatically updates once a day.')) + dist_upgrade_enabled = forms.BooleanField( + label=_('Enable auto-update to next stable release'), required=False, + help_text=_('When enabled, FreedomBox will upgrade to the next stable ' + 'distribution release when it is available.')) + class BackportsFirstbootForm(forms.Form): """Form to configure backports during first boot wizard.""" diff --git a/plinth/modules/upgrades/views.py b/plinth/modules/upgrades/views.py index 93e301266..dfa8d124f 100644 --- a/plinth/modules/upgrades/views.py +++ b/plinth/modules/upgrades/views.py @@ -28,7 +28,10 @@ class UpgradesConfigurationView(AppView): app_id = 'upgrades' def get_initial(self): - return {'auto_upgrades_enabled': upgrades.is_enabled()} + return { + 'auto_upgrades_enabled': upgrades.is_enabled(), + 'dist_upgrade_enabled': upgrades.is_dist_upgrade_enabled() + } def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) @@ -69,6 +72,17 @@ class UpgradesConfigurationView(AppView): messages.success(self.request, _('Automatic upgrades disabled')) + if old_status['dist_upgrade_enabled'] \ + != new_status['dist_upgrade_enabled']: + upgrades.set_dist_upgrade_enabled( + new_status['dist_upgrade_enabled']) + if new_status['dist_upgrade_enabled']: + messages.success(self.request, + _('Distribution upgrade enabled')) + else: + messages.success(self.request, + _('Distribution upgrade disabled')) + return super().form_valid(form)