#!/bin/bash
#
# Usage: setup-test-env-amqp.sh <command to run>
# where AMQP1_BACKEND is the AMQP 1.0 intermediary to use. Valid
# values are "qdrouterd" for router and "qpidd" for broker.
set -e

# router requires qdrouterd, sasl2-bin/cyrus-sasl-plain+cyrus-sasl-lib
# broker requires qpidd, qpid-tools sasl2-bin/cyrus-sasl-plain+cyrus-sasl-lib

. tools/functions.sh

DATADIR=$(mktemp -d /tmp/OSLOMSG-${AMQP1_BACKEND}.XXXXX)
trap "clean_exit $DATADIR" EXIT

function _setup_qdrouterd_user {
    echo secretqpid | saslpasswd2 -c -p -f ${DATADIR}/qdrouterd.sasldb stackqpid
}

function _setup_qpidd_user {
    echo secretqpid | saslpasswd2 -c -p -f ${DATADIR}/qpidd.sasldb -u QPID stackqpid
}

function _configure_qdrouterd {
    # create a stand alone router
    cat > ${DATADIR}/qdrouterd.conf <<EOF
router {
    mode: standalone
    id: Router.A
    workerThreads: 4
    saslConfigPath: ${DATADIR}/sasl2
    saslConfigName: qdrouterd
}

EOF

    # create a listener for incoming connect to the router
    cat >> ${DATADIR}/qdrouterd.conf <<EOF
listener {
    addr: 0.0.0.0
    port: 65123
    role: normal
    authenticatePeer: yes
}

EOF
    # create fixed address prefixes
    cat >> ${DATADIR}/qdrouterd.conf <<EOF
address {
    prefix: unicast
    distribution: closest
}

address {
    prefix: exclusive
    distribution: closest
}

address {
    prefix: broadcast
    distribution: multicast
}

address {
    prefix: openstack.org/om/rpc/multicast
    distribution: multicast
}

address {
    prefix: openstack.org/om/rpc/unicast
    distribution: closest
}

address {
    prefix: openstack.org/om/rpc/anycast
    distribution: balanced
}

address {
    prefix: openstack.org/om/notify/multicast
    distribution: multicast
}

address {
    prefix: openstack.org/om/notify/unicast
    distribution: closest
}

address {
    prefix: openstack.org/om/notify/anycast
    distribution: balanced
}

EOF

    # create log file configuration
    cat >> ${DATADIR}/qdrouterd.conf <<EOF
log {
    module: DEFAULT
    enable: trace+
    output: ${DATADIR}/out
}

EOF
    # sasl2 config
    mkdir -p ${DATADIR}/sasl2
    cat > ${DATADIR}/sasl2/qdrouterd.conf <<EOF
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: ${DATADIR}/qdrouterd.sasldb
mech_list: PLAIN ANONYMOUS
EOF

}

function _configure_qpidd {

    QPIDD=$(which qpidd 2>/dev/null)
    if [[ ! -x "$QPIDD" ]]; then
        echo "FAILURE: qpidd broker not installed"
        exit 1
    fi

    [ -f "/usr/lib/qpid/daemon/acl.so" ] && LIBACL="load-module=/usr/lib/qpid/daemon/acl.so"

    cat > ${DATADIR}/qpidd.conf <<EOF
port=65123
sasl-config=${DATADIR}/sasl2
${LIBACL}
mgmt-enable=yes
log-to-stderr=no
data-dir=${DATADIR}/.qpidd
pid-dir=${DATADIR}/.qpidd
EOF

if ! `$QPIDD --help | grep -q "sasl-service-name"`; then
    echo "This version of $QPIDD does not support SASL authentication with AMQP 1.0"
    cat >> ${DATADIR}/qpidd.conf <<EOF
auth=no
EOF
else
    cat >> ${DATADIR}/qpidd.conf <<EOF
auth=yes
acl-file=${DATADIR}/qpidd.acl
sasl-service-name=amqp
EOF
fi

    cat >> ${DATADIR}/qpidd.conf <<EOF
queue-patterns=exclusive
queue-patterns=unicast
topic-patterns=broadcast
EOF

    cat > ${DATADIR}/qpidd.acl <<EOF
group admin stackqpid@QPID
acl allow admin all
acl deny all all
EOF

    mkdir -p ${DATADIR}/sasl2
    cat > ${DATADIR}/sasl2/qpidd.conf <<EOF
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: ${DATADIR}/qpidd.sasldb
mech_list: PLAIN ANONYMOUS
sql_select: dummy select
EOF

}

function _start_qdrouterd {
    MAJOR=$(python -c 'import sys; print(sys.version_info.major)')
    MINOR=$(python -c 'import sys; print(sys.version_info.minor)')
    # qdrouterd needs access to global site packages
    # create path file and place in virtual env working directory
    SITEDIR=${WORKDIR}/${ENVNAME}/lib/python${MAJOR}.${MINOR}/site-packages
    cat > ${SITEDIR}/dispatch.pth <<EOF
/usr/lib/python${MAJOR}.${MINOR}/site-packages
EOF

    QDR=$(which qdrouterd 2>/dev/null)
    mkfifo ${DATADIR}/out
    $QDR --config ${DATADIR}/qdrouterd.conf &
    wait_for_line "Router .*started" "error" ${DATADIR}/out
    rm ${SITEDIR}/dispatch.pth
}

function _start_qpidd {
    chmod -R a+r ${DATADIR}
    QPIDD=$(which qpidd 2>/dev/null)
    mkfifo ${DATADIR}/out
    $QPIDD --log-enable trace+ --log-to-file ${DATADIR}/out --config ${DATADIR}/qpidd.conf &
    wait_for_line "Broker .*running" "error" ${DATADIR}/out
}

_configure_${AMQP1_BACKEND}
_setup_${AMQP1_BACKEND}_user
_start_${AMQP1_BACKEND}

$*
