#!/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 # Cargar configuración 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="/srv/ipfs/staging" LOG_DIR="/srv/ipfs/logs" LOG_FILE="${LOG_DIR}/pilot-sync-$(date +%Y%m%d-%H%M%S).log" mkdir -p "${STAGING_DIR}" "${LOG_DIR}" log() { local timestamp timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" echo "[${timestamp}] $*" | tee -a "${LOG_FILE}" } log "INFO: ========================================================" log "INFO: Iniciando Sincronización Piloto de Espejos MxOS" log "INFO: Destino: ${STAGING_DIR}" log "INFO: Log: ${LOG_FILE}" log "INFO: ========================================================" # 1. Fedora 43 Server Netinstall ISO y firmas FEDORA_ISO_DIR="${STAGING_DIR}/fedora/iso/43" mkdir -p "${FEDORA_ISO_DIR}" log "INFO: [1/6] Sincronizando Fedora 43 Server Netinstall ISO y CHECKSUM..." rsync -avP --contimeout=30 \ --include="Fedora-Server-netinst-x86_64-43-1.6.iso" \ --include="Fedora-Server-43-1.6-x86_64-CHECKSUM" \ --include="*.manifest" \ --exclude="*" \ rsync://dl.fedoraproject.org/fedora-linux-releases/43/Server/x86_64/iso/ \ "${FEDORA_ISO_DIR}/" 2>&1 | tee -a "${LOG_FILE}" # 2. Fedora 43 Everything Repodata FEDORA_REPODATA_DIR="${STAGING_DIR}/fedora/releases/43/Everything/x86_64/os/repodata" mkdir -p "${FEDORA_REPODATA_DIR}" log "INFO: [2/6] Sincronizando metadatos (repodata) de Fedora 43 Everything..." rsync -avP --contimeout=30 --delete-delay \ rsync://dl.fedoraproject.org/fedora-linux-releases/43/Everything/x86_64/os/repodata/ \ "${FEDORA_REPODATA_DIR}/" 2>&1 | tee -a "${LOG_FILE}" # 3. CentOS Stream 10 BaseOS Repodata CENTOS_REPODATA_DIR="${STAGING_DIR}/centos-stream/10-stream/BaseOS/x86_64/os/repodata" mkdir -p "${CENTOS_REPODATA_DIR}" log "INFO: [3/6] Sincronizando metadatos (repodata) de CentOS Stream 10 BaseOS..." BASE_URL="https://mirror.stream.centos.org/10-stream/BaseOS/x86_64/os/repodata" curl -4 -s "${BASE_URL}/repomd.xml" -o "${CENTOS_REPODATA_DIR}/repomd.xml" HREFS="$(grep -o 'href="repodata/[^"]*"' "${CENTOS_REPODATA_DIR}/repomd.xml" | cut -d'"' -f2 | sed 's|^repodata/||' || true)" for file in ${HREFS}; do log "INFO: Descargando CentOS metadato: ${file}" curl -4 -s -L "${BASE_URL}/${file}" -o "${CENTOS_REPODATA_DIR}/${file}" done # 4. Asegurar portal web y directorio nodo en la raíz de staging log "INFO: [4/6] Actualizando portal web y directorio nodo en la raíz de staging..." "${SCRIPT_DIR}/mxos-build-html.bash" >/dev/null 2>&1 || true # 5. Ingesta UnixFS por referencia con Filestore en Kubo log "INFO: [5/6] Ingestando grafo UnixFS en Kubo local (filestore --nocopy)..." ROOT_CID="$(ipfs add -r --nocopy --cid-version=1 --hash=sha2-256 -Q "${STAGING_DIR}")" log "INFO: Nuevo CID raíz generado: ${ROOT_CID}" # Pineo local para asegurar persistencia ipfs pin add "${ROOT_CID}" >/dev/null 2>&1 || true # 6. Actualización en Cloudflare DNSLink y replicación log "INFO: [6/6] Actualizando DNSLink en Cloudflare y replicando hacia web0.mx-os.mx..." "${SCRIPT_DIR}/mxos-dnslink-update.bash" "${ROOT_CID}" 2>&1 | tee -a "${LOG_FILE}" log "INFO: Replicando DAG hacia web0.mx-os.mx..." # shellcheck disable=SC2029 ipfs dag export "${ROOT_CID}" | ssh root@web0.mx-os.mx \ "ipfs --api=/ip4/127.0.0.1/tcp/5001 dag import" 2>&1 | tee -a "${LOG_FILE}" # Verificación final log "INFO: Verificando disponibilidad pública del espejo..." HTTP_CODE="$(curl -4 -s -o /dev/null -w "%{http_code}" "https://mirrors.mx-os.mx/index.html" || echo "ERR")" ISO_CODE="$(curl -4 -s -o /dev/null -w "%{http_code}" "https://mirrors.mx-os.mx/fedora/iso/43/Fedora-Server-43-1.6-x86_64-CHECKSUM" || echo "ERR")" log "INFO: https://mirrors.mx-os.mx/index.html -> HTTP ${HTTP_CODE}" log "INFO: https://mirrors.mx-os.mx/fedora/iso/43/CHECKSUM -> HTTP ${ISO_CODE}" echo "${ROOT_CID}" > "${STAGING_DIR}/.synced" log "INFO: ========================================================" log "INFO: Sincronización piloto finalizada exitosamente." log "INFO: CID raíz activo: ${ROOT_CID}" log "INFO: ========================================================"