INTERCAMBIO de tejido hecho: la identidad cambió de máquina, no de dueño
Apagados en gioser (relay, serve y willay-crosscheck), encendidos en la caja: `tejido` en :4102 y `willay-crosscheck` en :4103, los dos alcanzables desde fuera. La prueba de que la identidad VIAJÓ no es que el servicio arranque —eso pasaría igual con semillas nuevas, que es el fallo silencioso que esto existe para evitar— sino que la semilla sea la misma: `device.seed` y `roster.postcard` con sha256 IDÉNTICO a los dos lados. El PeerId sale de ahí, así que sigue siendo 12D3KooWBw2u…. ⚠ LO QUE SÍ CAMBIA: el multiaddr que los clientes tienen configurado lleva la IP. antes /ip4/204.168.193.248/tcp/4102/p2p/12D3KooWBw2u… ahora /ip4/2.29.29.217/tcp/4102/p2p/12D3KooWBw2u… (mismo PeerId, otra IP) 🧱 SIN EL CORTAFUEGOS HABRÍA SIDO UN VERDE FALSO: el reglaset abría 80/443/1137/2345/22022 y nada más. Con el relay encendido y el 4102 filtrado, `status` diría «corriendo · 0 reinicios» y la flota no llegaría. Abiertos 4102 y 4103 con su ban por tasa; NO el 33097, que era el puerto efímero de un `tejido serve` cliente. Y el fichero quedó IDEMPOTENTE (crear+borrar la tabla antes de definirla), que era deuda del §6.33: 15 reglas dport antes, 21 después — no 36. ⚠ La política que genera ese reglaset NO EXISTE en ningún disco: ni la ruta que su cabecera nombra ni el binario `cortafuegos`. El generado sobrevivió a su fuente, así que hoy se edita a mano. 🆔 Y takana acepta ULIDs que arje-zero RECHAZA: la card no encarnaba por `invalid character`, y era la `L` de «RELAY» — carácter excluido del alfabeto Crockford. `service-cards` lo dio por bueno («26 alfanuméricos») y el consumidor lo tiró. El validador del productor más laxo que el del consumidor siempre termina en un fallo lejos de donde se escribió. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2401,6 +2401,86 @@ es el último movimiento antes del borrado.
|
||||
|
||||
⇒ **de las ocho, una sola está en rojo, y es una decisión de corte, no trabajo pendiente.**
|
||||
|
||||
### 6.41 🔀 INTERCAMBIO de `tejido` — la identidad cambió de máquina, no de dueño *(2026-09-17)*
|
||||
|
||||
Hecho, y en este orden, que es el único posible: **apagar allá → encender acá**.
|
||||
|
||||
```
|
||||
gioser tejido relay (964) · tejido serve (29240) · willay-crosscheck (15334) → detenidos
|
||||
takana tejido 4102 · willay-crosscheck 4103 → corriendo
|
||||
```
|
||||
|
||||
**La prueba de que la identidad VIAJÓ y no se generó otra** no es que el servicio arranque —eso
|
||||
pasaría igual con semillas nuevas, y sería el fallo silencioso que esto existe para evitar— sino que
|
||||
la semilla sea la misma:
|
||||
|
||||
```
|
||||
device.seed gioser cad6f35b633e8637… caja cad6f35b633e8637… ✓ idéntica
|
||||
roster.postcard gioser 590f2713075ac934… caja 590f2713075ac934… ✓ idéntica
|
||||
```
|
||||
|
||||
El `PeerId` sale de esa semilla, así que sigue siendo `12D3KooWBw2u8mt2ciUjX69qpVAZiJZ8sZMGxz8eHJEnz4rzg37L`.
|
||||
|
||||
#### ⚠ LO QUE SÍ CAMBIA, Y HAY QUE TOCARLO A MANO: el multiaddr
|
||||
|
||||
Los clientes tienen configurada la dirección COMPLETA del relay, IP incluida — se leyó del proceso
|
||||
que corría en gioser:
|
||||
|
||||
```
|
||||
antes: /ip4/204.168.193.248/tcp/4102/p2p/12D3KooWBw2u…
|
||||
ahora: /ip4/2.29.29.217/tcp/4102/p2p/12D3KooWBw2u… ← mismo PeerId, otra IP
|
||||
```
|
||||
|
||||
Un cliente con el viejo no falla «mal»: reintenta contra una IP que pronto no existirá. **El PeerId
|
||||
no hay que tocarlo; la IP sí, en cada equipo del roster.**
|
||||
|
||||
#### 🧱 Sin el cortafuegos, el intercambio habría sido un verde falso
|
||||
|
||||
El reglaset de la caja abría `80, 443, 1137, 2345, 22022` **y nada más**: `4102` estaba cerrado. Con
|
||||
el relay encendido y el puerto filtrado, `arjectl status` diría «corriendo · 0 reinicios» y la flota
|
||||
no llegaría — el peor de los verdes. Se abrieron `4102` (relay) y `4103` (crosscheck), con su ban
|
||||
por tasa como el resto. **No se abrió `33097`**: ése era el puerto efímero de un `tejido serve`
|
||||
(cliente), no un servicio que alguien busque.
|
||||
|
||||
Y el reglaset quedó **idempotente**, que era deuda del §6.33: sus dos primeras líneas crean y borran
|
||||
la tabla antes de definirla, así que `nft -f` **reemplaza** en vez de acumular. Comprobado contando:
|
||||
15 reglas `dport` antes, 21 después (no 36).
|
||||
|
||||
⚠ **La política que genera ese fichero NO EXISTE EN NINGÚN DISCO.** Su cabecera dice «GENERADO, no
|
||||
editar a mano — regenerar con `cortafuegos generate-input --policy <ruta>`», pero esa ruta no está
|
||||
ni en la caja, ni en gioser, ni en el repo (sólo dos `politica_*_ejemplo.ron` en tawasuyu), y el
|
||||
binario `cortafuegos` tampoco está instalado en ninguna de las dos. **El generado sobrevivió a su
|
||||
fuente**: hasta que la política se escriba y se versione, esto se edita a mano — justo lo que su
|
||||
primera línea pide no hacer.
|
||||
|
||||
#### 🆔 `takana` acepta ULIDs que `arje-zero` RECHAZA
|
||||
|
||||
La Card de tejido no encarnaba: `arje-zero rechazó: card tejido JSON: invalid character at line 7`.
|
||||
La línea 7 es el `id`, y el id era `01M2EKDA00TEJ1D0RELAY00001` — que tiene una **`L`**, carácter
|
||||
**excluido del alfabeto Crockford** de ULID (junto con `I`, `O`, `U`). `takana service-cards` lo
|
||||
validó como bueno («26 caracteres alfanuméricos») y el consumidor lo tiró.
|
||||
|
||||
Dos cosas de esto: el validador del PRODUCTOR es más laxo que el del consumidor —y eso siempre
|
||||
termina en un fallo lejos de donde se escribió—, y el barrido propio que ya corrí sobre todos los
|
||||
`id` del repo con el alfabeto correcto había marcado justo ése. Era el único con `L` (venía de
|
||||
«RELAY»); ahora es `01M2EKDA00TEJ1D0RE1AY00001`.
|
||||
|
||||
#### Estabilidad, medida y no supuesta
|
||||
|
||||
`willay-crosscheck` marcaba **4296 reinicios**, que asusta hasta mirar de dónde vienen: son las
|
||||
horas en que su guarda lo frenó a propósito por falta de roster. Con el mismo pid a los 70 s y
|
||||
1 m 53 s de vida, está estable. `tejido`: 0 reinicios. Los dos puertos aceptan conexión desde fuera.
|
||||
|
||||
⚠ De paso, un detalle feo: `arjectl status | head -2` hace que **arjectl paniquee** con
|
||||
`failed printing to stdout: Broken pipe`. No rompe nada, pero un `EPIPE` sin manejar en una
|
||||
herramienta de operación aparece justo cuando alguien la encadena con `head`/`grep -q`.
|
||||
|
||||
#### Cómo volver, si hiciera falta
|
||||
|
||||
Está escrito en `work/mudanza/volver-atras-tejido.txt`: apagar los dos de la caja y relanzar los tres
|
||||
de gioser con las líneas exactas que se leyeron de `/proc/<pid>/environ` y `cmdline`. **Nunca las dos
|
||||
a la vez**: es la misma identidad.
|
||||
|
||||
## 7. Reusar los scripts que ya existen, y no escribir de nuevo
|
||||
|
||||
Pedido explícito del usuario. El inventario de lo que ya hace el trabajo:
|
||||
|
||||
+1
-1
@@ -46,7 +46,7 @@ home = "/var/lib/tejido"
|
||||
# arranca perfecto y es OTRA máquina para la flota — se pierde el padrón de teléfonos dados de alta.
|
||||
[[service]]
|
||||
label = "tejido"
|
||||
id = "01M2EKDA00TEJ1D0RELAY00001"
|
||||
id = "01M2EKDA00TEJ1D0RE1AY00001"
|
||||
exec = "/bin/busybox"
|
||||
argv = ["sh", "-c", "/bin/grep -q '^tejido:' /etc/passwd || { echo 'tejido: falta el usuario `tejido` en /etc/passwd — lo declara esta receta con [[user]]' >&2; exit 78; }; test -s /var/lib/tejido/.tejido/device.seed || { echo 'tejido: falta /var/lib/tejido/.tejido/device.seed — es la IDENTIDAD libp2p de esta máquina y NO se genera: viene de ~/.tejido del origen. Generar otra es ser otra máquina para la flota' >&2; exit 78; }; cd /var/lib/tejido || exit 78; exec /usr/bin/setuidgid tejido /usr/bin/tejido relay"]
|
||||
envp = [["PATH", "/usr/bin:/bin"], ["HOME", "/var/lib/tejido"], ["USER", "tejido"]]
|
||||
|
||||
@@ -36,8 +36,8 @@ flags = ["-p", "willay-cruce", "--bin", "willay-crosscheck"]
|
||||
label = "willay-crosscheck"
|
||||
id = "01M2EKDA00W1YCR055CHK00012"
|
||||
exec = "/bin/busybox"
|
||||
argv = ["sh", "-c", "h=$(hostname); case \"$h\" in \"\"|\"(none)\") echo 'willay-crosscheck: la máquina no tiene hostname y `--label` es como se anuncia en la red — arreglá /etc/hostname (hay una Card OneShot que lo aplica)' >&2; exit 78;; esac; test -s /root/.tejido/roster.postcard || { echo 'willay-crosscheck: no hay roster en /root/.tejido/roster.postcard — este servicio vive DENTRO de la red de tejido y sin padrón no tiene con quién cruzar. Llega con el intercambio de tejido, no antes' >&2; exit 78; }; exec /usr/bin/willay-crosscheck --listen /ip4/0.0.0.0/tcp/4103 --label \"$h\""]
|
||||
envp = [["PATH", "/usr/bin:/bin"], ["HOME", "/root"]]
|
||||
argv = ["sh", "-c", "h=$(hostname); case \"$h\" in \"\"|\"(none)\") echo 'willay-crosscheck: la máquina no tiene hostname y `--label` es como se anuncia en la red — arreglá /etc/hostname (hay una Card OneShot que lo aplica)' >&2; exit 78;; esac; test -s $HOME/.tejido/roster.postcard || { echo 'willay-crosscheck: no hay roster en $HOME/.tejido/roster.postcard — este servicio vive DENTRO de la red de tejido y sin padrón no tiene con quién cruzar. Llega con el INTERCAMBIO de tejido, no antes' >&2; exit 78; }; mkdir -p /run/willay; exec /usr/bin/willay-crosscheck --listen /ip4/0.0.0.0/tcp/4103 --label \"$h\""]
|
||||
envp = [["PATH", "/usr/bin:/bin"], ["HOME", "/var/lib/tejido"], ["XDG_RUNTIME_DIR", "/run/willay"], ["XDG_DATA_HOME", "/var/lib"]]
|
||||
networking = "full"
|
||||
cgroup = "arje.slice/willay-crosscheck"
|
||||
restart = { initial_ms = 1000, max_ms = 30000 }
|
||||
@@ -50,3 +50,14 @@ restart = { initial_ms = 1000, max_ms = 30000 }
|
||||
# O sea que `willay-crosscheck` vive DENTRO de la red de tejido y hereda su condición: **se enciende
|
||||
# en el mismo movimiento en que tejido se intercambia**, no antes y no en paralelo con el de gioser.
|
||||
# Por eso sale del `genesis` y queda sólo en `cards.d`, como `tejido`.
|
||||
|
||||
# ⚠ EL ENTORNO NO SE ADIVINÓ: se leyó del proceso vivo en gioser (`/proc/<pid>/environ`), que lo
|
||||
# arrancaron así:
|
||||
#
|
||||
# sudo sh -c 'setsid nohup env XDG_RUNTIME_DIR=/run/willay XDG_DATA_HOME=/var/lib \
|
||||
# HOME=/home/sergio /usr/local/bin/willay-crosscheck --listen … --label momento …'
|
||||
#
|
||||
# O sea: **root, pero con `HOME` apuntando al home donde vive `~/.tejido`**. Acá esa identidad vive
|
||||
# en `/var/lib/tejido`, así que `HOME` va ahí — y por eso la guarda mira `$HOME/.tejido`, no una
|
||||
# ruta fija. Sin ese `HOME` el binario busca en `/root/.tejido`, que no existe ni acá ni allá: el
|
||||
# servicio arrancaría y no encontraría padrón, que es exactamente el fallo que se midió primero.
|
||||
|
||||
Reference in New Issue
Block a user