#!/usr/bin/bash

RED='\033[0;31m'
NC='\033[0m'

function pushd () {
    command pushd "$@" > /dev/null
}
function popd () {
    command popd "$@" > /dev/null
}

function show_error_with_exit(){
    printf "${RED}Ошибка:${NC} $1\n"
    exit 1
}

function check_priveleged_user(){
    USER_ID=$(id -u)
    if [ "$USER_ID" != "0" ];then
        printf "${RED}Скрипт должен быть запущен  под привилегированным пользователем${NC}\n"
        exit 1
    fi
}

function show_warning(){
    printf "${RED}Внимание!!!${NC}\n"
    printf "Данный скрипт внесет изменения в ОС, будут установлены дополнительные пакеты и изменены настройки нескольких программных комплексов\n"
    read -n1 -s -r -p $'Нажмите y для продолжения... Любая другая клавиша остановит сценарий\n' key
    if [ "$key" != 'y' ]; then
        exit 1
    fi
}

function check_ansible_present(){
    if which ansible-playbook 2>/dev/null; then
        return 0
    fi
    /usr/bin/dnf install ansible-core -y
    return $?
}

function Usage (){
    echo "$0 [опции] [команда]"
    echo "  Команды для данного скрипта обязательны, если команда не задана, то скрипт самостоятельно попытается определить параметры установки"
    printf "  ${RED}lsonly${NC} - установить только пакеты\n"
    printf "  ${RED}lsispfcgid${NC} - установить набор пакетов для ispmanager: nginx+httpd-prefork+mod_fcgid+suexec\n"
    printf "  ${RED}auto${NC} - автоматическое распознавание установки\n"
    printf "  ${RED}lsisp${NC} - обновить пакеты ispmanager в конфигурации по умолчанию для поддержки LS и LFS - обычно это: nginx+httpf-itk+cgi\n"
    echo "  Опции:"
    echo "   -s        - запустить скрипт без дополнительных вопросов и предупрежедений"
    echo "   -p        - отключить активацию hide pid для изоляции"
    echo "   -i        - включить активацию hide pid для изоляции"
    echo "   -v        - добавить больше информации о процессе установки"
    echo "   -d        - показать команду, которя будет выполняться для указанных параметров скрипта"
    echo "   -e        - добавить дополнительные параметры установки, один или несколько, через запятую."
    echo "      Доступные доп параметры:"
    echo "        prometheus - активировать сбор статистики для prometheus"
    echo " Пример вызова: $0 -p -e \"prometheus,none\" lsonly"
}

SILENT=0
VERBOSE=0
EXTENDED_OPTS=""
DRY_RUN=0
SCRIPT_NAME="msvsphere_integration_script"

PARAMS=()

check_priveleged_user
while getopts 'e:spvdi' VAL ; do
  case $VAL in 
    s ) SILENT=1 ;;
    p ) PARAMS+=("hidepid=0") ;;
    i ) PARAMS+=("hidepid=1") ;;
    v ) VERBOSE=1 ;;
    e ) EXTENDED_OPTS="$OPTARG" ;;
    d ) DRY_RUN=1 ;;
    * )
        Usage
        exit 0
    ;;
  esac
done
shift $((OPTIND-1))

INSTALL="$1"
if [ -z "$INSTALL" -o "$INSTALL" == "auto" ]; then
    INSTALL="lsonly"
    if [ -e /usr/local/mgr5/sbin/mgrctl ];then
        INSTALL="lsisp"
    fi
fi

case "$INSTALL" in
    lsonly)
        :
    ;;
    lsisp)
        PARAMS+=("ispmanager=1")
        if [ ! -e /usr/local/mgr5/sbin/mgrctl ];then
            show_error_with_exit "Не могу обнаружить установленный в системе ISPManager"
        fi
    ;;
    lsispfcgid)
        PARAMS+=("ispmanager=1")
        PARAMS+=("ispmanagerfcgid=1")
        if [ ! -e /usr/local/mgr5/sbin/mgrctl ];then
            show_error_with_exit "Не могу обнаружить установленный в системе ISPManager"
        fi
    ;;
    *)
        printf "${RED}Ошибка${NC}\n"
        printf "Скрипт не смог распознать параметры установки. Укажите параметры вручную\n"
        Usage
        exit 0
    ;;
esac

EXT_DATA=()
IFS=', ' read -r -a EXT_DATA <<< "$EXTENDED_OPTS"

for EXTENDED_OPTS_KEY in "${EXT_DATA[@]}"; do
    case "$EXTENDED_OPTS_KEY" in
        prometheus) PARAMS+=("prometheus=1") ;;
        *)
        :
        ;;
    esac
done

if [ "$SILENT" == "0" ]; then
    show_warning
fi
check_ansible_present

opts="${PARAMS[@]}"
verb=""
[ $VERBOSE -eq 0 ] || verb="-vvv"  
pushd /usr/local/msvhosting/
if [ -z "$verb" ];then
    if [ $DRY_RUN -eq 0 ];then
        /usr/bin/ansible-playbook -e "${opts}" /usr/local/msvhosting/${SCRIPT_NAME}.yml
    else
        echo "/usr/bin/ansible-playbook -e \"${opts}\" /usr/local/msvhosting/${SCRIPT_NAME}.yml"
    fi
else
    if [ $DRY_RUN -eq 0 ];then
        /usr/bin/ansible-playbook -e "${opts}" "${verb}" /usr/local/msvhosting/${SCRIPT_NAME}.yml
    else
        echo "/usr/bin/ansible-playbook -e \"${opts}\" ${verb} /usr/local/msvhosting/${SCRIPT_NAME}.yml"
    fi
fi
result=$?
popd
exit $result
