#!/usr/bin/sh
# Скрипт конфигурации для termidesk-assistant-server

[ ${TDSK_DEBUG} ] && set -x

DIALOG_BIN=$(which dialog)
DIALOG_ARGS="--colors --ascii-lines --keep-tite --stdout --clear"
DIALOG_HIDE="false"

TMPFILE=$(mktemp /tmp/termidesk-assistant-server.XXXXX)

# Сохраняем переменные окружения с более высоким приоритетом
for name in TDSK_CONFIG_DIR TDSK_LOG_SRV_DIR
do
    eval "value=\$${name}"
    [ -z "${value}" ] || echo "${name}=${value}" >> ${TMPFILE}
done

# Читаем env-файл и восстанавливаем переменные окружения
ENV_DEFAULT_FILE="/etc/default/termidesk-assistant-server"
[ -r ${ENV_DEFAULT_FILE} ] && . ${ENV_DEFAULT_FILE}
. ${TMPFILE}

CONFIG_DEFAULT_DIR="/etc/opt/termidesk-assistant"
CONFIG_DIR="${TDSK_CONFIG_DIR:-${CONFIG_DEFAULT_DIR}}"
CONFIG_NAME="assistant.conf"
CONFIG_FILE="${CONFIG_DIR}/${CONFIG_NAME}"

LOG_SRV_DEFAULT_DIR="/var/log/termidesk/assistant"
LOG_SRV_DIR="${TDSK_LOG_SRV_DIR:-${LOG_SRV_DEFAULT_DIR}}"

clean() {
    [ -r ${TMPFILE} ] && rm -f ${TMPFILE}
}

config_get() {
    local name="${1}"
    local default="${2}"
    local filename="${3:-${ENV_DEFAULT_FILE}}"
    local space="[[:space:]]*"
    local filter="^${space}${name}${space}=${space}(.*)"

    if [ -r ${filename} ]; then
        value=$(sed -n -E "s#${filter}#\1#ip" ${filename} | sed -e "s/${space}$//" -e "s/^[\"']//" -e "s/[\"']$//")
    fi

    # Return value or default
    echo ${value:-${default}}
}

config_set() {
    local name="${1}"
    local value="${2}"
    local filename="${3:-${ENV_DEFAULT_FILE}}"
    local filter="^[[:space:]]*${name}[[:space:]]*=.*"

    [ ! -r ${filename} ] && touch ${filename}

    if [ "$(grep -i -e "${filter}" ${filename})" ]; then
        sed -i -E "s#${filter}#${name}=${value}#i" ${filename}
    else
        echo "${name}=${value}" >> ${filename}
    fi
}

dialog_value() {
    local rn=${1} # Row Number
    awk "{if(NR==${rn}) print \$0}" ${TMPFILE}
}

# Функция валидации пути
validate_path() {
    local path="${1}"

    # Проверяем, что путь не пустой
    [ -z "${path}" ] && return 1

    # Проверяем, что путь начинается с /
    [ "$(echo "${path}" | cut -c1)" != "/" ] && return 1

    # Проверяем, что путь не содержит запрещенные символы
    echo "${path}" | grep -q '[[:space:]]' && return 1

    return 0
}

dialog_advanced() {
    local conf_dir=${CONFIG_DIR}
    local conf_file # Config file
    local log_dir="${TDSK_LOG_SRV_DIR:-$(config_get "LOG_DIR" "${LOG_SRV_DEFAULT_DIR}")}"
    local error_msg=""

    while true; do
        if [ -n "${error_msg}" ]; then
            ${DIALOG_BIN} ${DIALOG_ARGS} \
                --backtitle 'Termidesk Assistant Server Setup' \
                --title 'Ошибка валидации' \
                --msgbox "${error_msg}" 8 60
            error_msg=""
        fi

        ${DIALOG_BIN} ${DIALOG_ARGS} \
            --backtitle 'Termidesk Assistant Server Setup' \
            --title 'Настройки сервера' \
            --form "" 10 70 2 \
            "Каталог конфигурации" 1 1 "${conf_dir}" 1 25 40 0 \
            "Каталог журналов сервера" 2 1 "${log_dir}" 2 25 40 0 1>${TMPFILE}

        [ $? -eq 1 ] && return 1  # Press Cancel

        conf_dir=$(dialog_value 1)
        log_dir=$(dialog_value 2)

        # Валидация путей
        if ! validate_path "${conf_dir}"; then
            error_msg="Ошибка: Некорректный путь к каталогу конфигурации.\nПуть должен начинаться с / и не содержать пробелов."
            continue
        fi

        if ! validate_path "${log_dir}"; then
            error_msg="Ошибка: Некорректный путь к каталогу журналов.\nПуть должен начинаться с / и не содержать пробелов."
            continue
        fi

        break
    done

    # Создаем каталоги
    mkdir -p "${conf_dir}" || {
        ${DIALOG_BIN} ${DIALOG_ARGS} \
            --backtitle 'Termidesk Assistant Server Setup' \
            --title 'Ошибка' \
            --msgbox "Не удалось создать каталог конфигурации: ${conf_dir}" 8 60
        return 1
    }

    mkdir -p "${log_dir}" || {
        ${DIALOG_BIN} ${DIALOG_ARGS} \
            --backtitle 'Termidesk Assistant Server Setup' \
            --title 'Ошибка' \
            --msgbox "Не удалось создать каталог журналов: ${log_dir}" 8 60
        return 1
    }

    # Устанавливаем права доступа
    chown root:root "${conf_dir}"
    chmod 755 "${conf_dir}"

    chown termidesk-assistant:termidesk-assistant "${log_dir}" 2>/dev/null || chown root:root "${log_dir}"
    chmod 750 "${log_dir}"

    # Сохраняем настройки
    conf_file="${conf_dir}/${CONFIG_NAME}"
    config_set "TDSK_CONFIG_DIR" "${conf_dir}" "${ENV_DEFAULT_FILE}"
    config_set "LOG_DIR" "${log_dir}" "${conf_file}"

    return 0
}

dialog_setup() {
    local conf_dir
    local log_dir

    if [ "${DIALOG_HIDE}" = "true" ]; then
        # Тихий режим - используем значения по умолчанию
        # Создаем каталоги
        mkdir -p "${CONFIG_DIR}"
        mkdir -p "${LOG_SRV_DIR}"

        # Устанавливаем права доступа
        chown root:root "${CONFIG_DIR}"
        chmod 755 "${CONFIG_DIR}"

        chown termidesk-assistant:termidesk-assistant "${LOG_SRV_DIR}" 2>/dev/null || chown root:root "${LOG_SRV_DIR}"
        chmod 750 "${LOG_SRV_DIR}"

        # Сохраняем настройки
        config_set "TDSK_CONFIG_DIR" "${CONFIG_DIR}" "${ENV_DEFAULT_FILE}"
        config_set "LOG_DIR" "${LOG_SRV_DIR}" "${CONFIG_DIR}/${CONFIG_NAME}"
    else
        # Интерактивный режим
        dialog_advanced || return 1

        conf_dir=$(config_get "TDSK_CONFIG_DIR" "" "${ENV_DEFAULT_FILE}")
        log_dir=$(config_get "LOG_DIR" "" "${conf_dir}/${CONFIG_NAME}")

        # Показываем результат
        ${DIALOG_BIN} ${DIALOG_ARGS} \
            --backtitle 'Termidesk Assistant Server Setup' \
            --title 'Настройка завершена' \
            --msgbox "Настройки сохранены:\n\nTDSK_CONFIG_DIR: ${conf_dir}\nTDSK_LOG_SRV_DIR: ${log_dir}" 8 60
    fi
    return 0
}

# Проверяем права доступа
if [ "$(id -u)" != "0" ]; then
    echo "Этот скрипт должен запускаться с правами root"
    exit 1
fi

trap clean 0 1 2 5 15

if [ ! -r ${CONFIG_FILE} ] || [ ! -r ${ENV_DEFAULT_FILE} ]; then
    # Проверяем наличие dialog
    if [ -z "${DIALOG_BIN}" ]; then
        DIALOG_HIDE="true"
    fi
    if [ "${DEBIAN_FRONTEND}" != "noninteractive" ] && [ -n "${TDSK_SETUP_NONINTERACTIVE}" ]; then
         DIALOG_HIDE="true"
    fi
    dialog_setup
fi

