#!/usr/bin/env bash
# validate-access.sh — prova que dá para entrar no servidor.
#
# Abre uma conexão NOVA e independente (sem reaproveitar sessão multiplexada) e
# retorna usuário efetivo, distribuição, versão, privilegio e tempo de resposta.
#
# Este script é a pré-condição de tudo que endurece o servidor: nenhum caminho de
# acesso pode ser fechado antes de este script ter passado para o usuário novo.
#
# Uso: validate-access.sh --host <ip> --user <usuário> [--port 22] [--key <caminho>]
#
# Saída: linhas chave=valor. Código 0 quando o acesso funciona.

set -uo pipefail

HOST=""; USER_NAME=""; PORT=22; KEY_PATH=""

while [ $# -gt 0 ]; do
  case "$1" in
    --host) HOST="$2"; shift 2 ;;
    --user) USER_NAME="$2"; shift 2 ;;
    --port) PORT="$2"; shift 2 ;;
    --key)  KEY_PATH="$2"; shift 2 ;;
    *) echo "argumento desconhecido: $1" >&2; exit 2 ;;
  esac
done

[ -n "$HOST" ] && [ -n "$USER_NAME" ] || { echo "ERRO: --host e --user são obrigatórios" >&2; exit 2; }

# ControlMaster=no de propósito: precisa ser conexão nova, não sessão reaproveitada.
SSH_OPTS=(
  -o BatchMode=yes
  -o StrictHostKeyChecking=accept-new
  -o ForwardAgent=no
  -o ConnectTimeout=10
  -o ControlMaster=no
  -o ControlPath=none
  -p "$PORT"
)
[ -n "$KEY_PATH" ] && SSH_OPTS+=(-i "${KEY_PATH/#\~/$HOME}" -o IdentitiesOnly=yes)

REMOTE='
  echo "user=$(id -un)"
  echo "uid=$(id -u)"
  if [ -r /etc/os-release ]; then . /etc/os-release; echo "os_family=${ID}"; echo "os_version=${VERSION_ID}"; fi
  if sudo -n true 2>/dev/null; then echo "sudo=nopasswd"; elif sudo -v 2>/dev/null; then echo "sudo=password"; else echo "sudo=não"; fi
  echo "hostname=$(hostname)"
  echo "uptime_s=$(cut -d. -f1 /proc/uptime 2>/dev/null || echo 0)"
'

START=$(date +%s%3N 2>/dev/null || echo $(($(date +%s) * 1000)))
OUT=$(ssh "${SSH_OPTS[@]}" "${USER_NAME}@${HOST}" "$REMOTE" 2>&1)
CODE=$?
END=$(date +%s%3N 2>/dev/null || echo $(($(date +%s) * 1000)))

if [ $CODE -ne 0 ]; then
  echo "access=falhou"
  echo "exit_code=${CODE}"
  echo "---- saída bruta ----"
  printf '%s\n' "$OUT"
  echo "---------------------"
  case "$OUT" in
    *"Permission denied"*)
      echo "causa_provavel=a chave não está instalada no usuário ${USER_NAME}" ;;
    *"Connection refused"*)
      echo "causa_provavel=nada escutando na porta ${PORT}; serviço de SSH parado ou porta diferente" ;;
    *"Connection timed out"*|*"Operation timed out"*)
      echo "causa_provavel=servidor inacessível; ainda ligando, desligado, ou firewall bloqueando" ;;
    *"REMOTE HOST IDENTIFICATION HAS CHANGED"*)
      echo "causa_provavel=a identidade do servidor mudou; a máquina foi recriada com o mesmo endereco" ;;
    *"Name or service not known"*)
      echo "causa_provavel=endereco não resolvido; confira o domínio ou use o IP" ;;
    *)
      echo "causa_provavel=indeterminada; leia a saída bruta acima" ;;
  esac
  exit 1
fi

printf '%s\n' "$OUT"
echo "access=ok"
echo "latency_ms=$((END - START))"
exit 0
