#! /bin/sh
# postinst script for ejabberd
#
# see: dh_installdeb(1)

set -e

CONFIG_SOURCE=/usr/share/ejabberd/ejabberd.yml.example
CONFIG_TARGET=/etc/ejabberd/ejabberd.yml
TEMPFILE=$(mktemp)

. /usr/share/debconf/confmodule

setup_ejabberd()
{
    # Ejabberd config dir may contain sensitive data, so making it unreadable by
    # the world.
    if ! dpkg-statoverride --list /etc/ejabberd >/dev/null; then
	chown root:ejabberd /etc/ejabberd
    fi

    # The users database dir /var/lib/ejabberd must be writable by user ejabberd.
    install -d /var/lib/ejabberd
    if ! dpkg-statoverride --list /var/lib/ejabberd >/dev/null; then
	chown -R ejabberd:ejabberd /var/lib/ejabberd
	chmod 700 /var/lib/ejabberd
    fi

    # Ejabberd logs should be readable by users in adm group (see also logrotate script).
    install -d /var/log/ejabberd
    if ! dpkg-statoverride --list /var/log/ejabberd >/dev/null; then
	chown ejabberd:adm /var/log/ejabberd
	chmod 2750 /var/log/ejabberd
	if dpkg --compare-versions "$2" lt '2.1.4'; then
	    find /var/log/ejabberd -type f -name '*.log*' -exec chown ejabberd:adm {} \+ -exec chmod 0640 {} \+
	fi
    fi

    # Chown the cert so ejabberd user can use it but not be accessible by the
    # world.
    ( if [ -f /etc/ejabberd/ejabberd.pem ]
    then
        if ! dpkg-statoverride --list /etc/ejabberd/ejabberd.pem >/dev/null; then
            chown root:ejabberd /etc/ejabberd/ejabberd.pem
        fi
    fi
    )

    db_get ejabberd/hostname
    HOST="$RET"

    db_get ejabberd/user
    USER="$RET"
    db_get ejabberd/password
    PASSWD="$RET"
    sed -e     "s/  - \"localhost\"/  - \"$HOST\"/ ;
		s/  ## admin/  admin/ ;
		0,/  ##   user/s/  ##   user/     user/ ;
		s/.*ermine.*//" $CONFIG_SOURCE > "$TEMPFILE"
    # Since username is optional and we let the user set up the admin account
    # if there is no input to debconf's query, we use the given username or
    # leave it empty
    if [ -n "$USER" ]; then
		  sed -i "s/  ##     - \"aleksey@localhost\"/       - \"$USER@$HOST\"/" "$TEMPFILE"
    else
      sed -i "s/  ##     - \"aleksey@localhost\"/       - \"\"/" "$TEMPFILE"
    fi
    ucf --three-way --debconf-ok "$TEMPFILE" "$CONFIG_TARGET"
    db_stop

    # Making ejabberd config readable only by ejabberd user.
    chown ejabberd:ejabberd "$CONFIG_TARGET"
    chmod 600 "$CONFIG_TARGET"
}

register_admin()
{
    if [ -n "$USER" ] && [ -n "$PASSWD" ]; then
	echo "Waiting for ejabberd to register admin user"

	if ejabberdctl status >/dev/null || test $? = 1 ; then
	    # Ejabberd is starting ($? = 1) or running ($? = 0) already.
	    cnt=0
	    flag=1
	    while ! ejabberdctl status >/dev/null ; do
		cnt=$((cnt + 1))
		if [ $cnt -ge 60 ] ; then
		    echo
		    echo "Can't register admin user \"$USER@$HOST\"."
		    echo "Ejabberd is taking too long to start."
		    flag=0
		    break
		fi
		sleep 1
	    done

	    echo
	    if [ $flag -eq 1 ] ; then
		if ejabberdctl registered_users "$HOST" | grep -q "^${USER}$"; then
			echo "Admin user \"$USER@$HOST\" is already registered. Password IS NOT changed."
		else
			status=$(ejabberdctl register "$USER" "$HOST" "$PASSWD")
			if echo "$status" | grep -q "successfully registered" ; then
				echo "Admin user \"$USER@$HOST\" is registered successfully."
			else
				echo "Can't register admin user \"$USER@$HOST\". ($status)"
			fi
		fi
	    fi
	else
	    echo
	    echo "Can't register admin user \"$USER@$HOST\"."
	    echo "Ejabberd server is not started."
	fi
    fi
}

case "$1" in
    configure|reconfigure)
	adduser --quiet --system --shell /bin/sh --group --home /var/lib/ejabberd ejabberd 2> /dev/null || true
	setup_ejabberd "$@"
    ;;

    abort-upgrade|abort-remove|abort-deconfigure)

    ;;

    *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 0
    ;;
esac

#DEBHELPER#

case "$1" in
    configure|reconfigure)
    register_admin
    ;;
esac

exit 0
