762bf95dfd
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>
117 lines
4.3 KiB
Bash
Executable File
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
|