#!/usr/bin/bash set -euo pipefail IFS=$'\n\t' SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [[ -d "${SCRIPT_DIR}/../../.git" ]] || [[ -f "${SCRIPT_DIR}/../../nodo/config/etc/mirrors.env" ]]; then REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" else REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" fi if [[ -f "${REPO_ROOT}/nodo/config/etc/mirrors.env" ]]; then # shellcheck source=/dev/null source "${REPO_ROOT}/nodo/config/etc/mirrors.env" elif [[ -f "${REPO_ROOT}/config/etc/mirrors.env" ]]; then # shellcheck source=/dev/null source "${REPO_ROOT}/config/etc/mirrors.env" elif [[ -f "${REPO_ROOT}/etc/mirrors.env" ]]; then # shellcheck source=/dev/null source "${REPO_ROOT}/etc/mirrors.env" fi STAGING_DIR="${MIRRORS_STAGING_DIR:-$HOME/ipfs/staging}" LOG_DIR="${MIRRORS_LOG_DIR:-$HOME/ipfs/logs}" mkdir -p "${STAGING_DIR}" "${LOG_DIR}" LOG_FILE="${LOG_DIR}/fedora-updates-sync-$(date +%Y%m%d-%H%M%S).log" log() { local timestamp timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" echo "[${timestamp}] $*" | tee -a "${LOG_FILE}" } sync_update_repo() { local ver="$1" local dest_x86="${STAGING_DIR}/fedora/linux/updates/${ver}/Everything/x86_64" local url="https://dl.fedoraproject.org/pub/fedora/linux/updates/${ver}/Everything/x86_64/" local repo_id="f${ver}-updates" mkdir -p "${dest_x86}" local retries=3 local attempt=1 while [[ ${attempt} -le ${retries} ]]; do log "INFO: Sincronizando Fedora ${ver} Updates desde ${url} (intento ${attempt}/${retries})..." if dnf5 --setopt=max_parallel_downloads="${MAX_PARALLEL_DOWNLOADS:-10}" \ --setopt=minrate="${DNF_MINRATE:-1024}" \ --setopt=timeout="${DNF_TIMEOUT:-120}" \ --repofrompath="${repo_id},${url}" \ --repo="${repo_id}" reposync \ --download-metadata \ --norepopath \ --destdir="${dest_x86}" \ --delete 2>&1 | tee -a "${LOG_FILE}"; then log "INFO: Sincronización exitosa de Fedora ${ver} Updates." break fi log "WARN: Intento ${attempt} de reposync falló por inestabilidad de red. Reintentando en 10s..." sleep 10 ((attempt++)) if [[ ${attempt} -gt ${retries} ]]; then log "ERROR: Se superó el límite de reintentos para Fedora ${ver}." return 1 fi done # Crear enlaces de conveniencia y retrocompatibilidad local compat_os="${dest_x86}/os" if [[ ! -e "${compat_os}" ]]; then ln -s "." "${compat_os}" fi local compat_link="${STAGING_DIR}/fedora/linux/updates/${ver}/x86_64" if [[ ! -e "${compat_link}" ]]; then ln -s "Everything/x86_64" "${compat_link}" log "INFO: Enlace de compatibilidad creado: ${compat_link} -> Everything/x86_64" fi } main() { log "==========================================================" log " Inicio de Sincronización de Actualizaciones Fedora (updates)" log " Destino: ${STAGING_DIR}/fedora/linux/updates" log " Log: ${LOG_FILE}" log "==========================================================" # 1. Fedora 43 Updates (~60 GB) sync_update_repo "43" # 2. Fedora 44 Updates (~53 GB) sync_update_repo "44" # 3. Fedora 45 Updates (0 GB, inicialización de metadatos) sync_update_repo "45" log "INFO: Actualizaciones sincronizadas. Regenerando tamaños y portales..." "${SCRIPT_DIR}/mxos-build-html.bash" 2>&1 | tee -a "${LOG_FILE}" log "INFO: Ingesta UnixFS desacoplada y publicación en IPFS..." local root_cid root_cid="$("${SCRIPT_DIR}/mxos-mirror-ingest.bash" --nocopy "${STAGING_DIR}")" log "INFO: Nuevo CID raíz: ${root_cid}" log "INFO: Actualizando DNSLink y publicando IPNS..." "${SCRIPT_DIR}/mxos-dnslink-update.bash" "${root_cid}" 2>&1 | tee -a "${LOG_FILE}" || true "${SCRIPT_DIR}/mxos-ipns-publish.bash" "${root_cid}" 2>&1 | tee -a "${LOG_FILE}" || true log "INFO: Enclavillando activos web esenciales en web0.mx-os.mx..." # shellcheck disable=SC2029 ssh root@web0.mx-os.mx "ipfs --api=/ip4/127.0.0.1/tcp/5001 pin add ${root_cid}/index.html ${root_cid}/README.html ${root_cid}/docs ${root_cid}/cover.jpg" || true ssh root@web0.mx-os.mx "systemctl restart ipfs" || true log "==========================================================" log " Sincronización de Fedora Updates completada con éxito." log " CID activo: ${root_cid}" log "==========================================================" } main "$@"