gioser

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…

TOML 815Rust 56Shell 37Markdown 291229 Definitions

⎇ 476168bb077db780e49c83e3ca4f0d3d230bd58a scripts/harkaq/harkaq-policy.sh Shell · 51 lines · 2.2 KB History raw

takana etapa 5c: comentarios de scripts, MOTD, y un BUG que introdujo la etapa 4 476168bb0 · Sergio ·

1#!/bin/sh
2# harkaq-policy — deriva la política de la clausura declarada (SDD 16, D1).
3#
4#   harkaq-policy.sh <dir-dep> [<dir-dep>...] > politica
5#
6# D1: la política NO se escribe, se DERIVA. La receta ya declara sus `deps` por hash; cada dep
7# es un artefacto sellado del store (`store/<hash>-<name>/usr/...`). La clausura es, exactamente,
8# el conjunto de ficheros que esas deps aportan — ni uno más.
9#
10# El sandbox de takana apila cada dep con `--overlay-src` sobre el rootfs Alpine, así que el
11# fichero `store/<hash>-zlib/usr/include/zlib.h` aparece dentro como `/usr/include/zlib.h`. La
12# traducción es sólo quitar el prefijo del store: el resto del path YA es el path del sandbox.
13#
14# Por qué fichero a fichero y no por directorio: adentro, la dep declarada y el rootfs Alpine
15# comparten `/usr` (medido: /usr/include/zlib.h y /usr/include/stdio.h son el mismo directorio
16# overlayfs). Una regla sobre /usr concede los dos y la evidencia deja de significar algo. Los
17# `list` de los directorios se emiten para que las herramientas puedan ESCANEAR (pkgconf, los
18# tests de configure) sin poder LEER lo no declarado — Landlock separa READ_DIR de READ_FILE.
19set -eu
20
21emit_dirs() {
22    # Los directorios que contienen ficheros de la clausura: listables, no legibles.
23    # Se emiten deduplicados y con sus ancestros, porque un `ls /usr` también es un escaneo
24    # legítimo y su denegación sería un falso positivo, no deuda de de-Alpinización.
25    while IFS= read -r d; do
26        while [ "$d" != "/" ] && [ -n "$d" ]; do
27            echo "list $d"
28            d=$(dirname "$d")
29        done
30    done | sort -u
31}
32
33TMP="$(mktemp)"
34trap 'rm -f "$TMP" "$TMP.d"' EXIT
35: > "$TMP"
36: > "$TMP.d"
37
38for dep in "$@"; do
39    real=$(readlink -f "$dep")
40    # `.hammer/` es metadata del artefacto (recipe.toml), no parte de la clausura que el build
41    # consume: si el build lo leyera sería una denegación legítima que queremos ver.
42    find "$real" -type f -o -type l | grep -v "/\.hammer/" | while IFS= read -r f; do
43        inside="${f#$real}"
44        echo "ro $inside" >> "$TMP"
45        dirname "$inside" >> "$TMP.d"
46    done
47done
48
49echo "# harkaq-policy: clausura derivada de $# dep(s)"
50sort -u "$TMP.d" | emit_dirs
51sort -u "$TMP"