#!/bin/bash
# chkconfig:         2345 95 05
# description:       Pyswitchlib api daemon is an object broker for pyswitchlib assets.
### BEGIN INIT INFO
# Provides:          pyswitchlib api daemon
# Required-Start:    $local_fs $network $remote_fs $syslog
# Required-Stop:     $local_fs $network $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Pyswitchlib api broker
# Description:       Pyswitchlib api daemon is an object broker for pyswitchlib assets.
#
### END INIT INFO

# Author: Brian Adaniya <badaniya@brocade.com>

PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="pyswitchlib-api-daemon"
NAME=pyswitchlib-api-daemon
SCRIPTNAME=/etc/init.d/$NAME
PYSWITCHLIB_CONF_PATH="/etc/pyswitchlib/pyswitchlib.conf"

if [ -f /lib/lsb/init-functions ]; then
    source /lib/lsb/init-functions
elif [ -f /etc/init.d/functions ]; then
    source /etc/init.d/functions
fi

typeset -A PYSWITCHLIB_CONF

read_pyswitchlib_conf()
{
    local PYSWITCHLIB_CONF_LIST=()
    local OLD_IFS=$IFS

    if [ -f "$PYSWITCHLIB_CONF_PATH" ]; then
        IFS=$'\n'
        PYSWITCHLIB_CONF_LIST=$(<"$PYSWITCHLIB_CONF_PATH")
    fi

    for line in ${PYSWITCHLIB_CONF_LIST[@]}; do
        key=${line%%=*}
        value=${line#*=}

        key=${key//[[:space:]]/}
        value=${value//[[:space:]]/}

        PYSWITCHLIB_CONF[$key]=$value
    done

    IFS=$OLD_IFS
}

get_ns_port_from_pyswitchlib_conf()
{
    local NS_PORT=""

    for key in "${!PYSWITCHLIB_CONF[@]}"; do
        if [ "$key" = "ns_port" ]; then
            NS_PORT=${PYSWITCHLIB_CONF[$key]}
            break
        fi
    done

    echo "$NS_PORT"
}

get_api_daemons_from_pyswitchlib_conf()
{
    local API_DAEMONS=()

    for key in "${!PYSWITCHLIB_CONF[@]}"; do
        if [ "${key%_daemon_*}" = "api" ]; then
            API_DAEMONS+=("$key")
        fi
    done

    echo "${API_DAEMONS[@]}"
}

get_pyswitchlib_paths()
{
    local FILENAME="$1"

    local VIRTENV_PATH="/opt/stackstorm/virtualenvs"
    local PYSWITCHLIB_PATH="/lib/python2.7/site-packages/pyswitchlib"
    local PACKNAME="network_essentials"
    local PACKNAME2="dcfabric"

    local PYSWITCHLIB_DAEMON_PATH=""
    local VIRTENV_PACK_PATH=""

    if [ -z "$FILENAME" ]; then
        FILENAME="pyswitchlib_api_daemon.py"
    fi

    if [ -e "$VIRTENV_PATH/$PACKNAME$PYSWITCHLIB_PATH/$FILENAME" ]; then
        PYSWITCHLIB_DAEMON_PATH="$VIRTENV_PATH/$PACKNAME$PYSWITCHLIB_PATH/$FILENAME"
        VIRTENV_PACK_PATH="$VIRTENV_PATH/$PACKNAME"
    elif [ -e "$VIRTENV_PATH/$PACKNAME2$PYSWITCHLIB_PATH/$FILENAME" ]; then
        PYSWITCHLIB_DAEMON_PATH="$VIRTENV_PATH/$PACKNAME2$PYSWITCHLIB_PATH/$FILENAME"
        VIRTENV_PACK_PATH="$VIRTENV_PATH/$PACKNAME2"
    else
        PYSWITCHLIB_DAEMON_PATH="`python -c \"import os; import sys; print(sorted(os.path.join(x, 'pyswitchlib') for x in sys.path if os.path.isdir(os.path.join(x, 'pyswitchlib')))[0])\"`/$FILENAME"
        VIRTENV_PACK_PATH=""
    fi

    echo "$PYSWITCHLIB_DAEMON_PATH:$VIRTENV_PACK_PATH"
}

get_api_deamon_path_from_pyswitchlib_conf()
{
    local API_DAEMON="$1"
    local PYSWITCHLIB_PATH="/lib/python2.7/site-packages/pyswitchlib"
    local FILENAME="pyswitchlib_api_daemon.py"
    local PYSWITCHLIB_DAEMON_PATH=""
    local VIRTENV_PATH=""
    local DAEMON_PATHS=()

    if [ -n "$API_DAEMON" ]; then
        DAEMON_PATHS=(${PYSWITCHLIB_CONF[$API_DAEMON]//:/ })
        
        if [ ${#DAEMON_PATHS[@]} -ge 1 ]; then
            VIRTENV_PATH="${DAEMON_PATHS[0]}"
            PYSWITCHLIB_DAEMON_PATH="$VIRTENV_PATH$PYSWITCHLIB_PATH/$FILENAME"
        fi
    fi

    echo "$PYSWITCHLIB_DAEMON_PATH:$VIRTENV_PATH"
}

stop_stale_pyswitchlib_pids()
{
    local PYSWITCHLIB_PID_FILES=(`ls -1 /etc/pyswitchlib/.pyswitchlib*pid 2>/dev/null`)

    if [ ${#PYSWITCHLIB_PID_FILES[@]} -ge 1 ]; then
        for pid_file in "${PYSWITCHLIB_PID_FILES[@]}"; do
            if [ -f "$pid_file" ]; then
                kill `cat $pid_file`
            fi
        done
    fi
}

eval_overall_return_value()
{
    local RETVALS=("$@")
    local OVERALL_RETVAL=0

    for ret in "${RETVALS[@]}"; do
        if [ $ret -ne 0 ]; then
            OVERALL_RETVAL=$ret
            break
        fi
    done

    return $OVERALL_RETVAL
}

pyswitchlib_api_daemon_wrapper()
{
    local OPERATION="$1"
    local OVERALL_RETVAL=0
    local RETVALS=()
    local NS_PORT=`get_ns_port_from_pyswitchlib_conf`
    local API_DAEMONS=(`get_api_daemons_from_pyswitchlib_conf`)
    local PYSWITCHLIB_NS_PATHS=`get_pyswitchlib_paths pyswitchlib_ns_daemon.py`
    local PYSWITCHLIB_NS_PATH=${PYSWITCHLIB_NS_PATHS%:*}
    local VIRTENV_NS_PATH=${PYSWITCHLIB_NS_PATHS#*:}
    local PYSWITCHLIB_DAEMON_PATHS=""
    local PYSWITCHLIB_DAEMON_PATH=""
    local VIRTENV_DAEMON_PATH=""

    if [ -n "$NS_PORT" ]; then
        if [ -f "$PYSWITCHLIB_NS_PATH" ]; then
            if [ -d "$VIRTENV_NS_PATH" ]; then
                . "$VIRTENV_NS_PATH/bin/activate"
            fi

            python "$PYSWITCHLIB_NS_PATH" "$OPERATION"

            RETVALS+=("$?")
        fi
    fi

    for API_DAEMON in "${API_DAEMONS[@]}"; do
        PYSWITCHLIB_DAEMON_PATHS=`get_api_deamon_path_from_pyswitchlib_conf $API_DAEMON`
        PYSWITCHLIB_DAEMON_PATH=${PYSWITCHLIB_DAEMON_PATHS%:*}
        VIRTENV_DAEMON_PATH=${PYSWITCHLIB_DAEMON_PATHS#*:}

        if [ -f "$PYSWITCHLIB_DAEMON_PATH" ]; then
            if [ -d "$VIRTENV_DAEMON_PATH" ]; then
                . "$VIRTENV_DAEMON_PATH/bin/activate"
            fi

            python "$PYSWITCHLIB_DAEMON_PATH" "$OPERATION"

            RETVALS+=("$?")
        fi
    done

    if [ ${#RETVALS[@]} -eq 0 ]; then
        local PYSWITCHLIB_DEFAULT_DAEMON_PATHS=`get_pyswitchlib_paths pyswitchlib_api_daemon.py`
        local PYSWITCHLIB_DEFAULT_DAEMON_PATH=${PYSWITCHLIB_DEFAULT_DAEMON_PATHS%:*}
        local VIRTENV_DEFAULT_DAEMON_PATH=${PYSWITCHLIB_DEFAULT_DAEMON_PATHS#*:}

        if [ -f "$PYSWITCHLIB_DEFAULT_DAEMON_PATH" ]; then
            if [ -d "$VIRTENV_DEFAULT_DAEMON_PATH" ]; then
                . "$VIRTENV_DEFAULT_DAEMON_PATH/bin/activate"
            fi

            python "$PYSWITCHLIB_DEFAULT_DAEMON_PATH" "$OPERATION"

            RETVALS+=("$?")
        fi
    fi

    if [ "$OPERATION" = "stop" ]; then
        stop_stale_pyswitchlib_pids
    fi

    eval_overall_return_value "${RETVALS[@]}"
    OVERALL_RETVAL=$?

    return $OVERALL_RETVAL
}

case "$1" in
    start|stop|restart|status)
    read_pyswitchlib_conf
    pyswitchlib_api_daemon_wrapper "$1"
    exit $?
    ;;
    *)
    echo "Usage: $SCRIPTNAME {start|stop|restart|status}" >&2
    exit 3
    ;;
esac
