#!/bin/sh
# RadhikaChain: unirse a la red con un solo comando.
#
#     curl -fsSL https://descargas.radhikatmosphere.com/unirse | sh
#
# ── QUE INSTALA ──────────────────────────────────────────────────
#
#   radhika-unificado   UN binario con 54 modulos:
#                         escudo DharmaShield (XDP/eBPF)
#                         MCP para agentes
#                         webhooks x402
#                         PRANA + PoI
#                         minero PoK
#                         swaps atomicos
#                         metricas Prometheus
#
#   dharma-sensor       el filtro que corre EN la tarjeta de red
#
# ── POR QUE UN SOLO BINARIO ──────────────────────────────────────
#
# Deli: "compila cada uno de los binarios en uno solo para que sea
# necesario correrlos todos... con tan solo un comando".
#
# Y tiene razon: nadie contribuye a una red que exige arrancar
# cinco procesos y vigilarlos. Ademas, cuando las piezas viven
# separadas dejan de hablarse — nos paso con el vigilante de
# mempool y el ejecutor de arbitraje, que corrian en la misma
# maquina sin verse.
#
# ── QUE GANA QUIEN LO INSTALA ────────────────────────────────────
#
# Defender da karma. El karma afloja tu objetivo de PoK, asi que
# produces bloques con menos trabajo. No es altruismo: es el
# consenso.
set -e

SEED="${SEED:-172.233.188.169}"
BASE="${BASE:-http://$SEED:8420}"

echo "RadhikaChain — unirse a la red"
echo "==============================="
echo

ARQ=$(uname -m)
case "$ARQ" in
  x86_64)  SUF="x86_64" ;;
  aarch64) SUF="arm64"  ;;
  *) echo "arquitectura no soportada: $ARQ"; exit 1 ;;
esac
echo "  arquitectura: $ARQ"

IFAZ=$(ip route 2>/dev/null | awk '/^default/{print $5; exit}')
if [ -z "$IFAZ" ]; then
  echo "  no encuentro la interfaz de red por defecto"
  exit 1
fi
echo "  interfaz: $IFAZ"

# Requisitos reales, comprobados antes de tocar nada.
if [ "$(id -u)" != "0" ]; then
  echo "  hace falta root: el escudo carga un programa en el kernel"
  exit 1
fi

echo
echo "  --- descargando"
curl -fsSL "$BASE/radhika-unificado-$SUF" -o /tmp/radhika-unificado \
  || { echo "  no pude descargar el binario unificado"; exit 1; }
curl -fsSL "$BASE/dharma-sensor-$SUF" -o /tmp/dharma-sensor \
  || { echo "  no pude descargar el sensor"; exit 1; }

chmod 755 /tmp/radhika-unificado /tmp/dharma-sensor
mv /tmp/radhika-unificado /opt/radhika-unificado
mv /tmp/dharma-sensor /opt/dharma-sensor
echo "      /opt/radhika-unificado  $(stat -c%s /opt/radhika-unificado) bytes"
echo "      /opt/dharma-sensor      $(stat -c%s /opt/dharma-sensor) bytes"

# El secreto se pide al seed: sin el, los eventos no se aceptan y
# el nodo defiende sin que cuente para su karma.
mkdir -p /opt/secrets
if [ ! -f /opt/secrets/dharma_hmac ]; then
  curl -fsSL "$BASE/hmac_publico" -o /opt/secrets/dharma_hmac 2>/dev/null \
    || echo "publico" > /opt/secrets/dharma_hmac
  chmod 600 /opt/secrets/dharma_hmac
fi

echo
echo "  --- instalando servicios"

cat > /etc/systemd/system/radhika-unificado.service <<UNIT
[Unit]
Description=RadhikaChain unificado (escudo, MCP, x402, PRANA, minero)
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
Environment=PUERTO=8151
Environment=SEED=$SEED
ExecStart=/opt/radhika-unificado
Restart=always
RestartSec=10
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
UNIT

cat > /etc/systemd/system/dharma-xdp.service <<UNIT
[Unit]
Description=DharmaShield: filtro XDP en la tarjeta de red
After=network-online.target

[Service]
Type=simple
ExecStart=/bin/sh -c '/opt/dharma-sensor \\
  --iface $IFAZ \\
  --gate-url http://127.0.0.1:8151 \\
  --hmac-secret "\$(cat /opt/secrets/dharma_hmac)" \\
  --batch-size 5 \\
  --flush-interval-ms 2000'
Restart=always
RestartSec=15
AmbientCapabilities=CAP_BPF CAP_NET_ADMIN CAP_SYS_RESOURCE CAP_PERFMON
CapabilityBoundingSet=CAP_BPF CAP_NET_ADMIN CAP_SYS_RESOURCE CAP_PERFMON
LimitMEMLOCK=infinity

[Install]
WantedBy=multi-user.target
UNIT

systemctl daemon-reload
systemctl enable --now radhika-unificado >/dev/null 2>&1

# Un sensor viejo retiene el XDP y el nuevo no puede engancharse.
pkill -9 -f 'dharma-sensor.*radhikachain.xyz' 2>/dev/null || true
systemctl enable --now dharma-xdp >/dev/null 2>&1

echo
echo "  --- verificando (medimos el EFECTO, no que el proceso exista)"
sleep 12

UNIF=$(systemctl is-active radhika-unificado 2>/dev/null)
echo "      unificado: $UNIF"

if ip -details link show "$IFAZ" 2>/dev/null | grep -q 'prog/xdp'; then
  ID=$(ip -details link show "$IFAZ" | grep -oE 'prog/xdp id [0-9]+' | head -1)
  echo "      escudo:    ACTIVO ($ID)"
else
  echo "      escudo:    el proceso corre pero el XDP no engancho"
  echo "                 revisa: kernel con BPF y CAP_BPF"
fi

for R in /status /mcp /metrics; do
  C=$(curl -s -o /dev/null -w '%{http_code}' -m5 "http://127.0.0.1:8151$R" 2>/dev/null)
  echo "      $R: HTTP $C"
done

echo
echo "  Listo. Este nodo defiende la red y gana karma."
echo "  El karma afloja tu objetivo PoK: produces bloques con menos"
echo "  trabajo. Estado en: http://127.0.0.1:8151/status"
