#!/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 MIRRORS_STAGING_DIR="${MIRRORS_STAGING_DIR:-$HOME/.local/share/mxos-mirrors/staging}" MIRRORS_LOG_DIR="${MIRRORS_LOG_DIR:-$HOME/.local/share/mxos-mirrors/logs}" FEDORA_UPSTREAM_RSYNC="${FEDORA_UPSTREAM_RSYNC:-rsync://dl.fedoraproject.org/pub/fedora/linux}" CENTOS_UPSTREAM_RSYNC="${CENTOS_UPSTREAM_RSYNC:-rsync://mirror.stream.centos.org/centos-stream}" log() { local level="$1" shift local timestamp timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" echo "{\"timestamp\":\"${timestamp}\",\"level\":\"${level}\",\"message\":\"$*\"}" } usage() { cat << USAGE Uso: $0 [OPCIONES] Sincroniza repositorios oficiales de software libre hacia el directorio de staging local. Opciones: -d, --distro Distribución a sincronizar (predeterminado: all) -n, --dry-run Simula la sincronización sin transferir datos -t, --target Directorio de destino de staging (predeterminado: ${MIRRORS_STAGING_DIR}) -h, --help Muestra este mensaje de ayuda USAGE exit 1 } sync_fedora() { local target_dir="$1" local dry_run_flag="$2" local fedora_target="${target_dir}/fedora" log "INFO" "Iniciando sincronización de Fedora hacia ${fedora_target}..." mkdir -p "${fedora_target}" # En modo prueba de concepto inicial, sincronizamos metadatos y estructura local rsync_cmd=( rsync -avSHP --delete-delay --delay-updates --exclude="*.iso" --exclude="*.raw.xz" --exclude="debug/" --exclude="source/" --timeout=60 ) if [[ "${dry_run_flag}" == "true" ]]; then rsync_cmd+=("--dry-run") fi rsync_cmd+=( "${FEDORA_UPSTREAM_RSYNC}/releases/43/Everything/x86_64/os/repodata" "${fedora_target}/releases/43/Everything/x86_64/os/" ) log "INFO" "Ejecutando: ${rsync_cmd[*]}" "${rsync_cmd[@]}" || log "WARN" "Sincronización parcial o simulada de Fedora." } sync_centos() { local target_dir="$1" local dry_run_flag="$2" local centos_target="${target_dir}/centos-stream" log "INFO" "Iniciando sincronización de CentOS Stream hacia ${centos_target}..." mkdir -p "${centos_target}" local rsync_cmd=( rsync -avSHP --delete-delay --delay-updates --exclude="*.iso" --exclude="debug/" --exclude="source/" --timeout=60 ) if [[ "${dry_run_flag}" == "true" ]]; then rsync_cmd+=("--dry-run") fi rsync_cmd+=( "${CENTOS_UPSTREAM_RSYNC}/10-stream/BaseOS/x86_64/os/repodata" "${centos_target}/10-stream/BaseOS/x86_64/os/" ) log "INFO" "Ejecutando: ${rsync_cmd[*]}" "${rsync_cmd[@]}" || log "WARN" "Sincronización parcial o simulada de CentOS Stream." } sync_web_portal() { local target_dir="$1" log "INFO" "Sincronizando portal web y herramientas nodo hacia staging..." rm -rf "${target_dir}/README.rst" \ "${target_dir}/logo.svg" \ "${target_dir}/guardianes.json" \ "${target_dir:?}/bin" \ "${target_dir}/config" \ "${target_dir:?}/etc" \ "${target_dir}/systemd" 2>/dev/null || true for doc in README.html index.html; do if [[ -f "${REPO_ROOT}/${doc}" ]]; then cp -f "${REPO_ROOT}/${doc}" "${target_dir}/${doc}" fi done if [[ -d "${REPO_ROOT}/nodo" ]]; then mkdir -p "${target_dir}/nodo" cp -rf "${REPO_ROOT}/nodo/"* "${target_dir}/nodo/" fi if [[ -d "${REPO_ROOT}/docs/_build/html" ]]; then mkdir -p "${target_dir}/docs" cp -rf "${REPO_ROOT}/docs/_build/html/"* "${target_dir}/docs/" fi if [[ -d "${REPO_ROOT}/vigia" ]]; then mkdir -p "${target_dir}/vigia" cp -rf "${REPO_ROOT}/vigia/"* "${target_dir}/vigia/" fi } main() { local distro="all" local dry_run="false" local target="${MIRRORS_STAGING_DIR}" while [[ $# -gt 0 ]]; do case "$1" in -d|--distro) distro="$2" shift 2 ;; -n|--dry-run) dry_run="true" shift ;; -t|--target) target="$2" shift 2 ;; -h|--help) usage ;; *) echo "Opción desconocida: $1" >&2 usage ;; esac done mkdir -p "${target}" "${MIRRORS_LOG_DIR}" sync_web_portal "${target}" case "${distro}" in fedora) sync_fedora "${target}" "${dry_run}" ;; centos) sync_centos "${target}" "${dry_run}" ;; all) sync_fedora "${target}" "${dry_run}" sync_centos "${target}" "${dry_run}" ;; *) echo "Distribución no válida: ${distro}" >&2 exit 1 ;; esac log "INFO" "Sincronización upstream finalizada exitosamente." } main "$@"