#!/bin/bash

#------------------------------------------------------------------------
# ${0} - Enable or disable EOLE flask application
# Copyright © 2013 Pôle de compétences EOLE <eole@ac-dijon.fr>
# License CeCILL-2:
#  * in french: http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html
#  * in english http://www.cecill.info/licences/Licence_CeCILL_V2-en.html

#------------------------------------------------------------------------
# Changes:
#    0.0.1  First draft

#------------------------------------------------------------------------
# Usage: ${0} enable|disable <name>
#
# Enable or disable an EOLE flask application.
#
# Enabling an application create a symbolic link in
# /etc/eole/flask/enable pointing to the configuration file
# /etc/eole/flask/available/<name>.
#
# Disabling an application remove the symbolic link.

[[ "${DEBUG}" == "yes" ]] && set -x
SELF=$(basename ${0})
ACTION="${1}"
MODULE="${2}"
INSTANCE="${3}"
CONF_FILE="${MODULE}.conf"

[[ -z ${FLK_DIR}   ]] && FLK_DIR="/etc/eole/flask"
[[ -z ${FLK_AVAIL} ]] && FLK_AVAIL="${FLK_DIR}/available"
if [ -z ${INSTANCE} ]
then
	[[ -z ${FLK_ENABL} ]] && FLK_ENABL="${FLK_DIR}/enabled"
else
	[[ -z ${FLK_ENABL} ]] && FLK_ENABL="${FLK_DIR}/${INSTANCE}/enabled"
fi

err() { echo -e "$@" >&2;}
die()  { echo -e "$@" >&2; exit 1; }
warn() { echo -e "$@" >&2; }

# @NAME : usage
# @AIM  : print script help message
# @RETURN : Nothing
function usage()
{
    MSG="Usage : ${SELF} [enable | disable] my_flask_module <instance>"
    MSG="${MSG}\n\t${SELF} enable genconfig eoleadmin"
    MSG="${MSG}\n\t${SELF} enable eop eoleapps"
    MSG="${MSG}\n\t${SELF} enable eoleauth"
    MSG="${MSG}\n\t${SELF} list"
    echo -e ${MSG}
}

# @NAME : validate_action
# @AIM  : validate prerequiste before running actions
# @PARAMS :
#    - ${@} all the script parameters
# @RETURN :
#    - 0 --> OK
#    - 1 or + --> Not OK
function validate_action()
{
    nb_prams=${#}

    if [[ ${1} = "-h" ]] || [[ ${1} = "--help" ]]
    then
        usage
        exit 0
    fi

    if [[ ! -d ${FLK_DIR} ]]
    then
        die "[ERROR] ${FLK_DIR} is missing"
    elif [[ ! -d ${FLK_AVAIL} ]]
    then
        die "[ERROR] ${FLK_AVAIL} is missing"
    elif [[ ! -d ${FLK_ENABL} ]]
    then
        die "[ERROR] ${FLK_ENABL} is missing"
    fi

    if [[ ${nb_prams} -eq 0 ]]
    then
        die "Missing parameter"
    elif [[ "${ACTION}" -ne "enable" ]] || [[ "${ACTION}" -ne "disable" ]]
    then
        usage
        die "Unknown action '${ACTION}'"
    fi
    return 0
}

# @NAME : enable_module
# @AIM  : enable an eole-flask module (create a symlink in enabled directory)
# @PARAMS : None
# @RETURN :
#    - 0 --> OK
#    - 1 or + --> Not OK
function enable_module()
{
    if [[ -z "${MODULE}" ]]
    then
        usage
        die "Please provide a module to ${ACTION}"
    fi
    echo -ne "Enabling ${MODULE}... "
    if [[ -f "${FLK_ENABL}/${CONF_FILE}" ]]
    then
        die "[Error](${MODULE} already enabled)"
    elif [[ -f "${FLK_AVAIL}/${CONF_FILE}" ]]
    then
        if ! ln -s "${FLK_AVAIL}/${CONF_FILE}" "${FLK_ENABL}/${CONF_FILE}"
    then
        die "[KO](Unable to create symbolic link)"
    fi
    else
        die "[Error](No module named ${MODULE})"
    fi
}

# @NAME : disable_module
# @AIM  : disable an eole-flask module (remove the symlink in enabled dir)
# @PARAMS : None
# @RETURN :
#    - 0 --> OK
#    - 1 or + --> Not OK
function disable_module()
{
    if [[ -z "${MODULE}" ]]
    then
        usage
        die "Please provide a module to ${ACTION}"
    fi
    echo -ne "Disabling ${MODULE}... "
    if [[ -f "${FLK_ENABL}/${CONF_FILE}" ]]
    then
        if ! rm "${FLK_ENABL}/${CONF_FILE}"
    then
        die "[KO](Removing ${FLK_ENABL}/${CONF_FILE} failed"
    fi
    else
        die "[KO](Module ${MODULE} already disabled)"
    fi
}

# @NAME : list_modules
# @AIM  : list eole-flask modules
# @PARAMS : None
# @RETURN :
#    - 0 --> OK
#    - 1 or + --> Not OK
function list_modules()
{
    echo "Available modules : "
    mods=$(ls ${FLK_AVAIL})
    for module in ${mods}
    do
        echo "   ${module%.*}"
    done
}


validate_action ${@} || die "Failure on prerequiste validation"


if [[ "${ACTION}" = "enable" ]]
then
    enable_module && echo "[OK]"
elif [[ "${ACTION}" = "disable" ]]
then
    disable_module && echo "[OK]"
elif [[ "${ACTION}" = "list" ]]
then
    list_modules
fi
