#!/bin/sh
# sc-update-agent.sh — actualiza el binario de streamchecker en un agente.
#
# Swap manual a propósito: NO usa install.sh --update, que regenera el unit
# desde su plantilla y en los equipos con -hwenc pierde el flag, cambia el User
# y les tira el dashboard. Acá el unit no se toca: solo cambia el binario.
#
# Se corre como root en el agente, en UNA sola sesión SSH (fail2ban corta el SSH
# si se abren varias conexiones seguidas):
#     ssh -t USUARIO@AGENTE 'curl -fsS http://10.20.1.229:7070/sc-update-agent.sh | sudo sh'
#
# Variables: SC_RELEASES (raíz del canal), SC_VERSION (versión exigida), SC_STAMP.
set -eu

# SC_VERSION: si se fija, el script ABORTA cuando el binario bajado no es esa
# versión — así un release a medio publicar no se instala a medias en la flota.
# Vacío = se instala lo que haya en el canal y solo se informa qué es.
VER="${SC_VERSION:-}"
REL="${SC_RELEASES:-http://10.20.1.229:7070/bin}/stable"
STAMP="${SC_STAMP:-$(date +%Y%m%d)}"

case "$(uname -m)" in
  x86_64)         P=linux-amd64 ;;
  aarch64|arm64)  P=linux-arm64 ;;
  *) echo "arquitectura no soportada: $(uname -m)"; exit 1 ;;
esac

BIN=$(command -v streamchecker 2>/dev/null || echo /usr/local/bin/streamchecker)
[ -x "$BIN" ] || { echo "no encuentro el binario ($BIN)"; exit 1; }

echo "== agente $(hostname) — $P =="
echo "   binario actual: $("$BIN" -version 2>&1 | head -1)  ($BIN)"

TMP=$(mktemp -d); trap 'rm -rf "$TMP"' EXIT
echo "== bajando $REL/streamchecker-$P =="
curl -fsS "$REL/streamchecker-$P"        -o "$TMP/sc"
curl -fsS "$REL/streamchecker-$P.sha256" -o "$TMP/sc.sha256"

WANT=$(cat "$TMP/sc.sha256")
GOT=$(sha256sum "$TMP/sc" | cut -d' ' -f1)
[ "$WANT" = "$GOT" ] || { echo "   SHA-256 no coincide: $GOT != $WANT — abortado"; exit 1; }
chmod 0755 "$TMP/sc"
NEW=$("$TMP/sc" -version 2>&1 | head -1)
echo "   sha ok — binario nuevo: $NEW"
if [ -n "$VER" ]; then
  case "$NEW" in *"$VER"*) ;; *) echo "   el binario bajado no es $VER — abortado"; exit 1 ;; esac
fi

echo "== swap (respaldo en $BIN.bak-$STAMP) =="
cp -a "$BIN" "$BIN.bak-$STAMP"
install -m 0755 "$TMP/sc" "$BIN"

UNIT=$(systemctl list-units --type=service --all --no-legend 'streamchecker*' | awk '{print $1; exit}')
UNIT=${UNIT:-streamchecker.service}
echo "== reiniciando $UNIT =="
systemctl restart "$UNIT"
sleep 5
systemctl is-active "$UNIT" || { echo "   NO levantó — rollback"; install -m0755 "$BIN.bak-$STAMP" "$BIN"; systemctl restart "$UNIT"; exit 1; }

echo "== verificación =="
echo "   corriendo: $("$BIN" -version 2>&1 | head -1)"
# El estado y el historial guardan la URL cruda: deben quedar solo para root.
ls -l /var/lib/streamchecker/ 2>/dev/null || true
# El unit no se tocó: se imprime para confirmarlo (ojo -hwenc en .40/.106).
systemctl show -p ExecStart --value "$UNIT" | head -1
# Corolario de no tocarlo: -pprof es para diagnosticar y sobrevive al update en
# silencio. Se avisa para que no quede encendido de forma permanente.
if systemctl show -p ExecStart --value "$UNIT" | grep -q -- ' -pprof'; then
  echo "   AVISO: este agente quedó con -pprof encendido (es de diagnóstico)."
  echo "          Apagalo con: sc-agent-pprof.sh --off"
fi
echo "== listo en $(hostname) =="
