#!/usr/bin/python3

# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Configure Mumble server.
"""

import argparse
import pathlib
import sys
from subprocess import PIPE, Popen

import augeas

CONFIG_FILE = '/etc/mumble-server.ini'
DATA_DIR = '/var/lib/mumble-server'


def parse_arguments():
    """Return parsed command line arguments as dictionary."""

    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(dest='subcommand', help='Sub command')

    subparsers.add_parser('setup', help='Setup Mumble server')
    subparsers.add_parser('create-password',
                          help='Setup mumble superuser password')

    subparsers.add_parser('get-domain', help='Print Mumble domain')
    subparser = subparsers.add_parser('set-domain', help='Setup Mumble domain')
    subparser.add_argument('domain_name', help='Domain name to be allowed')

    subparsers.required = True
    return parser.parse_args()


def subcommand_setup(_):
    """Setup Mumble server."""
    aug = load_augeas()
    aug.set('.anon/sslCert', DATA_DIR + '/fullchain.pem')
    aug.set('.anon/sslKey', DATA_DIR + '/privkey.pem')
    aug.save()


def read_from_stdin():
    """Read password from stdin"""

    return (''.join(sys.stdin)).strip()


def subcommand_create_password(_):
    """Save superuser password with murmurd command"""

    password = read_from_stdin()

    cmd = ['murmurd', '-ini', CONFIG_FILE, '-readsupw']
    proc = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, shell=False)

    # The exit code of the command above seems to be 1 when successful!
    # checking if the 'phrase' is included in the error message which
    # shows that the password is successfully set.
    out, err = proc.communicate(input=password.encode())
    out, err = out.decode(), err.decode()

    phrase = "Superuser password set on server"
    if phrase not in err:
        print("Error occured while saving password: %s" % err)
        sys.exit(1)


def subcommand_get_domain(_):
    """Print the file containing domain name or empty string."""
    domain_file = pathlib.Path('/var/lib/mumble-server/domain-freedombox')
    try:
        print(domain_file.read_text())
    except FileNotFoundError:
        pass


def subcommand_set_domain(arguments):
    """Write a file containing domain name."""
    domain_file = pathlib.Path('/var/lib/mumble-server/domain-freedombox')
    domain_file.write_text(arguments.domain_name)


def load_augeas():
    """Initialize Augeas."""
    aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD +
                        augeas.Augeas.NO_MODL_AUTOLOAD)
    aug.transform('Php', CONFIG_FILE)
    aug.set('/augeas/context', '/files' + CONFIG_FILE)
    aug.load()

    return aug


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