#!/bin/bash
# lastact: arturo@2025-05-21
# desc: actualiza los ficheros hosts que contienen las URLs
# desc-ext: dentro de cada fichero aparece la URL para obtener el fichero actualizado

[[ "$(whoami)" != "root" ]] && \
echo "#> ${0}: Error. Se necesita ser root para actualizar las listas de URLs a bloquear" && \
exit 1

DIRBASE="/usr/share/vitalinux/hosts"
NAMEBASE="hosts.unified_hosts"
PATRON="https://raw.githubusercontent.com/StevenBlack/hosts/master"

# 0) Comprobamos que hay conexión con Inernet antes de tratar de descargar actualizaciones de ficheros de listados de hosts a bloquear:
_INTERNET="true"
if ! ping -c 1 www.google.com &> /dev/null; then
    echo "#> Error: No hay conexión con Internet. No podemos descargar y actualizar ${FICH}"
    _INTERNET="false"
fi
# 1) Creamos un archivo temporal para almacenar temporalmente los listados de hosts a actualizar:
_TMPFILE="$(mktemp).vx-blockhosts-update"
# 2) Comprobamos si el equipo dispone de un paquete de centro que incorpore sus propias URLs a bloquear:
HOSTS_CONF_CENTRO="/usr/share/vitalinux/blockhosts/hosts.vitalinux-centro"
EXITS_HOSTS_CONF_CENTRO="false"
[[ -f "${HOSTS_CONF_CENTRO}" ]] && EXITS_HOSTS_CONF_CENTRO="true" && \
echo "#> $(basename "${HOSTS_CONF_CENTRO}"): Existe fichero de URLs especificas del centro Vitalinux" || \
echo "#> $(basename "${HOSTS_CONF_CENTRO}"): Aviso de que no existe fichero de URLs específicas del centro Vitalinux"

function hosts_locales() {
    [[ ! -f "${1}" ]] && echo "#> Error: No existe ${1}. No hacemos nada" && return 1
    # Añadimos las resoluciones locales básicas:
    LISTA=(
        "127.0.1.1 $(hostname)"
    )
    _IPCACHE="$(crudini --get /etc/default/vx-dga-variables/vx-dga-variables-general.conf "" IPCACHE)"
    [[ "${_IPCACHE}" ]] && \
    LISTA+=(
        "${_IPCACHE} servidor.vitalinux"
        "${_IPCACHE} servidor.vx"
    )
    for _ELE in "${LISTA[@]}" ; do
        ! grep -qi "${_ELE}" "${1}" && \
        echo "#> Añadimos en $(basename "${1}"): ${_ELE}" && \
        echo "${_ELE}" >> "${1}"
    done
}

for FICH in $(ls "${DIRBASE}/${NAMEBASE}"*) ; do
    if "${_INTERNET}" ; then
        URL=$(grep -E "${PATRON}" "${FICH}" | grep -o 'https://[^ ]*')
        [[ "${URL}" ]] && wget -q -O "${_TMPFILE}" "${URL}"
        if (( $(wc -l "${_TMPFILE}" | awk '{print $1}') > 0 )) ; then
            cat "${_TMPFILE}" > "${FICH}"
            echo "#> $(basename "${FICH}"): URLs a bloquear actualizadas vía ${URL}"
            # Inicializamos el archivo temporal para la siguiente descarga, aunque wget ya lo haría:
            echo "" > "${_TMPFILE}"
        fi
    fi
    hosts_locales "${FICH}"
    # Añadimos las URLs especificadas de forma personal por cada centro educativo a través de su paquete de centro (p.e. CP de Alcorisa):
    if "${EXITS_HOSTS_CONF_CENTRO}" ; then
        cat "${HOSTS_CONF_CENTRO}" >> "${FICH}"
        echo "#> $(basename "${HOSTS_CONF_CENTRO}") => $(basename "${FICH}"): Añadidas URLs especificas del centro Vitalinux"
    fi
done

# Añadimos las URLs de Gambling de Vitalinux al final de los listados de hosts de gambling:
GAMBLING_VITALINUX="/usr/share/vitalinux/hosts/hosts.vitalinux-gambling"
for FICH in $(ls "${DIRBASE}/${NAMEBASE}"*gambling*) ; do
    cat "${GAMBLING_VITALINUX}" >> "${FICH}"
    echo "#> $(basename "${FICH}"): URLs de Gambling Vitalinux a bloquear añadidas $(basename "${GAMBLING_VITALINUX}")"
done

# Eliminamos el fichero temporal que almacenaba las URLs a actualizar:
rm -f "${_TMPFILE}"

exit 0