#!/bin/bash
# Script for inserting/deleting aliases from Alice config file
#

[ -r /etc/sysconfig/jabber-alice ] && . /etc/sysconfig/jabber-alice
CONFIG=$CONFIG_FILE
[ "$CONFIG" == "" ] && CONFIG=./config.xml
BACKUP="$CONFIG.back"

SITE_CONFIG=`dirname "$CONFIG"`/alice-config.conf

# Default values
HOST=
PORT=5222
TLS=no
RESOURCE=Alice
PRIORITY=0

[ -r "$SITE_CONFIG" ] && . "$SITE_CONFIG"

show_usage() {
	echo "Usage: $0 [--host=<host>] [--port=<port>] [--tls] [--resource=<name>] [--priority=<num>] (help|add|del|list) [From[:Password]] [<To> [<To> ..]]"
	echo "Options are userfull only for adding accounts."
	echo "Default values (see $SITE_CONFIG):"
	echo "  host = <host part of From JID>"
	echo "  port = $PORT"
	echo "  tls  = $TLS"
	echo "  resource = $RESOURCE"
	echo "  priority = $PRIORITY"
	exit 0
}

check_config() {
if [ "$CONFIG" ]; then
	if [ ! -r "$CONFIG" ]; then
		echo "Can't read config file $CONFIG, exiting..."
		exit 2
	fi
else 
	echo "Config file name is't set, exiting..."
	exit 2
fi
}

TEMP=`getopt -n "$0" -o h -l host:,port:,tls,resource:,priority:,config: -- "$@"` || show_usage
eval set -- "$TEMP"

while :; do
	case "$1" in
	   -h|help) 
	   	show_usage
		;;
	   --host) 
	   	shift
		[ "$1" ] && HOST=$1
		shift
	        ;;
	   --port) 
	   	shift
		[ "$1" ] && PORT=$1
		shift
	        ;;
	   --tls) 
		shift
		TLS=yes
	        ;;
	   --resource) 
	   	shift
		[ "$1" ] && RESOURCE=$1
		shift
	        ;;
	   --priority) 
	   	shift
		[ "$1" ] && PRIORITY=$1
		shift
	        ;;
	   --config) 
	   	shift
		CONFIG=$1
		shift
	        ;;
	   --)
	   	shift
		;;
	   add)
		ACTION='add'
		break
		;;
	   del|delete)
		ACTION='del'
		break
		;;
	   list)
	   	check_config
	   	sed -n '/^[[:blank:]]*<!--#alias/ s/^[[:blank:]]*<!--#alias[[:blank:]]\+\(.\+\)[[:blank:]]*-->/\1/p' < "$CONFIG"
		exit 0
		;;
	   -h|*)
		show_usage
	esac
done

shift
check_config

[ "$1" ] || show_usage
FROM=$1
shift
[ "$1" ] || show_usage
TO=$@

# check password part in From JID
USER=`echo $FROM | sed -n 's/^\([^@]\+\)@\?.*$/\1/p'`
DOMAIN=`echo $FROM | sed -n 's/^[^@]\+@\([^:]*\):\?.*$/\1/p'`
PASSWORD=`echo $FROM | sed -n 's/^[^@]\+@\?[^:]*:\?\(.*\)$/\1/p'`

FROM=$USER
[ $DOMAIN ] && FROM="$FROM@$DOMAIN"
echo "$ACTION from=<$FROM>, to=<$TO>"

[ "$USER" ] || (echo "Cann't find user name from JID $FROM, exiting...";exit 1);

[ "$DOMAIN" ] || (echo "No domain part in JID $FROM, using --host instead..."; DOMAIN=$HOST);
[ "$DOMAIN" ] || (echo "Cann't find domain for JID $FROM, exiting...";exit 1);

[ "$HOST" ] || HOST=$DOMAIN


exit_handler()
{
    local rc=$?
    trap - EXIT
    if [ -d "$TEMPDIR" ]; then
        rm -f "$TEMPDIR/header" "$TEMPDIR/footer" "$TEMPDIR/connection" "$TEMPDIR/config" "$TEMPDIR/tmp"
	rmdir "$TEMPDIR"
    fi
    exit $rc
}
trap exit_handler HUP PIPE INT QUIT TERM EXIT

# Split config into parts
# Three-way split - header, connection, footer - by $LINE
config_split_3() {
    sed    "/^$LINE/q" <$CONFIG | sed '$d' > "$TEMPDIR/header"
    sed -n "/^$LINE/,\$p" <$CONFIG >"$TEMPDIR/tmp"
    sed -n '1,/^[[:blank:]]*<\/connection>/p' < "$TEMPDIR/tmp" >"$TEMPDIR/connection"
    sed -n '/^[[:blank:]]*<\/connection>/,$p' < "$TEMPDIR/tmp" | sed '1d' > "$TEMPDIR/footer"
}
# Two-way split - header before </aliases>, and footer
config_split_2() {
    sed    '/^[[:blank:]]*<\/aliases>/q'  <$CONFIG  | sed '$d' >"$TEMPDIR/header"
    touch "$TEMPDIR/connection"
    sed -n '/^[[:blank:]]*<\/aliases>/,$p' <$CONFIG > "$TEMPDIR/footer"

}

# Make connection section
make_connection() {
    local i
    cat <<__END__ > "$TEMPDIR/connection" 
	<!--#alias $FROM => $TO -->
	<connection>
		<hostname>$HOST</hostname>
		<domain>$DOMAIN</domain>
		<username>$USER</username>
		<password>$PASSWORD</password>
		<port>$PORT</port>
		<tls>$TLS</tls>
		<priority>$PRIORITY</priority>
		<resource>$RESOURCE</resource>
__END__
    for i in $TO ; do
	echo -e "\t\t<real_jid>$i</real_jid>" >> "$TEMPDIR/connection"
    done
    echo -e "\t</connection>" >>  "$TEMPDIR/connection"
}
											

TEMPDIR=`mktemp -td`
LINE=`sed -n "/^[[:blank:]]*<\!--#alias[[:blank:]]\+$FROM[[:blank:]]\+=>[[:blank:]]\+$TO[[:blank:]]\+-->/p" <$CONFIG | sed -n '1p'` 


if [ "$ACTION" == 'add' ]; then
    if [ "$LINE" ]; then
	echo "Connection from $FROM to $TO already exists, replacing it with new one"
	config_split_3
    else
	echo "Adding connection from $FROM to $TO"
	config_split_2
    fi
    make_connection
    cat "$TEMPDIR/header" "$TEMPDIR/connection" "$TEMPDIR/footer" > "$TEMPDIR/config"
else
    if [ "$LINE" ]; then
	echo "Deleting connection from $FROM to $TO"
	config_split_3
	cat "$TEMPDIR/header" "$TEMPDIR/footer" > "$TEMPDIR/config"
    else
	echo "There are no connection from $FROM to $TO"
	exit 0
    fi
fi

# Updating config file
if ! diff -q "$CONFIG" "$TEMPDIR/config" >/dev/null; then
        echo "Updating config file"
        mv -f "$CONFIG" "$BACKUP"
        mv -f "$TEMPDIR/config" "$CONFIG"
fi

