#!/bin/bash
# version: [arturo@2019-12-12]
# Parseamos el Json de configuración de centro y llamamos a los scripts correspondientes:

# Importamos las funciones Bash
FICHFUNCS="/usr/bin/vx-funcs-bash"
[ -f "${FICHFUNCS}" ] && . "${FICHFUNCS}"

FICHFUNCSUSERS="/usr/bin/vx-funcs-users"
[ -f "${FICHFUNCSUSERS}" ] && . "${FICHFUNCSUSERS}"

USUGRAFICO="$(vx-usuario-grafico)"
GRUPOSUSUGRAFICO="$(id -Gn "${USUGRAFICO}")"

function vx-echo-titulo() {
    # Titulo con las siguientes características:
    # 1) En azul y negrita
    # 2) Titulo parpadeante
    # 3) Intertido el color y su background
    echo -e "\e[34m\e[1m\e[7m${1}\e[0m"
}

echo_azul="vx-colorear_echo_azul_negrita"
echo_rojo="vx-colorear_echo_rojo_negrita"
echo_verde="vx-colorear_echo_verde_negrita"
echo_titulo="vx-echo-titulo"

function mensaje() {
    "${echo_azul}" "=> $(date) - ${1}"
}

function check_cids_etiquetas_usuarios_grupos() {
    NUMERO="${1}"
    CIDSCENTRO="${2}"
    # De las etiquetas del centro eliminamos el sufijo ";" del final para evitar errores:
    ETIQUETASCENTRO="${3%;}"
    EXCLUIDOS="${4%;}"
    DESC="${5:-"Parametro a configurar"}"
    ALLOW_USERS="${6:-"null"}"
    ALLOW_GROUPS="${7:-"null"}"
    DENY_USERS="${8:-"null"}"
    DENY_GROUPS="${9:-"null"}"

    # Tenemos en cuenta la igualdad de cuentas: alumno|estudiante, profesor|docente
    [[ ";${ALLOW_USERS};" =~ \;alumno|estudiante\; ]] && \
    ALLOW_USERS="alumno;estudiante;${ALLOW_USERS}"
    [[ ";${ALLOW_USERS};" =~ \;profesor|docente\; ]] && \
    ALLOW_USERS="profesor;docente;${ALLOW_USERS}"
    [[ ";${DENY_USERS};" =~ \;alumno|estudiante\; ]] && \
    DENY_USERS="alumno;estudiante;${DENY_USERS}"
    [[ ";${DENY_USERS};" =~ \;profesor|docente\; ]] && \
    DENY_USERS="profesor;docente;${DENY_USERS}"
    
    "${echo_azul}" "=> ($(($NUMERO + 1))) {${DESC}} Chequeamos: CIDs, Etiquetas, excluidos ...
    ## Mi CID: ${MIGASCID}
    - CIDs-Centro donde aplicar: ${CIDSCENTRO}
    ## Mis Etiquetas: ${ETIQUETAS}
    - Etiquetas-Centro donde aplicar: ${ETIQUETASCENTRO}
    ## Equipos Excluidos: ${EXCLUIDOS}
    ## Usuario Gráfico: ${USUGRAFICO}
    - Usuarios|Grupos Permitidos: ${ALLOW_USERS//null/todos}|${ALLOW_GROUPS//null/todos}
    - Usuarios|Grupos Excluidos: ${DENY_USERS//null/ninguno}|${DENY_GROUPS//null/ninguno}"
    
    # Chequeamos que el usuario gráfico esta incluido:
    if ! [[ "${ALLOW_USERS}" == "null" || \
            "${ALLOW_USERS}" == "all" || \
        ";${ALLOW_USERS};" =~ \;${USUGRAFICO}\; ]] ; then
        "${echo_rojo}" "=> El equipo esta excluido para este usuario gráfico (3) ..."
        return 1
    fi
    # Chequeamos si el usuario gráfico esta excluido:
    if [[ "${DENY_USERS}" != "null" && ";${DENY_USERS};" =~ \;${USUGRAFICO}\; ]] \
    || [[ "${DENY_USERS}" == "all" ]] ; then
        "${echo_rojo}" "=> El usuario gráfico esta excluido y no se realizará ninguna acción (5) ..."
        return 1
    fi
    # Chequeamos que alguno de los grupos del usuario gráfico esta incluido:
    if ! [[ "${ALLOW_GROUPS}" == "null" || \
        "${ALLOW_GROUPS}" == "all" ]] ; then
        EXCLUIR="true"
        for GRUPO in ${GRUPOSUSUGRAFICO} ; do
            [[ ";${ALLOW_GROUPS};" =~ \;${GRUPO}\; ]] && EXCLUIR="false"
        done
        "${EXCLUIR}" && \
        "${echo_rojo}" "=> El equipo esta excluido por los grupos del usuario gráfico (4) ..." && \
        return 1
    fi
    # Chequeamos si alguno de los grupos del usuario gráfico esta excluido:
    EXCLUIR="false"
    [[ "${DENY_GROUPS}" == "all" ]] && EXCLUIR="true"
    if [[ "${DENY_GROUPS}" != "null" ]] ; then
        for GRUPO in ${GRUPOSUSUGRAFICO} ; do
            [[ ";${DENY_GROUPS};" =~ \;${GRUPO}\; ]] && EXCLUIR="true"
        done
    fi
    "${EXCLUIR}" && \
    "${echo_rojo}" "=> El equipo esta excluido por los grupos del usuario gráfico (6) ..." && \
    return 1
    
    # Comprobamos si el equipo esta incluido por CID o etiquetado Migasfree:
    if [[ ";${EXCLUIDOS};" =~ \;${MIGASCID}\; || \
        "${ETIQUETAS}" =~ ${EXCLUIDOS//;/|} ]] ; then
        "${echo_rojo}" "=> El equipo esta excluido (1) ..."
        return 1
    fi
    
    if [[ ";${CIDSCENTRO};" =~ \;${MIGASCID}\;|all ]] || \
    [[ ";${ETIQUETASCENTRO};" =~ \;all\; ]] || \
    [[ "${ETIQUETAS}" =~ ${ETIQUETASCENTRO//;/|} ]] ; then
        "${echo_verde}" "=> El equipo esta incluido ..."
        return 0
    else
        "${echo_rojo}" "=> El equipo esta excluido (2) ..."
        return 1
    fi
}

function check_parametro() {
    PARAM="${1}"
    NUM=$(jq ".${PARAM} | length" "${FICHCONFJSON}" 2> /dev/null || echo "0")
    [ -z "${NUM}" ] && NUM="0"
    CONT=0
    (( NUM > 0 )) && echo "=> Personalización [${2}]: ${NUM}"
    while (( ${CONT} < ${NUM} )) && [[ ${NUM} =~ ^[[:digit:]]*$ ]] ; do
        # Los CIDS recibidos deben estar separados por ";"
        CIDSCENTRO="$(jq -r ".${PARAM}[${CONT}] | .cids" "${FICHCONFJSON}")"
        # Las ETIQUETAS recibidas deben estar separadas por ";"
        ETIQUETASCENTRO="$(jq -r ".${PARAM}[${CONT}] | .etiquetas" "${FICHCONFJSON}")"
        # Comprobamos los excluidos:
        EXCLUIDOS="$(jq -r ".${PARAM}[${CONT}] | .excluidos" "${FICHCONFJSON}")"
        # Obtenemos una Descripción de lo que se va a configurar:
        DESC="$(jq -r ".${PARAM}[${CONT}] | .desc" "${FICHCONFJSON}")"
        # Obtenemos la lista de usuarios y grupos de la sesión gráfica en que debe configurarse:
        ALLOW_USERS="$(jq -r ".${PARAM}[${CONT}] | .users" "${FICHCONFJSON}")"
        ALLOW_GROUPS="$(jq -r ".${PARAM}[${CONT}] | .groups" "${FICHCONFJSON}")"
        DENY_USERS="$(jq -r ".${PARAM}[${CONT}] | .\"users-excluidos\"" "${FICHCONFJSON}")"
        DENY_GROUPS="$(jq -r ".${PARAM}[${CONT}] | .\"groups-exluidos\"" "${FICHCONFJSON}")"
        if check_cids_etiquetas_usuarios_grupos \
        "${CONT}" "${CIDSCENTRO}" "${ETIQUETASCENTRO}" "${EXCLUIDOS}" "${DESC}" \
        "${ALLOW_USERS}" "${ALLOW_GROUPS}" "${DENY_USERS}" "${DENY_GROUPS}" ; then
            "${3}" "${PARAM}" "${CONT}"
        fi
        ((CONT++))
    done
}

# Comprobamos que el usuario root es el que llama al script:
MENSAJE="Debes ser el root para ejecutar este script de configuración de centro"
[[ "$(whoami)" != "root" ]] && \
{
    mensaje "${MENSAJE}" && exit 1 ;
} || \
echo "=> Ok: Configuramos el equipo de centro como usuario \"root\""

# 0) Preparamos la auditoria de la configuración de centro:
[[ "$(LC_ALL=C type -t "vx-log_xsession")" == "function" ]] && \
FICHLOG="vx-conf-pre-centro.log" && \
vx-log_xsession -o "${FICHLOG}" && \
"${echo_azul}" "## $(date) ##\nAuditoria de configuración de centro ${CENTRO}: ${FICHLOG}\n##"

# 1) Comprobamos que hay un archivo Json de personalización de centro:
MENSAJE="No existe ningún fichero Json de personalización de centro"
FICHCONFJSON="/usr/share/vitalinux/conf-centro/vx-centro.conf.json"
[ ! -f "${FICHCONFJSON}" ] && \
{
    mensaje "${MENSAJE}" && exit 1 ;
} || \
"${echo_verde}" "=> Usamos como fichero Json de configuración de centro: ${FICHCONFJSON}"

CENTRO="$(jq -r ".centro" "${FICHCONFJSON}")"
[ -z "${CENTRO}" ] && exit 1 || \
echo "=> Centro: ${CENTRO}"

# 2) Comprobamos las etiquetas y CID del equipo:
"${echo_azul}" "=> Comprobamos las etiquetas y CID del equipo ..."
FICHTAGS="/tmp/migasfree.tags"
if [ ! -f "${FICHTAGS}" ] ; then
    # Durante 2 minutos tratamos de obtener las etiquetas:
    CONT=0
    EXITO=0
    while (( CONT < 24 )) && (( EXITO == 0)) ; do
        if ETIQUETAS="$(migasfree-tags -g)" ; then
            # Comprobamos que hemos recibido etiquetas Migasfree válidas:
            (( ${#ETIQUETAS} < 3 )) && ((CONT++)) && \
            echo "=> Problema para obtener las etiquetas: intento ${CONT}" && \
            continue
            # En caso de haber recibido etiquetas válidas continuamos:
            EXITO=1
            echo -n "${ETIQUETAS}" | sed 's/"//g' > "${FICHTAGS}" && \
            echo "=> Etiquetas Migasfree guardas correctamente en: ${FICHTAGS}"
        else
            echo "=> Intento ${CONT}: Problemas para obtener las etiquetas de Migasfree ..."
        fi
        sleep 5
        ((CONT++))
    done
    (( EXITO == 0 )) && \
    echo "Problemas para obtener las etiquetas de Migasfree ... Salimos!!" && exit 1
fi
[ -f "${FICHTAGS}" ] && ETIQUETAS="$(sed 's/"//g' "${FICHTAGS}")" || exit 1

# Comprobamos que ETIQUETAS no esta vácio, y por tanto, tiene al menos una etiqueta de centro:
(( ${#ETIQUETAS} < 3 )) && \
echo "=> El equipo no tiene etiquetas Migasfree, salimos antes de tiempo." && \
exit 0

echo "=> Etiquetas Migasfree: ${ETIQUETAS}"

if test -f "/usr/bin/migasfree-cid" ; then
    MIGASCID=$(/usr/bin/migasfree-cid)
fi
echo "=> CID: ${MIGASCID}"

# 3) Lanzamos los scripts de personalización de centro:

DIRSCRIPTS="/usr/share/vitalinux/conf-centro/scripts-funcs"
if [ -d "${DIRSCRIPTS}" ] ; then
    for SCRIPT in "${DIRSCRIPTS}/"*.sh ; do
        . "${SCRIPT}"
    done
fi

## FIN de la Configuración de Centro ##
echo "=> $(date) - FIN de la Configuración de Centro"