sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
⎇ 8bf1623044075274682e4351a0f8e120047c2bed
crates/hammer-build/src/sandbox.rs
Historia
Quién tocó qué
crudo
Scaffold inicial: workspace Rust + SDDs completos
1//! El sandbox hermético de build (bubblewrap). Ver `docs/02-build-lab.md` §3 y §4.
2//!
3//! Esqueleto de Fase 0. Define la forma del aislamiento que implementaremos: raíz tmpfs,
4//! compilador read-only inyectado, fuentes/deps read-only, sin red, salida vía DESTDIR.
5
6use std::path::PathBuf;
7
8/// Descripción de un sandbox de build a montar con `bwrap`.
9#[derive(Debug, Clone, Default)]
10pub struct Sandbox {
11 /// Binds read-only: (origen_host, destino_sandbox).
12 pub ro_binds: Vec<(PathBuf, PathBuf)>,
13 /// Directorio de salida (DESTDIR) dentro del sandbox.
14 pub out: PathBuf,
15 /// Aislar red (hermeticidad: el build no descarga nada no declarado).
16 pub isolate_net: bool,
17}
18
19impl Sandbox {
20 /// Construye los argumentos para `bwrap`. TODO(fase-0): completar y ejecutar.
21 pub fn bwrap_args(&self) -> Vec<String> {
22 let mut args = vec![
23 "--unshare-all".into(),
24 "--tmpfs".into(),
25 "/".into(),
26 "--proc".into(),
27 "/proc".into(),
28 "--dev".into(),
29 "/dev".into(),
30 ];
31 if !self.isolate_net {
32 args.push("--share-net".into());
33 }
34 for (src, dst) in &self.ro_binds {
35 args.push("--ro-bind".into());
36 args.push(src.display().to_string());
37 args.push(dst.display().to_string());
38 }
39 args
40 }
41}