*: Make force upgrading part of app rather than a module

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
Sunil Mohan Adapa 2022-07-25 14:12:17 -07:00 committed by James Valleroy
parent f6ef0135d2
commit bb2cbace6c
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
8 changed files with 102 additions and 100 deletions

View File

@ -16,7 +16,7 @@ from plinth import cfg, menu
from plinth.daemon import Daemon from plinth.daemon import Daemon
from plinth.modules.backups.components import BackupRestore from plinth.modules.backups.components import BackupRestore
from plinth.modules.firewall.components import Firewall from plinth.modules.firewall.components import Firewall
from plinth.package import Packages from plinth.package import Packages, install
from plinth.utils import format_lazy from plinth.utils import format_lazy
from . import manifest from . import manifest
@ -107,11 +107,10 @@ class BindApp(app_module.App):
str(old_version)]) str(old_version)])
self.enable() self.enable()
def force_upgrade(self, _packages):
def force_upgrade(helper, _packages): """Force upgrade the managed packages to resolve conffile prompt."""
"""Force upgrade the managed packages to resolve conffile prompt.""" install(['bind9'], force_configuration='old')
helper.install(['bind9'], force_configuration='old') return True
return True
def get_config(): def get_config():

View File

@ -13,7 +13,7 @@ from plinth import app as app_module
from plinth import cfg, menu from plinth import cfg, menu
from plinth.daemon import Daemon from plinth.daemon import Daemon
from plinth.modules.backups.components import BackupRestore from plinth.modules.backups.components import BackupRestore
from plinth.package import Packages from plinth.package import Packages, install
from plinth.utils import Version, format_lazy, import_from_gi from plinth.utils import Version, format_lazy, import_from_gi
from . import manifest from . import manifest
@ -83,6 +83,22 @@ class FirewallApp(app_module.App):
super().setup(old_version) super().setup(old_version)
_run_setup() _run_setup()
def force_upgrade(self, packages):
"""Force upgrade firewalld to resolve conffile prompts."""
if 'firewalld' not in packages:
return False
# firewalld 0.6.x -> 0.7.x, 0.6.x -> 0.8.x, 0.7.x -> 0.8.x, 0.9.x ->
# 1.0.x
package = packages['firewalld']
if Version(package['current_version']) >= Version('1.0') or \
Version(package['new_version']) < Version('0.7'):
return False
install(['firewalld'], force_configuration='new')
_run_setup()
return True
def _run_setup(): def _run_setup():
"""Run firewalld setup.""" """Run firewalld setup."""
@ -95,22 +111,6 @@ def _run_setup():
add_service('dhcp', 'internal') add_service('dhcp', 'internal')
def force_upgrade(helper, packages):
"""Force upgrade firewalld to resolve conffile prompts."""
if 'firewalld' not in packages:
return False
# firewalld 0.6.x -> 0.7.x, 0.6.x -> 0.8.x, 0.7.x -> 0.8.x, 0.9.x -> 1.0.x
package = packages['firewalld']
if Version(package['current_version']) >= Version('1.0') or \
Version(package['new_version']) < Version('0.7'):
return False
helper.install(['firewalld'], force_configuration='new')
_run_setup()
return True
def _get_dbus_proxy(object, interface): def _get_dbus_proxy(object, interface):
"""Return a DBusProxy for a given firewalld object and interface.""" """Return a DBusProxy for a given firewalld object and interface."""
connection = gio.bus_get_sync(gio.BusType.SYSTEM) connection = gio.bus_get_sync(gio.BusType.SYSTEM)

View File

@ -11,7 +11,7 @@ from plinth.modules.apache.components import Webserver
from plinth.modules.backups.components import BackupRestore from plinth.modules.backups.components import BackupRestore
from plinth.modules.firewall.components import Firewall from plinth.modules.firewall.components import Firewall
from plinth.modules.users.components import UsersAndGroups from plinth.modules.users.components import UsersAndGroups
from plinth.package import Packages from plinth.package import Packages, install
from plinth.utils import Version from plinth.utils import Version
from . import manifest from . import manifest
@ -97,6 +97,22 @@ class MiniDLNAApp(app_module.App):
if not old_version: if not old_version:
self.enable() self.enable()
def force_upgrade(self, packages):
"""Force upgrade minidlna to resolve conffile prompt."""
if 'minidlna' not in packages:
return False
# Allow upgrade from 1.2.1+dfsg-1+b1 to 1.3.x
package = packages['minidlna']
if Version(package['new_version']) > Version('1.4~'):
return False
media_dir = get_media_dir()
install(['minidlna'], force_configuration='new')
set_media_dir(media_dir)
return True
def get_media_dir(): def get_media_dir():
"""Return the currently set media directory.""" """Return the currently set media directory."""
@ -106,20 +122,3 @@ def get_media_dir():
def set_media_dir(media_dir): def set_media_dir(media_dir):
"""Set the media directory from which files will be scanned for sharing.""" """Set the media directory from which files will be scanned for sharing."""
actions.superuser_run('minidlna', ['set-media-dir', '--dir', media_dir]) actions.superuser_run('minidlna', ['set-media-dir', '--dir', media_dir])
def force_upgrade(helper, packages):
"""Force upgrade minidlna to resolve conffile prompt."""
if 'minidlna' not in packages:
return False
# Allow upgrade from 1.2.1+dfsg-1+b1 to 1.3.x
package = packages['minidlna']
if Version(package['new_version']) > Version('1.4~'):
return False
media_dir = get_media_dir()
helper.install(['minidlna'], force_configuration='new')
set_media_dir(media_dir)
return True

View File

@ -16,7 +16,7 @@ from plinth.modules.backups.components import BackupRestore
from plinth.modules.firewall.components import Firewall from plinth.modules.firewall.components import Firewall
from plinth.modules.letsencrypt.components import LetsEncrypt from plinth.modules.letsencrypt.components import LetsEncrypt
from plinth.modules.users.components import UsersAndGroups from plinth.modules.users.components import UsersAndGroups
from plinth.package import Packages from plinth.package import Packages, install
from plinth.utils import Version from plinth.utils import Version
from . import manifest, privileged from . import manifest, privileged
@ -102,20 +102,19 @@ class MumbleApp(app_module.App):
app.get_component('letsencrypt-mumble').setup_certificates() app.get_component('letsencrypt-mumble').setup_certificates()
def force_upgrade(self, packages):
"""Force upgrade mumble-server to resolve conffile prompts."""
if 'mumble-server' not in packages:
return False
def force_upgrade(helper, packages): # Allow upgrades within 1.3.*
"""Force upgrade mumble-server to resolve conffile prompts.""" package = packages['mumble-server']
if 'mumble-server' not in packages: if Version(package['new_version']) > Version('1.4~'):
return False return False
# Allow upgrades within 1.3.* install(['mumble-server'], force_configuration='new')
package = packages['mumble-server'] privileged.setup()
if Version(package['new_version']) > Version('1.4~'): return True
return False
helper.install(['mumble-server'], force_configuration='new')
privileged.setup()
return True
def get_available_domains(): def get_available_domains():

View File

@ -15,7 +15,7 @@ from plinth.modules.apache.components import Uwsgi, Webserver
from plinth.modules.backups.components import BackupRestore from plinth.modules.backups.components import BackupRestore
from plinth.modules.firewall.components import Firewall from plinth.modules.firewall.components import Firewall
from plinth.modules.users.components import UsersAndGroups from plinth.modules.users.components import UsersAndGroups
from plinth.package import Packages from plinth.package import Packages, install
from plinth.utils import Version, format_lazy from plinth.utils import Version, format_lazy
from . import manifest from . import manifest
@ -103,22 +103,22 @@ class RadicaleApp(app_module.App):
super().setup(old_version) super().setup(old_version)
self.enable() self.enable()
def force_upgrade(self, packages):
"""Force upgrade radicale to resolve conffile prompt."""
if 'radicale' not in packages:
return False
def force_upgrade(helper, packages): # Allow upgrade from 2.* to newer 2.* and 3.*
"""Force upgrade radicale to resolve conffile prompt.""" package = packages['radicale']
if 'radicale' not in packages: if Version(package['new_version']) > Version('4~'):
return False return False
# Allow upgrade from 2.* to newer 2.* and 3.* rights = get_rights_value()
package = packages['radicale'] install(['radicale'], force_configuration='new')
if Version(package['new_version']) > Version('4~'): actions.superuser_run('radicale',
return False ['configure', '--rights_type', rights])
rights = get_rights_value() return True
helper.install(['radicale'], force_configuration='new')
actions.superuser_run('radicale', ['configure', '--rights_type', rights])
return True
def load_augeas(): def load_augeas():

View File

@ -10,7 +10,7 @@ from plinth import frontpage, menu
from plinth.modules.apache.components import Webserver from plinth.modules.apache.components import Webserver
from plinth.modules.backups.components import BackupRestore from plinth.modules.backups.components import BackupRestore
from plinth.modules.firewall.components import Firewall from plinth.modules.firewall.components import Firewall
from plinth.package import Packages from plinth.package import Packages, install
from . import manifest, privileged from . import manifest, privileged
@ -97,16 +97,15 @@ class RoundcubeApp(app_module.App):
privileged.set_config(local_only=True) privileged.set_config(local_only=True)
self.enable() self.enable()
def force_upgrade(self, packages):
"""Force upgrade package to resolve conffile prompts."""
if 'roundcube-core' not in packages:
return False
def force_upgrade(helper, packages): # Allow roundcube any version to upgrade to any version. This is okay
"""Force upgrade package to resolve conffile prompts.""" # because there will no longer be conflicting file changes.
if 'roundcube-core' not in packages: install(['roundcube-core'], force_configuration='new')
return False if self.get_component('webserver-roundcube').is_enabled():
self.get_component('webserver-roundcube-freedombox').enable()
# Allow roundcube any version to upgrade to any version. This is okay return True
# because there will no longer be conflicting file changes.
helper.install(['roundcube-core'], force_configuration='new')
if app.get_component('webserver-roundcube').is_enabled():
app.get_component('webserver-roundcube-freedombox').enable()
return True

View File

@ -14,7 +14,7 @@ from plinth.modules.apache.components import Webserver
from plinth.modules.backups.components import BackupRestore from plinth.modules.backups.components import BackupRestore
from plinth.modules.firewall.components import Firewall from plinth.modules.firewall.components import Firewall
from plinth.modules.users.components import UsersAndGroups from plinth.modules.users.components import UsersAndGroups
from plinth.package import Packages from plinth.package import Packages, install
from plinth.utils import Version, format_lazy from plinth.utils import Version, format_lazy
from . import manifest from . import manifest
@ -114,6 +114,20 @@ class TTRSSApp(app_module.App):
actions.superuser_run('ttrss', ['setup']) actions.superuser_run('ttrss', ['setup'])
self.enable() self.enable()
def force_upgrade(self, packages):
"""Force update package to resolve conffile prompts."""
if 'tt-rss' not in packages:
return False
# Allow tt-rss any lower version to upgrade to 21.*
package = packages['tt-rss']
if Version(package['new_version']) > Version('22~'):
return False
install(['tt-rss'], force_configuration='new')
actions.superuser_run('ttrss', ['setup'])
return True
class TTRSSBackupRestore(BackupRestore): class TTRSSBackupRestore(BackupRestore):
"""Component to backup/restore TT-RSS""" """Component to backup/restore TT-RSS"""
@ -129,21 +143,6 @@ class TTRSSBackupRestore(BackupRestore):
actions.superuser_run('ttrss', ['restore-database']) actions.superuser_run('ttrss', ['restore-database'])
def force_upgrade(helper, packages):
"""Force update package to resolve conffile prompts."""
if 'tt-rss' not in packages:
return False
# Allow tt-rss any lower version to upgrade to 21.*
package = packages['tt-rss']
if Version(package['new_version']) > Version('22~'):
return False
helper.install(['tt-rss'], force_configuration='new')
actions.superuser_run('ttrss', ['setup'])
return True
def get_domain(): def get_domain():
"""Read TLS domain from tt-rss config file.""" """Read TLS domain from tt-rss config file."""
return actions.superuser_run('ttrss', ['get-domain']).strip() return actions.superuser_run('ttrss', ['get-domain']).strip()

View File

@ -428,10 +428,9 @@ class ForceUpgrader():
need_retry = False need_retry = False
for app_id, packages in apps.items(): for app_id, packages in apps.items():
app = app_module.App.get(app_id) app = app_module.App.get(app_id)
module = sys.modules[app.__module__]
try: try:
logger.info('Force upgrading app: %s', app.info.name) logger.info('Force upgrading app: %s', app.info.name)
if module.force_upgrade(module.setup_helper, packages): if self._run_force_upgrade_as_operation(app, packages):
logger.info('Successfully force upgraded app: %s', logger.info('Successfully force upgraded app: %s',
app.info.name) app.info.name)
else: else:
@ -445,6 +444,15 @@ class ForceUpgrader():
if need_retry: if need_retry:
raise self.TemporaryFailure('Some apps failed to force upgrade.') raise self.TemporaryFailure('Some apps failed to force upgrade.')
def _run_force_upgrade_as_operation(self, app, packages):
"""Start an operation for force upgrading."""
name = gettext_noop('Updating app packages')
operation = operation_module.manager.new(app.app_id, name,
app.force_upgrade, [packages],
show_message=False,
show_notification=False)
return operation.join() # Wait for completion, raise Exception
def _get_list_of_apps_to_force_upgrade(self): def _get_list_of_apps_to_force_upgrade(self):
"""Return a list of app on which to run force upgrade.""" """Return a list of app on which to run force upgrade."""
packages = self._get_list_of_upgradable_packages() packages = self._get_list_of_upgradable_packages()
@ -489,8 +497,7 @@ class ForceUpgrader():
package_apps_map = defaultdict(set) package_apps_map = defaultdict(set)
upgradable_packages = set() upgradable_packages = set()
for app in app_module.App.list(): for app in app_module.App.list():
module = sys.modules[app.__module__] if not getattr(app, 'force_upgrade', None):
if not getattr(module, 'force_upgrade', None):
# App does not implement force upgrade # App does not implement force upgrade
continue continue