diff --git a/actions/xmpp b/actions/xmpp index 1a5a5783a..9de08ad1f 100755 --- a/actions/xmpp +++ b/actions/xmpp @@ -23,6 +23,13 @@ Configuration helper for the ejabberd service import argparse import subprocess +import re +import time +import os + +JWCHAT_CONFIG = '/etc/jwchat/config.js' +EJABBERD_CONFIG = '/etc/ejabberd/ejabberd.yml' +EJABBERD_BACKUP = '/tmp/ejabberd.dump' def parse_arguments(): @@ -34,6 +41,15 @@ def parse_arguments(): subparsers.add_parser('get-installed', help='Get whether ejabberd is installed') + # Update ejabberd and jwchat with new hostname + hostname_change = subparsers.add_parser( + 'change-hostname', + help='Update ejabberd and jwchat with new hostname') + hostname_change.add_argument('--old-hostname', + help='Previous hostname') + hostname_change.add_argument('--new-hostname', + help='New hostname') + # Register a new user account register = subparsers.add_parser('register', help='Register a new user account') @@ -50,6 +66,42 @@ def subcommand_get_installed(_): print('installed' if get_installed() else 'not installed') +def subcommand_change_hostname(arguments): + """Update ejabberd and jwchat with new hostname""" + if not get_installed(): + print('Failed to update XMPP hostname: ejabberd is not installed.') + + old_hostname = arguments.old_hostname + new_hostname = arguments.new_hostname + + with open(JWCHAT_CONFIG, 'r') as conffile: + lines = conffile.readlines() + with open(JWCHAT_CONFIG, 'w') as conffile: + for line in lines: + conffile.write(re.sub('var SITENAME = "' + old_hostname + '";', + 'var SITENAME = "' + new_hostname + '";', + line)) + + with open(EJABBERD_CONFIG, 'r') as conffile: + lines = conffile.readlines() + with open(EJABBERD_CONFIG, 'w') as conffile: + for line in lines: + conffile.write(re.sub(old_hostname, new_hostname, line)) + + with open(EJABBERD_BACKUP, 'r') as dumpfile: + lines = dumpfile.readlines() + with open(EJABBERD_BACKUP, 'w') as dumpfile: + for line in lines: + dumpfile.write(re.sub(old_hostname, new_hostname, line)) + + subprocess.call(['service', 'ejabberd', 'restart']) + + # load backup database + time.sleep(10) + subprocess.call(['ejabberdctl', 'load', EJABBERD_BACKUP]) + os.remove(EJABBERD_BACKUP) + + def subcommand_register(arguments): """Register a new user account""" if not get_installed(): diff --git a/actions/xmpp-hostname-change b/actions/xmpp-hostname-change deleted file mode 100755 index 8bde7c9ce..000000000 --- a/actions/xmpp-hostname-change +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -# -# This file is part of Plinth. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# - -# Action to set up new hostname for ejabberd and jwchat. - -hostname="$1" -old_hostname=`debconf-show ejabberd | awk '/hostname/ { print $3 }'` - -# Based on http://www.process-one.net/docs/ejabberd/guide_en.html#htoc77 - -BACKUP=/tmp/ejabberd.dump - -sed -i "s/var SITENAME = \"$old_hostname\";/var SITENAME = \"$hostname\";/" /etc/jwchat/config.js -sed -i "s/$old_hostname/$hostname/g" /etc/ejabberd/ejabberd.yml -sed -i "s/$old_hostname/$hostname/g" $BACKUP - -service ejabberd restart - -# Load backup database -sleep 10 -ejabberdctl load $BACKUP -rm $BACKUP diff --git a/plinth/modules/config/config.py b/plinth/modules/config/config.py index ec55909b1..4d6398389 100644 --- a/plinth/modules/config/config.py +++ b/plinth/modules/config/config.py @@ -154,6 +154,8 @@ def _apply_changes(request, old_status, new_status): def set_hostname(hostname): """Sets machine hostname to hostname""" + old_hostname = get_hostname() + # Hostname should be ASCII. If it's unicode but passed our # valid_hostname check, convert to ASCII. hostname = str(hostname) @@ -161,4 +163,6 @@ def set_hostname(hostname): LOGGER.info('Changing hostname to - %s', hostname) actions.superuser_run('xmpp-pre-hostname-change') actions.superuser_run('hostname-change', hostname) - actions.superuser_run('xmpp-hostname-change', hostname, async=True) + actions.superuser_run('xmpp', 'change-hostname', + '--old-hostname', old_hostname, + '--new-hostname', hostname, async=True)