#!/bin/bash
# ============================================================
# generate_cl_zones.sh
# Ubicación: /home/httpupdate/public_html/GeoIP/
# Genera múltiples archivos csf.allow desde LACNIC,
# uno por cada perfil de puertos definido.
# ============================================================

set -euo pipefail

# --- PERFILES ---
# Formato: "nombre_archivo:puertos"
# Agregar, quitar o modificar líneas según necesidad.
# Cada línea genera un archivo: cl-{nombre}.allow
#
# Ejemplo resultante:
#   cl-cpanel.allow      → tcp|in|d=2083,2087|s=CIDR
#   cl-cpanel-full.allow → tcp|in|d=2083,2087,2096|s=CIDR
#   cl-mysql.allow       → tcp|in|d=3306|s=CIDR

PROFILES=(
    "cpanel:2083,2087"
    "cpanel-web:80,443"
    "cpanel-full:2083,2087,2096"
    "mysql:3306"
)

# --- CONFIGURACIÓN GENERAL ---
LACNIC_URL="https://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest"
BASE_DIR="/home/httpupdate/public_html/GeoIP"
RAW_FILE="${BASE_DIR}/.lacnic-raw.txt"
CIDR_FILE="${BASE_DIR}/.cl-cidrs.txt"
LOG_FILE="${BASE_DIR}/update.log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# --- Descarga LACNIC (una sola vez) ---
log "Descargando delegaciones LACNIC..."
if ! curl -sf --max-time 60 -o "$RAW_FILE" "$LACNIC_URL"; then
    log "ERROR: Fallo descarga LACNIC"
    exit 1
fi

RAW_LINES=$(wc -l < "$RAW_FILE")
if [ "$RAW_LINES" -lt 1000 ]; then
    log "ERROR: Archivo sospechosamente pequeño ($RAW_LINES líneas)"
    exit 1
fi

# --- Extraer CIDRs chilenos (una sola vez) ---
awk -F'|' '
$2 == "CL" && $3 == "ipv4" && $4 != "" && $5 != "" {
    ip = $4
    count = $5
    prefix = 32
    n = count
    while (n > 1) {
        n = n / 2
        prefix--
    }
    print ip "/" prefix
}
' "$RAW_FILE" > "$CIDR_FILE"

CIDR_COUNT=$(wc -l < "$CIDR_FILE")
if [ "$CIDR_COUNT" -lt 50 ]; then
    log "ERROR: Solo $CIDR_COUNT CIDRs, algo falló"
    rm -f "$RAW_FILE" "$CIDR_FILE"
    exit 1
fi

log "CIDRs Chile extraídos: $CIDR_COUNT rangos"

# --- Generar un archivo por perfil ---
for PROFILE in "${PROFILES[@]}"; do
    NAME="${PROFILE%%:*}"
    PORTS="${PROFILE##*:}"
    OUTPUT_FILE="${BASE_DIR}/cl-${NAME}.allow"

    TEMP_FILE=$(mktemp)

    cat > "$TEMP_FILE" <<EOF
# ============================================================
# CIDRs Chile (CL) - Fuente: LACNIC
# Perfil: ${NAME}
# Generado: $(date '+%Y-%m-%d %H:%M:%S')
# Puertos: ${PORTS}
# NO EDITAR - generado por generate_cl_zones.sh
# ============================================================
EOF

    while IFS= read -r cidr; do
        echo "tcp|in|d=${PORTS}|s=${cidr} # CL-LACNIC" >> "$TEMP_FILE"
    done < "$CIDR_FILE"

    mv "$TEMP_FILE" "$OUTPUT_FILE"
    log "Perfil [${NAME}]: $CIDR_COUNT rangos, puertos: ${PORTS} → cl-${NAME}.allow"
done

# --- Limpiar ---
rm -f "$RAW_FILE" "$CIDR_FILE"

log "OK: ${#PROFILES[@]} perfiles generados"
