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 <jvalleroy@mailbox.org>
[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 <sunil@medhas.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
This commit is contained in:
James Valleroy 2020-10-17 18:40:16 -04:00 committed by Sunil Mohan Adapa
parent 6180e3a051
commit 49c21cabc8
No known key found for this signature in database
GPG Key ID: 43EA1CFF0AA7C5F2
4 changed files with 78 additions and 18 deletions

View File

@ -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():

View File

@ -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']

View File

@ -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."""

View File

@ -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)