From 3b3056428f3c7b3acbeeae7ecb49e73c32d3a5f0 Mon Sep 17 00:00:00 2001 From: Sergio Date: Fri, 18 Sep 2026 19:45:46 +0000 Subject: [PATCH] `shuma-tui` no encontraba a su agente: nadie exportaba XDG_RUNTIME_DIR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El síntoma era «no hay agente atendiendo» y después «arranqué shuma-daemon y en 10 s no atendió ningún socket», con un daemon de sergio VIVO al lado. La causa: esta caja no tiene logind, así que nadie crea /run/user/ ni exporta XDG_RUNTIME_DIR, y entonces cada programa elige su propio repliegue y dejan de encontrarse — el tui buscaba en `$XDG_RUNTIME_DIR/shuma.sock`, o sea en la nada, mientras el daemon abría `/tmp/shuma-.sock`. Dos repliegues distintos para el mismo acuerdo. Ahora /etc/profile.d exporta XDG_RUNTIME_DIR y la card de arranque crea /run/user/ para cada cuenta con home. Comprobado en una sesión de login de verdad: XDG=/run/user/1001, el tui levanta su agente ahí y lista los conjuntos guardados (shuma 4 puestos, telefono-864, los diag…), que estaban en disco y no se perdieron al reiniciarlo. Entra también la card del volumen de trabajo —esta caja no tiene fstab y el init no monta discos nuevos— y quedan versionados /etc/profile y los dos profile.d, que hasta ayer no los leía nadie porque /etc/profile no existía. Co-Authored-By: Claude Opus 5 (1M context) --- scripts/servidor/cards/montar-trabajo.json | 62 ++++++++++++++++++++++ scripts/servidor/perfil/profile | 6 +++ scripts/servidor/perfil/rust-enlazador.sh | 3 ++ scripts/servidor/perfil/xdg-runtime.sh | 9 ++++ 4 files changed, 80 insertions(+) create mode 100644 scripts/servidor/cards/montar-trabajo.json create mode 100644 scripts/servidor/perfil/profile create mode 100644 scripts/servidor/perfil/rust-enlazador.sh create mode 100644 scripts/servidor/perfil/xdg-runtime.sh diff --git a/scripts/servidor/cards/montar-trabajo.json b/scripts/servidor/cards/montar-trabajo.json new file mode 100644 index 00000000..e7f76dc1 --- /dev/null +++ b/scripts/servidor/cards/montar-trabajo.json @@ -0,0 +1,62 @@ +{ + "id": "01M2F0NTARTRABAJ0V0VMEN012", + "label": "montar-trabajo", + "lifecycle": "oneshot", + "supervision": "OneShot", + "priority": "normal", + "lineage": null, + "provides": [], + "requires": [], + "flow": { + "input": [], + "output": [] + }, + "genesis": [], + "permissions": { + "filesystem": "read-write", + "networking": "none", + "processes": true, + "ipc": { + "allow": [] + } + }, + "soma": { + "cgroup": { + "cpu_weight": null, + "io_weight": null, + "path": "arje.slice/montar-trabajo" + }, + "cpu_affinity": null, + "namespaces": { + "cgroup": false, + "ipc": false, + "mount": false, + "net": false, + "pid": false, + "user": false, + "uts": false + }, + "rlimits": { + "mem_bytes": null, + "nofile": null, + "nproc": null + } + }, + "schema_version": 1, + "payload": { + "Native": { + "exec": "/bin/busybox", + "envp": [ + [ + "PATH", + "/usr/sbin:/usr/bin:/sbin:/bin" + ] + ], + "argv": [ + "sh", + "-c", + "mkdir -p /run/user; chmod 1777 /run/user; for h in /home/*; do u=$(basename $h); id -u $u >/dev/null 2>&1 || continue; mkdir -p /run/user/$(id -u $u); chown $u /run/user/$(id -u $u); chmod 700 /run/user/$(id -u $u); done; d=$(blkid -L trabajo 2>/dev/null); test -n \"$d\" || { echo montar-trabajo: ningun disco con LABEL=trabajo — el volumen no esta enchufado >&2; exit 78; }; mkdir -p /vvv; grep -q /vvv /proc/mounts || mount \"$d\" /vvv || { echo montar-trabajo: no pude montar el volumen >&2; exit 78; }; test -d /vvv/sergio || exit 0; mkdir -p /work/sergio; grep -q /work/sergio /proc/mounts || mount --bind /vvv/sergio /work/sergio; echo \"montar-trabajo: /vvv $(df -h /vvv | awk NR==2{print }) libres\"" + ] + } + } +} \ No newline at end of file diff --git a/scripts/servidor/perfil/profile b/scripts/servidor/perfil/profile new file mode 100644 index 00000000..58473cb7 --- /dev/null +++ b/scripts/servidor/perfil/profile @@ -0,0 +1,6 @@ +# /etc/profile — lo lee toda shell de LOGIN. Existe para que `/etc/profile.d/*.sh` sirva de algo: +# el directorio estaba y nadie lo leía (2026-09-18). +for _f in /etc/profile.d/*.sh; do + [ -r "$_f" ] && . "$_f" +done +unset _f diff --git a/scripts/servidor/perfil/rust-enlazador.sh b/scripts/servidor/perfil/rust-enlazador.sh new file mode 100644 index 00000000..f3a26935 --- /dev/null +++ b/scripts/servidor/perfil/rust-enlazador.sh @@ -0,0 +1,3 @@ +# El enlace de rust pasa por el driver de C (ver /usr/bin/cc). Sin esto no enlaza ninguna dylib, +# o sea ninguna proc-macro. SDD 28 §6.52. +export RUSTFLAGS="${RUSTFLAGS:-} -C linker=cc -C linker-flavor=gcc -C link-self-contained=no" diff --git a/scripts/servidor/perfil/xdg-runtime.sh b/scripts/servidor/perfil/xdg-runtime.sh new file mode 100644 index 00000000..4e7b49e8 --- /dev/null +++ b/scripts/servidor/perfil/xdg-runtime.sh @@ -0,0 +1,9 @@ +# Esta caja no tiene logind, así que nadie crea /run/user/ ni exporta XDG_RUNTIME_DIR. Sin eso, +# cada programa elige su propio repliegue y dejan de encontrarse: `shuma-tui` buscaba en +# `$XDG_RUNTIME_DIR/shuma.sock` (o sea, en la nada) mientras `shuma-daemon` abría +# `/tmp/shuma-.sock`. Medido en la caja el 2026-09-18. +if [ -z "${XDG_RUNTIME_DIR:-}" ]; then + XDG_RUNTIME_DIR=/run/user/$(id -u) + [ -d "$XDG_RUNTIME_DIR" ] || { mkdir -p "$XDG_RUNTIME_DIR" 2>/dev/null && chmod 700 "$XDG_RUNTIME_DIR" 2>/dev/null; } + export XDG_RUNTIME_DIR +fi