matrixsynapse: Perform a one time conversion to new config format

- This will allow us to remove the code needed for force upgrading. Upgrade code
can be dropped after a while.

- This will ensure that all our users have a single configuration format which
will make future testing easier.

- We can notify the users of a single overwrite now and be assured that in
future, the overwrites of configuration will not happen.

- We don't have to monitor for changes to configuration files in future version
of the package.

- Keep old configuration as a backup file and restore a pristine copy with
--reinstall and --force-confmiss.

Tests:

- Install the app freshly. Configuration file is unchanged, new config snippets
are created. App is running.

- Install the app with code before new configuration changes. Notice that old
configuration format is used. Then switch the code to a branch with current
changes. Setup is automatically executed. The package is reinstalled. After
re-installation, the main config file is restored. Configuration snippets exist.
value of public registration and domain is preserved. Backup file exists with
previous configuration contents.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Tested-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
Sunil Mohan Adapa 2020-09-09 19:17:14 -07:00 committed by James Valleroy
parent f59fc5e33b
commit 893ecbed1b
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
2 changed files with 31 additions and 20 deletions

View File

@ -5,12 +5,14 @@ Configuration helper for Matrix-Synapse server.
""" """
import argparse import argparse
import pathlib
import yaml import yaml
from plinth import action_utils from plinth import action_utils
from plinth.modules.matrixsynapse import ORIG_CONF_PATH, STATIC_CONF_PATH, \ from plinth.modules.matrixsynapse import (LISTENERS_CONF_PATH, ORIG_CONF_PATH,
LISTENERS_CONF_PATH, REGISTRATION_CONF_PATH REGISTRATION_CONF_PATH,
STATIC_CONF_PATH)
STATIC_CONFIG = { STATIC_CONFIG = {
'max_upload_size': 'max_upload_size':
@ -47,6 +49,10 @@ def parse_arguments():
'--domain-name', '--domain-name',
help='The domain name that will be used by Matrix Synapse') help='The domain name that will be used by Matrix Synapse')
subparsers.add_parser(
'move-old-conf',
help='Move old configuration file to backup before reinstall')
subparsers.required = True subparsers.required = True
return parser.parse_args() return parser.parse_args()
@ -110,6 +116,14 @@ def subcommand_public_registration(argument):
action_utils.service_restart('matrix-synapse') action_utils.service_restart('matrix-synapse')
def subcommand_move_old_conf(_arguments):
"""Move old configuration to backup so it can be restored by reinstall."""
conf_file = pathlib.Path(ORIG_CONF_PATH)
if conf_file.exists():
backup_file = conf_file.with_suffix(conf_file.suffix + '.fbx-bak')
conf_file.replace(backup_file)
def main(): def main():
arguments = parse_arguments() arguments = parse_arguments()
sub_command = arguments.subcommand.replace('-', '_') sub_command = arguments.subcommand.replace('-', '_')

View File

@ -18,11 +18,10 @@ from plinth.daemon import Daemon
from plinth.modules.apache.components import Webserver from plinth.modules.apache.components import Webserver
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.utils import Version
from .manifest import backup, clients # noqa, pylint: disable=unused-import from .manifest import backup, clients # noqa, pylint: disable=unused-import
version = 5 version = 6
managed_services = ['matrix-synapse'] managed_services = ['matrix-synapse']
@ -111,31 +110,29 @@ class MatrixSynapseApp(app_module.App):
def setup(helper, old_version=None): def setup(helper, old_version=None):
"""Install and configure the module.""" """Install and configure the module."""
helper.install(managed_packages) helper.install(managed_packages)
helper.call('post', actions.superuser_run, 'matrixsynapse', if old_version and old_version < 6:
['post-install']) helper.call('post', upgrade, helper)
helper.call('post', app.enable) else:
helper.call('post', actions.superuser_run, 'matrixsynapse',
['post-install'])
if not old_version:
helper.call('post', app.enable)
app.get_component('letsencrypt-matrixsynapse').setup_certificates() app.get_component('letsencrypt-matrixsynapse').setup_certificates()
def force_upgrade(helper, packages): def upgrade(helper):
"""Force upgrade matrix-synapse to resolve conffile prompt.""" """Upgrade matrix-synapse configuration to avoid conffile prompt."""
if 'matrix-synapse' not in packages:
return False
# Allow any lower version to upgrade to 1.15.*
package = packages['matrix-synapse']
if Version(package['new_version']) > Version('1.16~'):
return False
public_registration_status = get_public_registration_status() public_registration_status = get_public_registration_status()
helper.install(['matrix-synapse'], force_configuration='new') actions.superuser_run('matrixsynapse', ['move-old-conf'])
helper.install(['matrix-synapse'], force_configuration='new',
reinstall=True, force_missing_configuration=True)
actions.superuser_run('matrixsynapse', ['post-install']) actions.superuser_run('matrixsynapse', ['post-install'])
if public_registration_status: if public_registration_status:
actions.superuser_run('matrixsynapse', actions.superuser_run('matrixsynapse',
['public-registration', 'enable']) ['public-registration', 'enable'])
return True
def setup_domain(domain_name): def setup_domain(domain_name):
"""Configure a domain name for matrixsynapse.""" """Configure a domain name for matrixsynapse."""