#!/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() { local timestamp timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" echo "[${timestamp}] $*" } log "==========================================================" log " Sincronización y Publicación Maestra de Espejos MxOS" log " Sesión tmux: mxos-sync" log " Destino: ${STAGING_DIR}" log "==========================================================" # ------------------------------------------------------------------- # Paso 1: Sincronizar ISOs completas (Fedora Server/Workstation + CentOS) # ------------------------------------------------------------------- log "==> [1/6] Sincronizando medios de instalación ISO..." # 1.1 CentOS Stream 10 ISOs centos_iso_dest="${STAGING_DIR}/centos-stream/10-stream/iso" mkdir -p "${centos_iso_dest}" log "INFO: Descargando CentOS Stream 10 ISOs (boot + dvd)..." c10_base="https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/iso" for iso_file in \ CentOS-Stream-10-latest-x86_64-boot.iso \ CentOS-Stream-10-latest-x86_64-boot.iso.SHA256SUM \ CentOS-Stream-10-latest-x86_64-boot.iso.manifest \ CentOS-Stream-10-latest-x86_64-dvd1.iso \ CentOS-Stream-10-latest-x86_64-dvd1.iso.SHA256SUM \ CentOS-Stream-10-latest-x86_64-dvd1.iso.manifest; do log " -> ${iso_file}..." curl -sL -C - --retry 5 --retry-delay 3 "${c10_base}/${iso_file}" -o "${centos_iso_dest}/${iso_file}" done # 1.2 Fedora ISOs (Server Netinst + Server DVD + Workstation Live) for ver in 43 44 45; do f_dest="${STAGING_DIR}/fedora/iso/${ver}" mkdir -p "${f_dest}" up_prefix="releases" if [[ "${ver}" == "45" ]]; then up_prefix="development" fi log "INFO: Sincronizando Fedora ${ver} Server ISOs (netinst + DVD)..." rsync -avP --contimeout=30 --timeout=60 \ --include="*.iso" --include="*CHECKSUM*" --include="*.manifest" --exclude="*" \ "rsync://dl.fedoraproject.org/fedora-linux-${up_prefix}/${ver}/Server/x86_64/iso/" \ "${f_dest}/" || true log "INFO: Sincronizando Fedora ${ver} Workstation Live ISOs..." rsync -avP --contimeout=30 --timeout=60 \ --include="*.iso" --include="*CHECKSUM*" --include="*.manifest" --exclude="*" \ "rsync://dl.fedoraproject.org/fedora-linux-${up_prefix}/${ver}/Workstation/x86_64/iso/" \ "${f_dest}/" || true done # ------------------------------------------------------------------- # Paso 2: Finalizar descarga de Fedora 45 Everything con 10 descargas paralelas # ------------------------------------------------------------------- log "==> [2/6] Descargando Fedora 45 Everything (10 paquetes simultáneos)..." f45_dest="${STAGING_DIR}/fedora/releases/45/Everything/x86_64/os" mkdir -p "${f45_dest}" dnf5 --setopt=max_parallel_downloads=10 \ --repofrompath="f45-everything,https://dl.fedoraproject.org/pub/fedora/linux/development/45/Everything/x86_64/os/" \ --repo="f45-everything" reposync \ --download-metadata \ --norepopath \ --destdir="${f45_dest}" # ------------------------------------------------------------------- # Paso 3: Compilar documentación Sphinx y portales HTML # ------------------------------------------------------------------- log "==> [3/6] Compilando documentación técnica Sphinx y portal principal..." sphinx-build -W -b html "${REPO_ROOT}/docs" "${REPO_ROOT}/docs/_build/html" mkdir -p "${STAGING_DIR}/docs" cp -rf "${REPO_ROOT}/docs/_build/html/"* "${STAGING_DIR}/docs/" "${SCRIPT_DIR}/mxos-build-html.bash" "${SCRIPT_DIR}/mxos-sizes.bash" --update-readme # ------------------------------------------------------------------- # Paso 4: Asegurar bloques web en el almacén interno de Kubo # ------------------------------------------------------------------- log "==> [4/6] Resguardando recursos web y herramientas en el repositorio local de Kubo..." ipfs add --cid-version=1 \ "${REPO_ROOT}/index.html" \ "${REPO_ROOT}/README.html" ipfs add -r --cid-version=1 "${REPO_ROOT}/vigia" ipfs add -r --cid-version=1 "${REPO_ROOT}/nodo" ipfs add -r --cid-version=1 "${STAGING_DIR}/docs" # ------------------------------------------------------------------- # Paso 5: Ingesta UnixFS filestore en Kubo # ------------------------------------------------------------------- log "==> [5/6] Ingesta UnixFS filestore sobre ${STAGING_DIR}..." ROOT_CID="$(ipfs add -r --nocopy --cid-version=1 --hash=sha2-256 -Q "${STAGING_DIR}")" log " CID raíz generado: ${ROOT_CID}" ipfs pin add "${ROOT_CID}" || true if ipfs files stat /mxos-root >/dev/null 2>&1; then ipfs files rm -r /mxos-root fi ipfs files cp "/ipfs/${ROOT_CID}" /mxos-root # ------------------------------------------------------------------- # Paso 6: Publicación en Cloudflare DNSLink, IPNS y réplica en web0 # ------------------------------------------------------------------- log "==> [6/6] Publicando en DNSLink, IPNS y replicando a web0..." "${SCRIPT_DIR}/mxos-dnslink-update.bash" "${ROOT_CID}" || true "${SCRIPT_DIR}/mxos-ipns-publish.bash" "${ROOT_CID}" || true # shellcheck disable=SC2029 ssh root@web0.mx-os.mx "ipfs --api=/ip4/127.0.0.1/tcp/5001 swarm connect /ip4/192.168.1.100/tcp/4001/p2p/$(ipfs id -f='') || true" # shellcheck disable=SC2029 ssh root@web0.mx-os.mx "ipfs --api=/ip4/127.0.0.1/tcp/5001 pin add ${ROOT_CID}/docs ${ROOT_CID}/index.html ${ROOT_CID}/README.html ${ROOT_CID}/vigia ${ROOT_CID}/nodo" || true log "==========================================================" log " Sincronización y publicación completadas con éxito." log " CID activo: ${ROOT_CID}" log "=========================================================="