xmpp: Preseed debconf values before ejabberd and jwchat packages are installed.

This commit is contained in:
James Valleroy 2015-05-19 20:59:22 -04:00 committed by Sunil Mohan Adapa
parent 6a8fa93477
commit ca61649105
3 changed files with 51 additions and 6 deletions

View File

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

View File

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

View File

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