#!/bin/bash

# Default configured services
if [ -e /etc/debian_version ]; then
    TOWER_CONFIG="/etc/default/ansible-tower"
else
    TOWER_CONFIG="/etc/sysconfig/ansible-tower"
fi

# Load default configuration
[ -e "${TOWER_CONFIG}" ] && . "${TOWER_CONFIG}"

service_action() {
    SERVICES=$TOWER_SERVICES

    # When determining whether mongod is required, postgres is required.  The
    # following ensures mongod is started after postgres, and stopped before
    # postgres.
    case ${1} in
        start|status)
            SERVICES="$SERVICES mongod"
            ;;
        stop)
            SERVICES="mongod $SERVICES"
            ;;
    esac

    for svc in ${SERVICES}; do

        # Determine whether mongod is needed
        if [[ ${svc} == mongod ]]; then
            tower-manage uses_mongo --local 2> /dev/null >/dev/null
            # if mongod is not required, break
            if [ $? -ne 0 ]; then
                continue
            fi
        fi

        service ${svc} $1
        this_return=$?
        if [ $this_return -gt $worst_return ]; then
            worst_return=$this_return
        fi
        # Allow supervisor time to cleanup child pids (ubuntu only)
        if [[ ${svc} == supervisor* && ${1} == stop && -e /etc/debian_version ]]; then
	        S_PID=$(pidof -x supervisord)
            echo "Waiting to allow supervisor time to cleanup ... pid ${S_PID}"
            if [ "${S_PID}" ]; then
                i=0
                while kill -0 "${S_PID}" 2> /dev/null; do
                    if [ $i = '60' ]; then
                        break;
                    else
                        if [ $i == '0' ]; then
                            echo -n " ... waiting"
                        else
                            echo -n "."
                        fi
                        i=$(($i+1))
                        sleep 1
                    fi
                done
            fi
        fi
    done
}

usage() {
    echo "Ansible Tower service helper utility"
    echo "Usage: $0 {start|stop|restart|status}"
}

worst_return=0
case "$1" in
    help | -help | --help | -h)
        usage
        ;;
    start)
	      echo "Starting Tower"
	      service_action start
	      ;;
    stop)
	    echo "Stopping Tower"
	    service_action stop
	    ;;
    restart)
	    echo "Restarting Tower"
	    service_action stop
	    service_action start
	    ;;
    status)
	    echo "Showing Tower Status"
	    service_action status
	    ;;
    *)
        usage
        worst_return=1
esac
exit $worst_return
