#!/bin/sh

# /bin/sh on Solaris is not a POSIX compatible shell, but /usr/bin/ksh is.
if [ `uname -s` = 'SunOS' -a "${POSIX_SHELL}" != "true" ]; then
    POSIX_SHELL="true"
    export POSIX_SHELL
    # To support 'whoami' add /usr/ucb to path
    PATH=/usr/ucb:$PATH
    export PATH
    exec /usr/bin/ksh $0 "$@"
fi
unset POSIX_SHELL # clear it so if we invoke other scripts, they run as ksh as well

RUNNER_SCRIPT_DIR=$(cd ${0%/*} && pwd)
RUNNER_SCRIPT=${0##*/}

RUNNER_BASE_DIR=${RUNNER_SCRIPT_DIR%/*}
RUNNER_ETC_DIR=$RUNNER_BASE_DIR/etc
RUNNER_LIB_DIR=./lib
RUNNER_LOG_DIR=$RUNNER_BASE_DIR/log
RUNNER_USER=

WHOAMI=$(whoami)

# Make sure this script is running as the appropriate user
if ([ "$RUNNER_USER" ] && [ "x$WHOAMI" != "x$RUNNER_USER" ]); then
    type sudo > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "sudo doesn't appear to be installed and your EUID isn't $RUNNER_USER" 1>&2
        exit 1
    fi
    echo "Attempting to restart script through sudo -H -u $RUNNER_USER" >&2
    exec sudo -H -u $RUNNER_USER -i $RUNNER_SCRIPT_DIR/$RUNNER_SCRIPT $@
fi

# Make sure CWD is set to runner base dir
cd $RUNNER_BASE_DIR

# Extract the target node name from node.args
NAME_ARG=`egrep "^ *-s?name" $RUNNER_ETC_DIR/vm.args`
if [ -z "$NAME_ARG" ]; then
    echo "vm.args needs to have either -name or -sname parameter."
    exit 1
fi

# Learn how to specify node name for connection from remote nodes
echo "$NAME_ARG" | grep '^-sname' > /dev/null 2>&1
if [ "X$?" = "X0" ]; then
    NAME_PARAM="-sname"
    NAME_HOST=""
else
    NAME_PARAM="-name"
    echo "$NAME_ARG" | grep '@.*' > /dev/null 2>&1
    if [ "X$?" = "X0" ]; then
        NAME_HOST=`echo "${NAME_ARG}" | sed -e 's/.*\(@.*\)$/\1/'`
    else
        NAME_HOST=""
    fi
fi

# Extract the target cookie
COOKIE_ARG=`grep '\-setcookie' $RUNNER_ETC_DIR/vm.args`
if [ -z "$COOKIE_ARG" ]; then
    echo "vm.args needs to have a -setcookie parameter."
    exit 1
fi

# Identify the script name
SCRIPT=`basename $0`

# Parse out release and erts info
START_ERL=`cat $RUNNER_BASE_DIR/releases/start_erl.data`
ERTS_VSN=${START_ERL% *}
APP_VSN=${START_ERL#* }

# Add ERTS bin dir to our path
ERTS_PATH=$RUNNER_BASE_DIR/erts-$ERTS_VSN/bin

# Setup command to control the node
NODETOOL="$ERTS_PATH/escript $ERTS_PATH/nodetool $NAME_ARG $COOKIE_ARG"

# Check the first argument for instructions
case "$1" in
    status)
        if [ $# -ne 1 ]; then
            echo "Usage: $SCRIPT status"
            exit 1
        fi

        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "Node is not running!"
            exit 1
        fi
        shift

        $NODETOOL rpc emqttd_ctl status $@
        ;;

    cluster)
        if [ $# -gt 2 ]; then
            echo "Usage: $SCRIPT cluster [<Node>]"
            exit 1
        fi

        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        shift

        $NODETOOL rpc emqttd_ctl cluster $@
        ;;

    useradd)
        if [ $# -ne 3 ]; then
            echo "Usage: $SCRIPT useradd <Username> <Password>"
            exit 1
        fi

        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        shift

        $NODETOOL rpc emqttd_ctl useradd $@
        ;;

    userdel)
        if [ $# -ne 2 ]; then
            echo "Usage: $SCRIPT userdel <Username>"
            exit 1
        fi

        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        shift

        $NODETOOL rpc emqttd_ctl userdel $@
        ;;
        
    vm)
        if [ $# -gt 2 ]; then
            echo "Usage: $SCRIPT vm [ load | memory | process | io ]"
            exit 1
        fi

        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        shift

        $NODETOOL rpc emqttd_ctl vm $@
        ;;

    broker)
        if [ $# -ne 1 ]; then
            echo "Usage: $SCRIPT broker"
            exit 1
        fi

        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        shift

        $NODETOOL rpc emqttd_ctl broker $@
        ;;

    stats)
        if [ $# -ne 1 ]; then
            echo "Usage: $SCRIPT stats"
            exit 1
        fi

        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        shift

        $NODETOOL rpc emqttd_ctl stats $@
        ;;

    metrics)
        if [ $# -ne 1 ]; then
            echo "Usage: $SCRIPT metrics"
            exit 1
        fi

        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        shift

        $NODETOOL rpc emqttd_ctl metrics $@
        ;;

    bridges)
        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        if [[ $# -eq 2 ]] && [[ $2 = "list" ]]; then
            $NODETOOL rpc emqttd_ctl bridges list
        elif [ $# -eq 4 ]; then
            shift
            $NODETOOL rpc emqttd_ctl bridges $@
        else
            echo "Usage: "
            echo "$SCRIPT bridges list"
            echo "$SCRIPT bridges start <Node> <Topic>"
            echo "$SCRIPT bridges stop  <Node> <Topic>"
            exit 1
        fi
        ;;
    plugins)
        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        if [ $# -eq 2 -a $2 = "list" ]; then
            $NODETOOL rpc emqttd_ctl plugins list
        elif [ $# -eq 3 ]; then
            shift
            $NODETOOL rpc emqttd_ctl plugins $@
        else
            echo "Usage: "
            echo "$SCRIPT plugins list"
            echo "$SCRIPT plugins load <Plugin>"
            echo "$SCRIPT plugins unload <Plugin>"
            exit 1
        fi
        ;;
    listeners)
        if [ $# -gt 1 ]; then
            echo "Usage: $SCRIPT listeners"
            exit 1
        fi
        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        shift

        $NODETOOL rpc emqttd_ctl listeners $@
        ;;
    trace)
        # Make sure the local node IS running
        RES=`$NODETOOL ping`
        if [ "$RES" != "pong" ]; then
            echo "emqttd is not running!"
            exit 1
        fi
        if [ $# -eq 2 -a $2 = "list" ]; then
            $NODETOOL rpc emqttd_ctl trace list
        elif [ $# -eq 4 ]; then
            shift
            $NODETOOL rpc emqttd_ctl trace $@
        else
            echo "Usage: "
            echo "$SCRIPT trace list"
            echo "$SCRIPT trace client <ClientId> <LogFile>"
            echo "$SCRIPT trace client <ClientId> off"
            echo "$SCRIPT trace topic <Topic> <LogFile>"
            echo "$SCRIPT trace topic <Topic> off"
            exit 1
        fi
        ;;

    *)
        echo "Usage: $SCRIPT"
		echo "  status                        #query broker status"
        echo "  vm [ load | memory | process | io ]    #query load, memory, process and io of erlang vm"
		echo "  broker                        #query broker version, uptime and description"
		echo "  stats                         #query broker statistics of clients, topics, subscribers"
        echo "  metrics                       #query broker metrics"
		echo "  cluster [<Node>]              #query or cluster nodes"
        echo "  ----------------------------------------------------------------"
        echo "  plugins list                  #query loaded plugins"
        echo "  plugins load <Plugin>         #load plugin"
        echo "  plugins unload <Plugin>       #unload plugin"
        echo "  ----------------------------------------------------------------"
        echo "  bridges list                  #query bridges"
        echo "  bridges start <Node> <Topic>  #start bridge"
        echo "  bridges stop <Node> <Topic>   #stop bridge"
        echo "  ----------------------------------------------------------------"
		echo "  useradd <Username> <Password> #add user"
		echo "  userdel <Username>            #delete user"
        echo "  ----------------------------------------------------------------"
		echo "  listeners                     #query broker listeners"
        echo "  ----------------------------------------------------------------"
        echo "  trace list                    #query all traces"
        echo "  trace client <ClientId> <LogFile>   #trace client with ClientId"
        echo "  trace client <ClientId> off         #stop to trace client"
        echo "  trace topic <Topic> <LogFile>       #trace topic with Topic"
        echo "  trace topic <Topic> off             #stop to trace Topic"
        exit 1
        ;;
	
esac

