#!/usr/bin/env bash
#
# Corre esto EN EL SERVIDOR DE ASTRA (el que NO tiene IP pública).
#
# Crea una llave SSH dedicada, un usuario local para correrlo, y un
# servicio systemd con autossh que mantiene abierto un túnel inverso
# hacia el servidor del panel — así el panel puede hablarle a Astra
# aunque Astra esté detrás de un router sin IP pública ni puertos
# abiertos, mientras Astra sí tenga salida normal a internet.
#
# Antes de correr esto: ya debiste correr en el servidor del PANEL
# el script setup-astra-tunnel-server.sh (te da la IP y el usuario
# que vas a necesitar aquí).
#
# Uso:
#   sudo bash setup-astra-tunnel-client.sh
#
set -euo pipefail

CLIENT_USER="astratunnel-client"
KEY_PATH="/home/${CLIENT_USER}/.ssh/id_ed25519"

log() { echo -e "\n\033[1;32m==> $1\033[0m"; }
warn() { echo -e "\033[1;33m[!] $1\033[0m"; }
die() { echo -e "\033[1;31m[ERROR] $1\033[0m"; exit 1; }

[ "$EUID" -eq 0 ] || die "Corre esto con sudo/root: sudo bash setup-astra-tunnel-client.sh"

if [ -f /etc/os-release ]; then . /etc/os-release; DISTRO_ID="$ID"; else die "No se detectó la distro"; fi
case "$DISTRO_ID" in
    debian|ubuntu) PKG_MANAGER="apt" ;;
    almalinux|rhel|centos|rocky) PKG_MANAGER="dnf" ;;
    *) die "Distro no soportada: $DISTRO_ID" ;;
esac

echo ""
read -rp "IP o dominio del servidor del PANEL: " PANEL_HOST
[ -z "$PANEL_HOST" ] && die "Necesito la IP/dominio del panel."
read -rp "Usuario del túnel en el panel [astratunnel]: " TUNNEL_USER
TUNNEL_USER="${TUNNEL_USER:-astratunnel}"
read -rp "Puerto SSH del panel [22]: " PANEL_SSH_PORT
PANEL_SSH_PORT="${PANEL_SSH_PORT:-22}"
read -rp "Puerto donde va a 'aparecer' Astra en el panel [8899]: " TUNNEL_PORT
TUNNEL_PORT="${TUNNEL_PORT:-8899}"

log "Instalando autossh..."
if [ "$PKG_MANAGER" = "apt" ]; then
    apt update -y && apt install -y autossh
else
    dnf install -y epel-release 2>/dev/null || true
    dnf install -y autossh
fi

log "Creando usuario local '$CLIENT_USER' para correr el túnel..."
if ! id "$CLIENT_USER" &>/dev/null; then
    useradd -m -s /usr/sbin/nologin "$CLIENT_USER"
else
    warn "El usuario '$CLIENT_USER' ya existe, se reutiliza."
fi

mkdir -p "$(dirname "$KEY_PATH")"
if [ ! -f "$KEY_PATH" ]; then
    log "Generando llave SSH dedicada para el túnel..."
    sudo -u "$CLIENT_USER" ssh-keygen -t ed25519 -f "$KEY_PATH" -N "" -C "astra-tunnel"
else
    warn "Ya existe una llave en $KEY_PATH, se reutiliza."
fi
chown -R "$CLIENT_USER":"$CLIENT_USER" "$(dirname "$KEY_PATH")"

PUB_KEY="$(cat "${KEY_PATH}.pub")"

echo ""
echo "=================================================================="
echo "Llave pública generada — hay que agregarla en el PANEL:"
echo "=================================================================="
echo "$PUB_KEY"
echo ""
read -rp "¿Quieres que la copie yo mismo al panel ahora (necesita que tengas acceso SSH normal a ese servidor)? [s/N]: " DO_COPY

if [ "$DO_COPY" = "s" ] || [ "$DO_COPY" = "S" ]; then
    read -rp "Usuario CON el que entras normal por SSH al panel (ej. root o tu usuario): " ADMIN_SSH_USER
    echo "$PUB_KEY" | ssh -p "$PANEL_SSH_PORT" "${ADMIN_SSH_USER}@${PANEL_HOST}" \
        "cat >> /home/${TUNNEL_USER}/.ssh/authorized_keys && chown ${TUNNEL_USER}:${TUNNEL_USER} /home/${TUNNEL_USER}/.ssh/authorized_keys && chmod 600 /home/${TUNNEL_USER}/.ssh/authorized_keys" \
        && log "Llave copiada al panel correctamente." \
        || warn "No se pudo copiar sola — pégala tú a mano en /home/${TUNNEL_USER}/.ssh/authorized_keys del panel."
else
    warn "Pégala tú a mano en el panel, en: /home/${TUNNEL_USER}/.ssh/authorized_keys"
fi

log "Creando el servicio systemd del túnel..."
cat > /etc/systemd/system/astra-tunnel.service << EOF
[Unit]
Description=Tunel SSH inverso hacia el panel (Astra sin IP publica)
After=network-online.target
Wants=network-online.target

[Service]
User=${CLIENT_USER}
ExecStart=/usr/bin/autossh -M 0 -N \\
    -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" \\
    -o "ExitOnForwardFailure yes" -o "StrictHostKeyChecking accept-new" \\
    -i ${KEY_PATH} \\
    -R 127.0.0.1:${TUNNEL_PORT}:127.0.0.1:8000 \\
    -p ${PANEL_SSH_PORT} ${TUNNEL_USER}@${PANEL_HOST}
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable astra-tunnel
systemctl restart astra-tunnel

sleep 3
if systemctl is-active --quiet astra-tunnel; then
    log "Túnel corriendo."
else
    warn "El servicio no quedó activo — revisa: journalctl -u astra-tunnel -e"
fi

echo ""
echo "=================================================================="
log "Prueba desde el servidor del PANEL (no aquí):"
echo "=================================================================="
echo "  curl -I http://127.0.0.1:${TUNNEL_PORT}"
echo ""
echo "Si responde algo de Astra, el túnel está funcionando. Ahí mismo en"
echo "el dashboard, agrega el servidor Astra con host=127.0.0.1,"
echo "puerto=${TUNNEL_PORT}."
echo ""
echo "Logs del túnel:  journalctl -u astra-tunnel -f"
echo ""
