James Valleroy 10b234921b Track which section of ejabberd config we are in, and only edit the hosts section.
Check for jwchat config and ejabberd dumpfile before trying to modify them.
2015-01-03 14:43:50 +05:30

158 lines
5.2 KiB
Python
Executable File

#!/usr/bin/python3
# -*- mode: python -*-
#
# 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 <http://www.gnu.org/licenses/>.
#
"""
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():
"""Return parsed command line arguments as dictionary"""
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='subcommand', help='Sub command')
# Get whether ejabberd is installed
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')
register.add_argument('--username',
help='Username for the new user account')
register.add_argument('--password',
help='Password for the new user account')
return parser.parse_args()
def subcommand_get_installed(_):
"""Get whether ejabberd is 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():
return
old_hostname = arguments.old_hostname
new_hostname = arguments.new_hostname
# update jwchat's sitename, if it's installed
if os.path.exists(JWCHAT_CONFIG):
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))
# update ejabberd hosts
with open(EJABBERD_CONFIG, 'r') as conffile:
lines = conffile.readlines()
with open(EJABBERD_CONFIG, 'w') as conffile:
in_hosts_section = False
for line in lines:
if in_hosts_section:
if line.startswith(' - "'):
conffile.write(re.sub(old_hostname, new_hostname, line))
else:
in_hosts_section = False
conffile.write(line)
else:
if line.startswith('hosts:'):
in_hosts_section = True
conffile.write(line)
# update ejabberd backup database
if os.path.exists(EJABBERD_BACKUP):
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
if os.path.exists(EJABBERD_BACKUP):
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():
print('Failed to register XMPP account: ejabberd is not installed.')
return
username = arguments.username
password = arguments.password
hostname = subprocess.check_output(['hostname'])
try:
output = subprocess.check_output(['ejabberdctl', 'register',
username, hostname, password])
print(output.decode())
except subprocess.CalledProcessError as e:
print('Failed to register XMPP account:', e.output.decode())
def get_installed():
"""Check if ejabberd is installed"""
with open('/dev/null', 'w') as file_handle:
status = subprocess.call(['which', 'ejabberdctl'], stdout=file_handle)
return not status
def main():
"""Parse arguments and perform all duties"""
arguments = parse_arguments()
subcommand = arguments.subcommand.replace('-', '_')
subcommand_method = globals()['subcommand_' + subcommand]
subcommand_method(arguments)
if __name__ == '__main__':
main()