#!/bin/bash
# desc: Ejecutar Tareas Programadas de personalización del centro:
# lastact: arturo@2022-6-21

FICHFUNCS="/usr/bin/vx-funcs-bash"
[ -f "${FICHFUNCS}" ] && . "${FICHFUNCS}" "null"

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

echo_azul="vx-colorear_echo_azul_negrita"
echo_rojo="vx-colorear_echo_rojo_negrita"
echo_verde="vx-colorear_echo_verde_negrita"

# Mostramos la ayuda si se pasa como parámetro -h o --help:
# fechaset y nvecesejecutada serán null y 0 por defecto, no se pasan como parámetros
AYUDA="Script encargado de ejecutar tareas programadas.  Son necesarios los siguientes parámetros (los dos primeros en ese orden):"
AYUDA+="\n# Los parámetros fechaset y nvecesejecutada serán null y 0 por defecto, no se pasan en la llamada a vx-tarea-programada #"
AYUDA+="\n1) Ruta del Fichero INI"
AYUDA+="\n2) Nombre de la Sección a crear dentro del Fichero INI"
AYUDA+="\n3) Una Descripción de la tarea programada"
AYUDA+="\n4) Fecha de inicio de ejecución de la tarea. Formato: día => 2022-5-7 07:31:41 o día y hora => 2022-5-7 07:31:41"
AYUDA+="\n5) Fecha de fin de ejecución de la tarea. Formato igual que la de inicio."
AYUDA+="\n6) Número de veces que debe ejecutarse la tarea. Un valor null indica ejecutarse una única vez a partir de la fecha de inicio."
AYUDA+="\n7) Tarea o comando a ejecutar."
EJEMPLOS=("${0} \"/etc/default/vx-dga-variables/vx-centro.conf.ini\" \"LimpiezaEquipos\" \"desc=Descripción de la tarea\" \"fechaini=2022-5-7 07:31:41\" \"fechafin=null\" \"nveces=null\" \"tarea=vx-limpieza 1 5:docente:estudiante\"")
(vx-check_need_help "${1}" || [[ -z "${1}" ]]) &&
    vx-show_help "${0}" "${AYUDA}" "${EJEMPLOS[@]}" &&
    exit 0

# Preparamos la auditoria referente a la limpieza:
LOG="vx-tarea-programada.log"
vx-log_xsession -o "${LOG}"

function crear_fichini() {
    if ! crudini --get "${FICHINI}" "${SECCION}" >/dev/null 2>&1; then
        crudini --set "${FICHINI}" "${SECCION}" &&
            echo "=> ${FICHINI}: Se ha creado la sección: ${SECCION}"
    else
        echo "=> ${FICHINI}: Ya existe la sección: ${SECCION}"
    fi
    until [[ -z "${1}" ]]; do
        CLAVE="${1/=*/}"
        VALOR="${1/*=/}"
        if ! VARLORINI="$(crudini --get "${FICHINI}" "${SECCION}" "${CLAVE}" 2>/dev/null)"; then
            crudini --set "${FICHINI}" "${SECCION}" "${CLAVE}" "${VALOR}" &&
                echo "=> ${FICHINI}: Se ha insertado ${CLAVE}:${VALOR}"
        else
            echo "=> ${FICHINI}: Ya existen ${CLAVE}:${VARLORINI}"
        fi
        shift
    done
}

function ejecutar_tarea() {
    [[ ! -f "${FICHINI}" ]] &&
        echo "=> No existe el archivo de variables de configuración de centro: ${FICHINI}" &&
        echo "=> Vamos a crear: ${FICHINI}" && touch "${FICHINI}"
    crear_fichini "${SECCION}" "${@}" "nvecesejecutada=0" "fechaset=null"

    # Rescatamos valores del fichero INI una vez formado:
    FECHAINI="$(crudini --get "${FICHINI}" "${SECCION}" "fechaini")"
    FECHAFIN="$(crudini --get "${FICHINI}" "${SECCION}" "fechafin")"
    NVECES="$(crudini --get "${FICHINI}" "${SECCION}" "nveces")"
    DESC="$(crudini --get "${FICHINI}" "${SECCION}" "desc")"
    TAREA="$(crudini --get "${FICHINI}" "${SECCION}" "tarea")"

    # Hacemos cálculos con fechas tipo unix-timestamps (segundos desde 1.1.1970 0:0:0) para saber si toca ejecutar la tarea:
    TODAY="$(date "+%Y-%m-%d %H:%M:%S")"
    TODAYMS="$(date -d "${TODAY}" "+%s")"
    # FECHAINI=$(crudini --get "${FICHINI}" "${SECCION}" "fechaini")
    FECHAINIMS="$(date -d "${FECHAINI}" "+%s")"
    [[ ${TODAYMS} -lt ${FECHAINIMS} ]] &&
        echo "=> No ha llegado el día para ejecutar la tarea programada ${TAREA}: ${TODAY} < ${FECHAINI}" &&
        return 0
    # Comprobamos la fecha final para la ejecución de la tarea:
    # FECHAFIN=$(crudini --get "${FICHINI}" "${SECCION}" "fechafin")
    if [[ "${FECHAFIN}" != "null" ]]; then
        FECHAFINMS="$(date -d "${FECHAFIN}" "+%s")"
        [[ ${TODAYMS} -gt ${FECHAFINMS} ]] &&
            echo "=> Ha pasado el intérvalo de días para ejecutar la tarea programada ${TAREA}: ${TODAY} < ${FECHAINI}" &&
            return 0
    fi

    # Comprobamos si la tarea se ha ejecutado previamente para no volverla a ejectutar, en caso de que no deba ejecutarse multiples veces:
    # Comprobamos si ya se ha realizado la acción comprobando fechaset, y el numero de veces que debe ejecutarse con nveces y nvecesejecutada:
    FECHASET="$(crudini --get "${FICHINI}" "${SECCION}" "fechaset")"
    NVECESEJECUTADA="$(crudini --get "${FICHINI}" "${SECCION}" "nvecesejecutada")"
    [[ "${NVECES}" != "all" ]] &&
        ([[ "${FECHASET}" != "null" ]] && [[ "${NVECES}" == "null" || "${NVECESEJECUTADA}" -ge "${NVECES}" ]]) &&
        echo "=> Ya se completó la tarea programada ${TAREA}: ${FECHASET}" &&
        return 0

    # Ejecutamos la tarea:
    TAREAOK="false"
    if eval "${TAREA}"; then
        TAREAOK="true"
        "${echo_verde}" "=> ¡¡Ok!! Tarea programada configurada correctamente: ${TAREA}:${FECHAINI}:${FECHAFIN}"
    else
        "${echo_rojo}" "=> ¡¡Error!! Problemas para configurar la tarea programada: ${TAREA}:${FECHAINI}:${FECHAFIN}"
    fi

    # Asignamos fechaset para indicar que se ha ejecutado la acción:
    "${TAREAOK}" &&
        crudini --set "${FICHINI}" "${SECCION}" "fechaset" "${TODAY}" &&
        crudini --set "${FICHINI}" "${SECCION}" "nvecesejecutada" "$((NVECESEJECUTADA + 1))" &&
        return 0
    return 1
}

FICHINI="${1}"
SECCION="${2}"
shift 2
ejecutar_tarea "${@}"
