#!/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

# URLs aportadas por cada centro específico para su bloqueo personal:
FICH_BLOQUEO_CENTRO="/usr/share/vitalinux/hosts/hosts.vitalinux-centro"
# URLs aportadas por los centros para el bloqueo general:
FICH_BLOQUEO_CENTRO_GENERAL="/usr/share/vitalinux/hosts/hosts.vitalinux-general"
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"

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
    # Añadimos las URLs añadidas a través de otros paquetes, centro o comunidad vitalinux:
    for FICH_BLOQUEO in "/usr/share/vitalinux/hosts/hosts.vitalinux-"* ; do
        if [[ -f "${FICH_BLOQUEO}" ]] ; then
            cat "${FICH_BLOQUEO}" >> "${1}" && \
            echo "#> $(basename "${FICH_BLOQUEO}"): URLs específicas de ${FICH_BLOQUEO##*-} añadidas a $(basename "${1}")"
        fi
    done
    # # Añadimos las URLs que el centro haya decidido bloquear:
    # if [[ -f "${FICH_BLOQUEO_CENTRO}" ]] ; then
    #     cat "${FICH_BLOQUEO_CENTRO}" >> "${1}" && \
    #     echo "#> $(basename "${FICH_BLOQUEO_CENTRO}"): URLs específicas del centro añadidas a $(basename "${1}")"
    # fi
    # # Añadimos las URLs aportadas por los centros para el bloqueo específico
    # if [[ -f "${FICH_BLOQUEO_CENTRO_GENERAL}" ]] ; then
    #     cat "${FICH_BLOQUEO_CENTRO_GENERAL}" >> "${1}" && \
    #     echo "#> $(basename "${FICH_BLOQUEO_CENTRO_GENERAL}"): URLs de aportadas por los centros añadidas a $(basename "${1}")"
    # fi
}

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}"
done

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

exit 0