#!/bin/bash # Repone los assets que el crawl no capturo (404 en produccion, 200 en el origen). # # Entrada: lista de rutas absolutas (una por linea) sacada de los logs de nginx # del Hetzner. Origen: el Joomla local restaurado y aislado (127.0.0.1:8086), # por HTTP -- nunca copiando el filesystem, mismo principio que el crawl. # # Escribe en raw/ y en site/: raw/ es el archivo tal cual se capturo, site/ es # el arbol servible que sincroniza 80-sync-hetzner.sh. set -uo pipefail BASE=/home/rafa/joomla-migration/mirror-antiguo RUN=$(cat "$BASE/CURRENT_RUN") DIR=$BASE/runs/$RUN RAW=$DIR/raw/antiguo.feadulta.com SITE=$DIR/site/antiguo.feadulta.com ORIGEN=http://127.0.0.1:8086 IN=${1:-/tmp/assets404.txt} OUT=$DIR/logs/repone-assets-$(date -u +%Y%m%dT%H%M%SZ) [ -s "$IN" ] || { echo "no hay lista de entrada: $IN"; exit 1; } [ -d "$SITE" ] || { echo "no existe $SITE"; exit 1; } mkdir -p "$OUT" ok=0; fail=0; skip=0; ya=0 while IFS= read -r p; do [ -n "$p" ] || continue case "$p" in /%22*|*'"'*) echo "$p" >> "$OUT/descartados.txt"; skip=$((skip+1)); continue ;; esac dest="$RAW$p" if [ -f "$dest" ]; then echo "$p" >> "$OUT/ya-estaban.txt"; ya=$((ya+1)); continue; fi mkdir -p "$(dirname "$dest")" 2>/dev/null || { echo "$p" >> "$OUT/fallidos.txt"; fail=$((fail+1)); continue; } code=$(curl -s --path-as-is -m 30 -o "$dest.part" -w '%{http_code}' "$ORIGEN$p") if [ "$code" = "200" ] && [ -s "$dest.part" ]; then mv "$dest.part" "$dest" echo "$p" >> "$OUT/repuestos.txt"; ok=$((ok+1)) else rm -f "$dest.part" echo "$code $p" >> "$OUT/fallidos.txt"; fail=$((fail+1)) fi done < "$IN" echo "repuestos: $ok · fallidos: $fail · descartados: $skip · ya estaban: $ya" # --- escaneo de seguridad antes de copiar a site/ --- echo "== escaneo de PHP embebido en lo descargado ==" sospechosos=0 if [ -s "$OUT/repuestos.txt" ]; then while IFS= read -r p; do if head -c 4096 "$RAW$p" 2>/dev/null | grep -qa '> "$OUT/sospechosos.txt"; sospechosos=$((sospechosos+1)) fi done < "$OUT/repuestos.txt" fi echo " sospechosos: $sospechosos" if [ "$sospechosos" -gt 0 ]; then echo "ABORTADO: hay ficheros con PHP embebido. No se copian a site/." exit 1 fi # --- copia a site/ --- if [ -s "$OUT/repuestos.txt" ]; then while IFS= read -r p; do mkdir -p "$(dirname "$SITE$p")" cp -p "$RAW$p" "$SITE$p" done < "$OUT/repuestos.txt" fi echo "copiados a site/: $ok" echo "detalle en: $OUT"