montar-trabajo: las comillas que faltaban — el awk fallaba en cada arranque y el grep podía saltarse el mount
Los dos los encontró scripts/sh-superficie-cards.py al inventariar las órdenes
externas de las cards. La card nació así en su único commit (3b305642): no fue
un accidente de edición posterior.
- awk NR==2{print } → awk 'NR==2{print $4}'
Sin comillas, awk daba error de sintaxis SIEMPRE y el echo final imprimía
«montar-trabajo: /vvv libres», sin el número, en cada arranque.
- grep -q /vvv /proc/mounts → grep -q " /vvv " /proc/mounts (y lo mismo
para /work/sergio)
El patrón desnudo matchea cualquier línea que CONTENGA la subcadena, así que
la comprobación «¿ya está montado?» podía dar verdadero por un /vvv/algo y
saltarse el mount en silencio. Latente: hace falta otra línea con esa
subcadena para que muerda.
Probado corriendo el fragmento entero con /proc/mounts sustituido por un
fichero de prueba y mkdir/chmod/chown/mount/blkid stubbeados — nada mutó la
máquina. Antes: en el escenario del falso positivo NO montaba /vvv. Después:
monta, y el echo trae el número. Parsea en busybox, bash y brush.
This commit is contained in:
@@ -689,26 +689,45 @@ scripts/sh-banco-diferencial.py --no-cases --files '/tmp/frags/*.sh' control=…
|
||||
Las 23 parsean idéntico en los tres shells. Es `sh -n`, no ejecución —montan discos y levantan
|
||||
daemons—, así que dice que el lenguaje alcanza, no que el comportamiento coincida.
|
||||
|
||||
## Dos bugs en una card, encontrados por el camino
|
||||
## Dos bugs en una card, encontrados por el camino — y ARREGLADOS
|
||||
|
||||
`scripts/servidor/cards/montar-trabajo.json` perdió comillas en dos sitios, y los dos fallan en
|
||||
silencio. **Comprobados, no deducidos:**
|
||||
`scripts/servidor/cards/montar-trabajo.json` venía sin comillas en tres sitios (dos bugs, uno de
|
||||
ellos por duplicado), y los dos fallan en silencio. **Comprobados, no deducidos** — y **no fue un
|
||||
accidente de edición posterior: la card nació así en su único commit** (`3b305642`), o sea que las
|
||||
comillas se perdieron antes de entrar al árbol.
|
||||
|
||||
**Bug 1 — el `awk` sin entrecomillar. Falla SIEMPRE:**
|
||||
|
||||
```sh
|
||||
df -h / | awk NR==2{print } # awk: cmd. line:1: NR==2{print ← error de sintaxis, rc=1
|
||||
df -h / | awk 'NR==2{print $4}' # 13G ← lo que se quiso escribir
|
||||
```
|
||||
|
||||
El `echo` final de la card imprime «`/vvv libres`» sin el número, siempre. Y peor:
|
||||
El `echo` final imprimía «`montar-trabajo: /vvv libres`», sin el número, en cada arranque.
|
||||
|
||||
**Bug 2 — el patrón de `grep` sin entrecomillar, en las dos comprobaciones de montaje.** Es LATENTE:
|
||||
|
||||
```sh
|
||||
grep -q /vvv /proc/mounts # matchea /vvv/sergio ⇒ "CREE que /vvv esta montado"
|
||||
grep -q " /vvv " /proc/mounts # con comillas: no lo cree
|
||||
grep -q /vvv /proc/mounts # matchea cualquier línea que CONTENGA /vvv (p.ej. /vvv/algo)
|
||||
grep -q " /vvv " /proc/mounts # con comillas: sólo el punto de montaje /vvv
|
||||
```
|
||||
|
||||
O sea que **la comprobación «¿está montado /vvv?» puede dar verdadero por una línea que sólo
|
||||
contiene `/vvv/sergio`**, y la card se saltaría el `mount`. Mismo accidente de edición en los dos
|
||||
sitios. **No lo toqué**: `scripts/servidor/` es el frente activo de otro agente.
|
||||
Para que muerda hace falta otra línea de `/proc/mounts` que contenga la subcadena —`/vvv/algo`
|
||||
montado aparte, o un `/mnt/vvvv`—; con `/vvv` montado de verdad o ausente, acertaba. Igual en
|
||||
`grep -q /work/sergio`, donde un `/work/sergio2` bastaría.
|
||||
|
||||
**Arreglado, y probado con la maquinaria de siempre:** el fragmento se corrió entero con
|
||||
`/proc/mounts` sustituido por un fichero de prueba y con `mkdir`/`chmod`/`chown`/`mount`/`blkid`
|
||||
stubbeados, así que nada mutó la máquina. Los dos escenarios, antes y después:
|
||||
|
||||
| escenario | antes | después |
|
||||
|---|---|---|
|
||||
| `/proc/mounts` sólo trae `/vvv/sergio` (el falso positivo) | **no montaba `/vvv`** y el `echo` salía sin número | `mount /dev/…-trabajo /vvv` + `170G libres` |
|
||||
| `/vvv` montado de verdad | (acertaba) | no vuelve a montar, `170G libres` |
|
||||
|
||||
El fragmento nuevo parsea en busybox, bash y brush. **Lo que NO se tocó**, porque es otra unidad de
|
||||
trabajo: los dos `echo` de error van sin comillas (hoy inocuo — ningún glob en el texto) y las
|
||||
variables `$u`/`$h`/`$d` van desnudas.
|
||||
|
||||
## Qué dice esto sobre el `sh` propio
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
"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\""
|
||||
"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 $4}') libres\""
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user