Files
brahman/scripts/migrate-to-arje.sh
sergio 762bf95dfd feat(arje): arje-absorb — absorbe otros inits a una Semilla brahman
Nuevo crate `crates/init/arje-absorb`: lee la configuración de un init
clásico y la traduce a una Tarjeta Semilla (Card JSON) con cada
servicio como hija genesis de arje-zero. El paso «absorber» de la
migración a arje — para no perder los servicios al cambiar de init.

- Absorbers: sysvinit (/etc/inittab), runit (runsvdir o /etc/sv),
  dinit (/etc/dinit.d), openrc (/etc/runlevels). Autodetección.
- Modelo intermedio ForeignService → Card vía brahman-card (validado).
- `--with-carmen`: agrega carmen-dm (gestor de login gráfico).
- CLI: --from/--root/--output/--label/--with-carmen. 24 tests, clippy
  limpio.

`scripts/migrate-to-arje.sh`: orquesta absorber → validar → (carmen:
compila+instala mirada dinámico) → install-arje-as-init.sh. El init
viejo queda intacto; arje se elige en GRUB. --dry-run no toca nada.

systemd no se absorbe (units no son texto trivial) — para systemd
sigue la capa de shims + seeds/arje-host.card.json.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 00:40:34 +00:00

117 lines
4.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# migrate-to-arje.sh — migra una máquina de su init actual a arje,
# absorbiendo su configuración de servicios.
#
# QUÉ HACE:
# 1. Compila arje-absorb (host).
# 2. Autodetecta el init actual (o --from) y absorbe sus servicios en
# una Tarjeta Semilla (out/arje-absorbed.card.json por default).
# 3. (--with-carmen) agrega carmen-dm —el gestor de login gráfico— a
# la Semilla y compila+instala mirada-compositor y mirada-greeter.
# 4. Pasa la Semilla a install-arje-as-init.sh, que instala arje en
# paralelo a tu init actual, con su propia entrada GRUB.
#
# Tu init actual queda INTACTO y sigue siendo el default — arje se elige
# en GRUB. Revertir: sudo scripts/uninstall-arje.sh
#
# systemd NO se absorbe (sus units no son un formato de texto trivial);
# para systemd usá install-arje-as-init.sh con seeds/arje-host.card.json.
# Este script cubre sysvinit / runit / dinit / OpenRC.
#
# USO:
# sudo scripts/migrate-to-arje.sh [opciones]
# --from <init> sysvinit|runit|dinit|openrc|auto (def: auto)
# --with-carmen agrega el escritorio carmen como gestor de login
# --seed-out <f> dónde escribir la Semilla absorbida
# (def: out/arje-absorbed.card.json)
# --dry-run absorbe y valida, sin instalar nada (no necesita root)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
FROM="auto"
WITH_CARMEN=0
DRY_RUN=0
SEED_OUT="$REPO_DIR/out/arje-absorbed.card.json"
while [ "$#" -gt 0 ]; do
case "$1" in
--from) FROM="${2:?--from necesita un valor}"; shift 2 ;;
--with-carmen) WITH_CARMEN=1; shift ;;
--seed-out) SEED_OUT="${2:?--seed-out necesita un valor}"; shift 2 ;;
--dry-run) DRY_RUN=1; shift ;;
-h|--help)
cat <<'USAGE'
migrate-to-arje.sh — migra una máquina a arje absorbiendo su init actual.
--from <init> sysvinit|runit|dinit|openrc|auto (def: auto)
--with-carmen agrega el escritorio carmen como gestor de login
--seed-out <f> dónde escribir la Semilla absorbida
--dry-run absorbe y valida sin instalar (no necesita root)
USAGE
exit 0 ;;
*) echo "[migrate] opción desconocida: $1 (usá --help)" >&2; exit 2 ;;
esac
done
cd "$REPO_DIR"
if [ "$DRY_RUN" -eq 0 ] && [ "$(id -u)" -ne 0 ]; then
echo "[migrate] hace falta root para instalar — o corré con --dry-run" >&2
exit 1
fi
echo "[migrate] paso 1/4: compilar arje-absorb"
cargo build --quiet --release -p arje-absorb
ABSORB="$REPO_DIR/target/release/arje-absorb"
echo "[migrate] paso 2/4: absorber el init actual (--from $FROM)"
mkdir -p "$(dirname "$SEED_OUT")"
ABSORB_ARGS=(--from "$FROM" --output "$SEED_OUT" --label "arje.seed.migrated")
[ "$WITH_CARMEN" -eq 1 ] && ABSORB_ARGS+=(--with-carmen)
"$ABSORB" "${ABSORB_ARGS[@]}"
echo "[migrate] Semilla escrita en: $SEED_OUT"
bash "$REPO_DIR/seeds/validate.sh" "$SEED_OUT"
if [ "$DRY_RUN" -eq 1 ]; then
cat <<EOF
[migrate] --dry-run: Semilla absorbida y validada en
$SEED_OUT
Revisala y, cuando quieras instalar:
sudo scripts/install-arje-as-init.sh "$SEED_OUT"
EOF
exit 0
fi
if [ "$WITH_CARMEN" -eq 1 ]; then
echo "[migrate] paso 3/4: compilar e instalar carmen (compositor + greeter)"
# carmen enlaza mesa/libdrm/libinput/libseat — se compila con el
# target del host (glibc dinámico), NO musl: esta máquina ya tiene
# esas librerías. Sólo el PID 1 y los shims van musl-static al initrd.
cargo build --quiet --release -p mirada-compositor -p mirada-greeter
install -m 0755 "$REPO_DIR/target/release/mirada-compositor" /usr/bin/mirada-compositor
install -m 0755 "$REPO_DIR/target/release/mirada-greeter" /usr/bin/mirada-greeter
echo " mirada-compositor y mirada-greeter instalados en /usr/bin/"
else
echo "[migrate] paso 3/4: carmen omitido (sin --with-carmen)"
fi
echo "[migrate] paso 4/4: instalar arje como init"
"$SCRIPT_DIR/install-arje-as-init.sh" "$SEED_OUT"
cat <<EOF
[migrate] HECHO. arje quedó instalado en paralelo a tu init actual.
- Semilla migrada: $SEED_OUT → /ente/seed.card.json
- tu init actual sigue siendo el default; arje se elige en GRUB.
Para arrancar arje una vez en el próximo boot:
sudo grub-reboot "arje (init=/sbin/arje-zero) — kernel \$(uname -r)"
sudo reboot
Revertir todo:
sudo scripts/uninstall-arje.sh
EOF