#!/usr/bin/env bash
set -euo pipefail

if [[ "$(id -u)" -ne 0 ]]; then
  echo "tms-rabbitmqctl must be executed as root through sudo" >&2
  exit 77
fi

if [[ $# -lt 1 ]]; then
  echo "usage: tms-rabbitmqctl <allowed-rabbitmqctl-command> [args...]" >&2
  exit 64
fi

require_arg_count() {
  local expected="$1"
  shift
  if [[ $# -ne "${expected}" ]]; then
    echo "unsupported rabbitmqctl arguments" >&2
    exit 64
  fi
}

case "$1" in
  status|list_users)
    require_arg_count 1 "$@"
    ;;
  add_vhost|delete_user)
    require_arg_count 2 "$@"
    ;;
  add_user|change_password|authenticate_user)
    require_arg_count 3 "$@"
    ;;
  set_permissions)
    if [[ $# -ne 7 || "${2:-}" != "-p" ]]; then
      echo "unsupported rabbitmqctl set_permissions arguments" >&2
      exit 64
    fi
    ;;
  clear_permissions)
    if [[ $# -ne 4 || "${2:-}" != "-p" ]]; then
      echo "unsupported rabbitmqctl clear_permissions arguments" >&2
      exit 64
    fi
    ;;
  list_queues)
    if [[ ! ( $# -eq 2 || ( $# -eq 4 && "${2:-}" == "-p" ) ) ]]; then
      echo "unsupported rabbitmqctl list_queues arguments" >&2
      exit 64
    fi
    ;;
  delete_queue)
    if [[ ! ( $# -eq 2 || ( $# -eq 4 && "${2:-}" == "-p" ) ) ]]; then
      echo "unsupported rabbitmqctl delete_queue arguments" >&2
      exit 64
    fi
    ;;
  *)
    echo "unsupported rabbitmqctl command: $1" >&2
    exit 64
    ;;
esac

export ERLANG_HOME="${ERLANG_HOME:-/usr/local/erlang}"
export RABBITMQ_HOME="${RABBITMQ_HOME:-/usr/local/rabbitmq}"
export PATH="${ERLANG_HOME}/bin:${RABBITMQ_HOME}/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin"

if [[ -n "${RABBITMQ_CTL:-}" ]]; then
  RABBITMQ_CTL_CANDIDATES=("${RABBITMQ_CTL}")
else
  RABBITMQ_CTL_CANDIDATES=(
    "${RABBITMQ_HOME}/sbin/rabbitmqctl"
    "/usr/local/rabbitmq/sbin/rabbitmqctl"
    "/usr/local/rabbitmq-server/sbin/rabbitmqctl"
    "/usr/sbin/rabbitmqctl"
    "/usr/lib/rabbitmq/bin/rabbitmqctl"
  )
fi

RABBITMQ_CTL=""
for candidate in "${RABBITMQ_CTL_CANDIDATES[@]}"; do
  if [[ -x "${candidate}" ]]; then
    RABBITMQ_CTL="${candidate}"
    break
  fi
done

if [[ ! -x "${RABBITMQ_CTL}" ]]; then
  echo "rabbitmqctl not executable" >&2
  exit 69
fi

exec "${RABBITMQ_CTL}" "$@"
