la jaula no viajaba en NINGUNA imagen: bwrap y harkaq-exec entran a perfil.base
Mudando `api.sergio.gioser.net` a la caja de produccion, `takana qorpa provision` aborto:
Error: no encuentro harkaq-exec en /root/.cache/harkaq/harkaq-exec
construilo: gcc -O1 -Wall -static -o ... scripts/harkaq/harkaq-exec.c
El mensaje es bueno y la receta que propone es IMPOSIBLE de seguir: en una caja instalada no hay
gcc, ni `scripts/`, ni arbol de desarrollo. El binario solo existia como un `gcc` a mano en la
cache de `$HOME` del hub, o sea que la jaula del ADR 0015 funcionaba unicamente en la maquina
donde alguien la habia compilado.
Y su companero estaba igual, medido en `build-state.json`: `bwrap` sellado desde hace meses con
`"perfiles": []` — CERO perfiles. Lo invocan por PATH tanto `qorpa` como el sandbox de
`takana build` (`takana-build/src/sandbox.rs`), asi que **ninguna imagen de takana podia enjaular
nada, ni construir**. Es [[subcomando-sin-driver]] un piso mas abajo: el CLI que los llama viaja
en todas las imagenes y sus herramientas en ninguna.
Tres piezas:
· `recipes/harkaq-exec.toml` — nueva. Estatico musl, `b3:cd34954f...`, 269 K. El pin va al commit
que toco la FUENTE (`1d9ddcee`, 2026-09-03) y no a HEAD: el `.c` no se mueve desde entonces y el
repo commitea cada media hora por el cron de la cosecha — pinear HEAD re-hashearia la receta cada
media hora sin que su fuente cambiara. La fuente sigue en `scripts/harkaq/` y no en un arbol
propio porque tres scripts la compilan desde ahi y dos copias divergen en silencio.
· `qorpa.rs` — busca el binario tambien en `/usr/bin`, que es de donde sale en cualquier maquina
que no sea el hub. El orden es HARKAQ_BIN (lo que el operador declara) → arbol de desarrollo →
paquete, para que un cambio en la jaula se pruebe sin instalar nada. Y el error ya nombra las
dos salidas, no solo la del hub.
· `targets.toml` — los dos en `perfil.base`.
Medido en la caja de produccion tras aplicarlos: `bwrap 0.11.0` + harkaq-exec responden, y
`takana qorpa provision sergioh-api` instala python 3.14.7 con pacman DENTRO de la jaula
(`[harkaq] jaula puesta: ABI 9`). El 3.14 no es casualidad: el venv de gioser trae extensiones
`cpython-314-...-gnu.so`, asi que la imagen de Arch pineada da la misma serie.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -834,15 +834,33 @@ struct Grants {
|
||||
seal_image: bool,
|
||||
}
|
||||
|
||||
/// Dónde vive `harkaq-exec`. Misma convención que el harkaq del build (`HARKAQ_BIN`).
|
||||
/// Dónde vive `harkaq-exec`. Misma convención que el harkaq del build (`HARKAQ_BIN`), **más el
|
||||
/// binario instalado**, que es el caso de cualquier máquina que no sea el hub de desarrollo.
|
||||
///
|
||||
/// ⚠ MEDIDO el 2026-09-15 en la caja de producción: sólo se buscaba en `~/.cache/harkaq`, o sea en
|
||||
/// la caché de quien lo hubiera compilado a mano. En una caja instalada no hay `gcc`, ni `scripts/`,
|
||||
/// ni caché — así que `qorpa` abortaba con una instrucción imposible de seguir y la jaula del ADR
|
||||
/// 0015 funcionaba únicamente en la máquina donde alguien la había construido. Ahora
|
||||
/// `recipes/harkaq-exec.toml` lo publica en `/usr/bin` y va declarado en `perfil.base`.
|
||||
///
|
||||
/// El orden es deliberado: lo que el operador declara (`HARKAQ_BIN`) gana, después el árbol de
|
||||
/// desarrollo —para que un cambio en la jaula se pruebe sin instalar nada—, y el paquete al final.
|
||||
/// Si no está ninguno se devuelve el primer candidato, que es el que nombra el error.
|
||||
fn harkaq_exec() -> PathBuf {
|
||||
std::env::var("HARKAQ_BIN")
|
||||
.map(PathBuf::from)
|
||||
.unwrap_or_else(|_| {
|
||||
PathBuf::from(std::env::var("HOME").unwrap_or_else(|_| "/root".into()))
|
||||
.join(".cache/harkaq")
|
||||
})
|
||||
.join("harkaq-exec")
|
||||
if let Ok(dir) = std::env::var("HARKAQ_BIN") {
|
||||
return PathBuf::from(dir).join("harkaq-exec");
|
||||
}
|
||||
let cache = PathBuf::from(std::env::var("HOME").unwrap_or_else(|_| "/root".into()))
|
||||
.join(".cache/harkaq")
|
||||
.join("harkaq-exec");
|
||||
if cache.exists() {
|
||||
return cache;
|
||||
}
|
||||
let instalado = PathBuf::from("/usr/bin/harkaq-exec");
|
||||
if instalado.exists() {
|
||||
return instalado;
|
||||
}
|
||||
cache
|
||||
}
|
||||
|
||||
/// Las capabilities que hacen que el uid 0 de adentro sea root DE VERDAD.
|
||||
@@ -1616,8 +1634,11 @@ fn run_instance(
|
||||
let exec = harkaq_exec();
|
||||
if !exec.exists() {
|
||||
bail!(
|
||||
"no encuentro harkaq-exec en {} — la instancia NO va a correr enjaulada y eso no se \
|
||||
hace en silencio.\n construilo: gcc -O1 -Wall -static -o {} scripts/harkaq/harkaq-exec.c\n o corré con --no-jail si sabés lo que estás haciendo.",
|
||||
"no encuentro harkaq-exec en {} ni en /usr/bin — la instancia NO va a correr \
|
||||
enjaulada y eso no se hace en silencio.\n instalalo: está en `perfil.base` como \
|
||||
receta `harkaq-exec`; en una caja instalada, `takana upgrade`.\n o construilo: \
|
||||
gcc -O1 -Wall -static -o {} scripts/harkaq/harkaq-exec.c (sólo en el árbol de \
|
||||
desarrollo)\n o corré con --no-jail si sabés lo que estás haciendo.",
|
||||
exec.display(), exec.display()
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user