#!/usr/bin/env bash
#
# Corre esto EN EL SERVIDOR DEL PANEL (no en el de Astra).
#
# Prepara un usuario SSH restringido SOLO para mantener el túnel desde
# el servidor de Astra (sin IP pública): ese usuario no puede abrir una
# sesión de shell ni ejecutar comandos — solo se le permite reenviar el
# puerto del túnel. Aunque alguien robara esa llave, no podría hacer
# nada más en este servidor.
#
# Uso:
#   sudo bash setup-astra-tunnel-server.sh
#
set -euo pipefail

TUNNEL_USER="astratunnel"
TUNNEL_PORT="8899"   # puerto en ESTE servidor donde va a "aparecer" Astra

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-server.sh"

log "Creando usuario restringido '$TUNNEL_USER'..."
if ! id "$TUNNEL_USER" &>/dev/null; then
    useradd -m -s /usr/sbin/nologin "$TUNNEL_USER"
else
    warn "El usuario '$TUNNEL_USER' ya existe, se reutiliza."
fi

HOME_DIR="/home/$TUNNEL_USER"
mkdir -p "$HOME_DIR/.ssh"
touch "$HOME_DIR/.ssh/authorized_keys"
chmod 700 "$HOME_DIR/.ssh"
chmod 600 "$HOME_DIR/.ssh/authorized_keys"
chown -R "$TUNNEL_USER":"$TUNNEL_USER" "$HOME_DIR/.ssh"

log "Restringiendo ese usuario en sshd (solo reenvío de puerto, sin shell)..."
SSHD_SNIPPET="/etc/ssh/sshd_config.d/astra-tunnel.conf"
mkdir -p /etc/ssh/sshd_config.d
cat > "$SSHD_SNIPPET" << EOF
# Usuario solo para el túnel SSH inverso de Astra — sin shell, sin
# ejecutar comandos, sin abrir puertos hacia OTRAS máquinas desde acá.
Match User ${TUNNEL_USER}
    AllowTcpForwarding yes
    X11Forwarding no
    PermitTunnel no
    GatewayPorts no
    ForceCommand echo 'Este usuario solo mantiene el tunel de Astra, no tiene shell.'
EOF

sshd -t || die "sshd_config quedó inválido, revisa $SSHD_SNIPPET"
systemctl reload sshd 2>/dev/null || systemctl reload ssh 2>/dev/null || \
    warn "No se pudo recargar sshd solo — corre 'systemctl reload sshd' (o 'ssh') a mano."

echo ""
echo "=================================================================="
log "Listo de este lado. Ahora falta:"
echo "=================================================================="
echo "  1) En el servidor de ASTRA, corre: sudo bash setup-astra-tunnel-client.sh"
echo "     Te va a pedir la IP/dominio de ESTE panel — dale este dato:"
THIS_IP="$(curl -s -4 ifconfig.me 2>/dev/null || hostname -I | awk '{print $1}')"
echo "       IP de este panel: ${THIS_IP:-<no se pudo detectar, usa la IP real>}"
echo "       Usuario del túnel: ${TUNNEL_USER}"
echo ""
echo "  2) Una vez conectado el túnel, agrega el servidor Astra en el"
echo "     dashboard (Streams (Astra) -> + Agregar servidor Astra) con:"
echo "       IP/host:  127.0.0.1"
echo "       Puerto:   ${TUNNEL_PORT}"
echo "     (así, aunque escribas 127.0.0.1, en realidad te conecta con"
echo "     el Astra remoto del otro lado del túnel)"
echo ""
