#! /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
	chmod 750 /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*' \
		| while read f; do
		    chown ejabberd:adm "$f"
		    chmod 0640 "$f"
	    done
	fi
    fi

    # Making /etc/ejabberd/ejabberd.pem if it does not exist.
    ( cd /etc/ejabberd
    if [ ! -f ejabberd.pem ]
    then
	echo "Generating SSL certificate /etc/ejabberd/ejabberd.pem..."
	EHOSTNAME=$(hostname -s 2>/dev/null || echo localhost)
	EDOMAINNAME=$(hostname -d 2>/dev/null || echo localdomain)
	openssl req -new -x509 -days 365 -nodes -out ejabberd.pem \
		    -keyout ejabberd.pem > /dev/null 2>&1 <<+++
.
.
.
$EDOMAINNAME
$EHOSTNAME
ejabberd
root@$EHOSTNAME.$EDOMAINNAME
+++
    fi
    if ! dpkg-statoverride --list /etc/ejabberd/ejabberd.pem >/dev/null; then
	chown root:ejabberd /etc/ejabberd/ejabberd.pem
	chmod 640 /etc/ejabberd/ejabberd.pem
    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/  ##     - \"aleksey\": \"localhost\"/         - \"$USER\": \"$HOST\"/ ;
		s/.*ermine.*//" $CONFIG_SOURCE > $TEMPFILE
    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" -a -n "$PASSWD" ]; then
	echo -n "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
		echo -n "."
		cnt=`expr $cnt + 1`
		if [ $cnt -ge 60 ] ; then
		    echo
		    echo "Can't register admin user \"$USER@$HOST\"."
		    echo -n "Ejabberd is starting too long."
		    flag=0
		    break
		fi
		sleep 1
	    done

	    echo
	    if [ $flag -eq 1 ] ; then
		if ! status=$(ejabberdctl register "$USER" "$HOST" "$PASSWD") ; then
		    if echo $status | grep -q "already registered" ; then
			echo "Admin user \"$USER@$HOST\" is already registered. Password IS NOT changed."
		    else
			echo "Can't register admin user \"$USER@$HOST\"."
		    fi
		else
		    echo "Admin user \"$USER@$HOST\" is registered successfully."
		    invoke-rc.d ejabberd restart
		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
	setup_ejabberd "$@"
	update-rc.d ejabberd defaults > /dev/null
	if ! ejabberdctl status > /dev/null; then 
	    invoke-rc.d ejabberd start
	fi
    ;;

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

    ;;

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

# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.

#DEBHELPER#

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

exit 0

