From ca6164910557ad496ddfd7188613b280007d60d1 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Tue, 19 May 2015 20:59:22 -0400 Subject: [PATCH] xmpp: Preseed debconf values before ejabberd and jwchat packages are installed. --- actions/xmpp | 23 +++++++++++++++++++++++ plinth/modules/xmpp/xmpp.py | 11 ++++++++++- plinth/package.py | 23 ++++++++++++++++++----- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/actions/xmpp b/actions/xmpp index 9cf6709c7..d657f5b91 100755 --- a/actions/xmpp +++ b/actions/xmpp @@ -39,6 +39,14 @@ def parse_arguments(): parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest='subcommand', help='Sub command') + # Preseed debconf values before packages are installed. + pre_install = subparsers.add_parser( + 'pre-install', + help='Preseed debconf values before packages are installed.') + pre_install.add_argument( + '--domainname', + help='The domain name that will be used by the XMPP service.') + # Prepare ejabberd for hostname change pre_hostname_change = subparsers.add_parser( 'pre-change-hostname', @@ -80,6 +88,21 @@ def parse_arguments(): return parser.parse_args() +def subcommand_pre_install(arguments): + """Preseed debconf values before packages are installed.""" + domainname = arguments.domainname.strip("'") + if not domainname: + # If new domainname is blank, use hostname instead. + domainname = socket.gethostname() + + subprocess.check_output( + ['debconf-set-selections'], + input=b'ejabberd ejabberd/hostname string ' + domainname.encode()) + subprocess.check_output( + ['debconf-set-selections'], + input=b'jwchat jwchat/ApacheServerName string ' + domainname.encode()) + + def subcommand_pre_change_hostname(arguments): """Prepare ejabberd for hostname change""" old_hostname = arguments.old_hostname diff --git a/plinth/modules/xmpp/xmpp.py b/plinth/modules/xmpp/xmpp.py index 6e4b4d518..9b6e642de 100644 --- a/plinth/modules/xmpp/xmpp.py +++ b/plinth/modules/xmpp/xmpp.py @@ -61,8 +61,17 @@ def init(): domainname_change.connect(on_domainname_change) +def before_install(): + """Preseed debconf values before the packages are installed.""" + fqdn = socket.getfqdn() + domainname = '.'.join(fqdn.split('.')[1:]) + LOGGER.info('XMPP service domainname will be ', domainname) + actions.superuser_run('xmpp', ['pre-install', '--domainname', domainname]) + + @login_required -@package.required(['jwchat', 'ejabberd']) +@package.required(['jwchat', 'ejabberd'], + before_install=before_install) def index(request): """Serve XMPP page""" return TemplateResponse(request, 'xmpp.html', diff --git a/plinth/package.py b/plinth/package.py index 9346a9eff..92c968f29 100644 --- a/plinth/package.py +++ b/plinth/package.py @@ -49,13 +49,14 @@ class PackageException(Exception): class Transaction(object): """Information about an ongoing transaction.""" - def __init__(self, package_names, on_install=None): + def __init__(self, package_names, before_install=None, on_install=None): """Initialize transaction object. Set most values to None until they are sent as progress update. """ self.package_names = package_names # XXX: This is hack, remove after implementing proper setup mechanism. + self.before_install = before_install self.on_install = on_install # Progress @@ -97,6 +98,15 @@ class Transaction(object): def _install(self): """Run a PackageKit transaction to install given packages.""" + try: + if self.before_install: + self.before_install() + except Exception as exception: + logger.exception('Error during setup before install - %s', + exception) + self.finish(exception) + return + try: self._do_install() except PackageException as exception: @@ -209,7 +219,7 @@ class Transaction(object): return self.exception -def required(package_names, on_install=None): +def required(package_names, before_install=None, on_install=None): """Decorate a view to check and install required packages.""" def wrapper2(func): @@ -223,7 +233,8 @@ def required(package_names, on_install=None): view = plinth.views.PackageInstallView.as_view() return view(request, package_names=package_names, - on_install=on_install, *args, **kwargs) + before_install=before_install, on_install=on_install, + *args, **kwargs) return wrapper @@ -290,12 +301,14 @@ def is_installing(package_names): return frozenset(package_names) in transactions -def start_install(package_names, on_install=None): +def start_install(package_names, before_install=None, on_install=None): """Start a PackageKit transaction to install given list of packages. This operation is non-blocking at it spawns a new thread. """ - transaction = Transaction(package_names, on_install=on_install) + transaction = Transaction(package_names, + before_install=before_install, + on_install=on_install) transactions[frozenset(package_names)] = transaction transaction.start_install()