Compare commits

..

2 Commits

Author SHA1 Message Date
fenix cf31824f03 fix: add auto_cache to sshfs mounts to prevent stale reads in Emacs
sshfs kernel cache caused Emacs to show outdated file contents after
edits via Claude Code. Adding auto_cache invalidates cache when
mtime/size changes, fixing the stale data problem without sacrificing
performance.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-02 21:50:50 +01:00
fenix e8869005da upd. 2026-02-27 10:53:44 +01:00
4 changed files with 20 additions and 42 deletions

View File

@ -332,6 +332,7 @@ sudo tail -f /var/log/nginx/napi-error.log # Nginx errors
| `twemoji is not defined` | Falta `twemoji.min.js` en el root del site | `sudo cp /var/www/napi/twemoji.min.js /var/www/napiN/` | | `twemoji is not defined` | Falta `twemoji.min.js` en el root del site | `sudo cp /var/www/napi/twemoji.min.js /var/www/napiN/` |
| `404` en `/notas.md` | Carpeta del alumno no existe en `data/` | Crear carpeta + copiar plantilla | | `404` en `/notas.md` | Carpeta del alumno no existe en `data/` | Crear carpeta + copiar plantilla |
| sshfs zombie | Conexión SSH caída | `fusermount -uz ~/napi-dataN && systemctl --user restart ...mount` | | sshfs zombie | Conexión SSH caída | `fusermount -uz ~/napi-dataN && systemctl --user restart ...mount` |
| Emacs muestra datos stale tras editar | sshfs cachea lecturas del kernel | Añadir `auto_cache` a las Options del mount (ver abajo) |
| Watcher no detecta re-entregas | Versión antigua del watcher | Actualizar a v7+ y reiniciar servicio | | Watcher no detecta re-entregas | Versión antigua del watcher | Actualizar a v7+ y reiniciar servicio |
| `__pycache__` en notificaciones | Watcher < v6 | Actualizar a v7+ | | `__pycache__` en notificaciones | Watcher < v6 | Actualizar a v7+ |
@ -355,4 +356,5 @@ sudo tail -f /var/log/nginx/napi-error.log # Nginx errors
| 2026-02-22 | MVP desplegado: notas.qu3v3d0.tech para DDAW2 (19 alumnos) | | 2026-02-22 | MVP desplegado: notas.qu3v3d0.tech para DDAW2 (19 alumnos) |
| 2026-02-25 | ASIR1 desplegado: asir1.qu3v3d0.tech para Programación (21 alumnos) | | 2026-02-25 | ASIR1 desplegado: asir1.qu3v3d0.tech para Programación (21 alumnos) |
| 2026-02-25 | Watcher ASIR1 v7: batching, re-entregas, Windows-safe, __pycache__ filter, nombres completos | | 2026-02-25 | Watcher ASIR1 v7: batching, re-entregas, Windows-safe, __pycache__ filter, nombres completos |
| 2026-03-02 | sshfs mounts: añadido `auto_cache` para evitar datos stale en Emacs |
| 2027-02-04 | Renovar certificado SSL wildcard (caduca ~365 días desde 2026-02-04) | | 2027-02-04 | Renovar certificado SSL wildcard (caduca ~365 días desde 2026-02-04) |

View File

@ -1,45 +1,21 @@
#+title: TASKS — napi * CLona no el contenido en sí sino tan sólo la esructura de ~/napi-data/ a ~/napi-data2/ , teniendo en cuenta que :
#+date: [2026-02-25] ** en dicha carpeta se alojaran los datos de otro grupo de estudiantes : el de el módulo Programación. Es decir el grupo ASIR1.
** los cambios introducidos en el servidor Web deben ser compatibles con las aplicaciones existentes
** tendrán acceso a sus notas via notas.qu3v3d0.tech tras introducir, por obra del hack 'regexp-based-nginx-after-catch-all-content-redirect' ya desplegado en 'zzz', su usuario y contraseña
** TODO generar lista de alumnos - AKAs en el mismo fichero ~/napi-data2/programacion-seguimiento-de-practicas.md
* TODO , corregir/depurar mensaje : Claude, fíjate en @Screenshots/*.png s decir, que el chatbot no liste nada de "__pycache__/"
* DONE Clonar estructura ~/napi-data/ a ~/napi-data2/ para ASIR1
CLOSED: [2026-02-25]
** DONE Crear ~/napi-data2/ con 21 carpetas (apellido) + _plantilla/notas.md adaptada a Programación
** DONE Decisión arquitectónica: subdominio separado (asir1.qu3v3d0.tech) en vez de regex hack
- Más KISS: cada server block es independiente, sin lógica condicional
- SSL wildcard *.qu3v3d0.tech ya cubre todos los subdominios
** DONE Crear /var/www/napi2/ en zzz con viewer.html + marked.min.js + twemoji.min.js
** DONE Server block Nginx para asir1.qu3v3d0.tech (auth_pam → /var/www/napi2/data/$remote_user/)
** DONE Crear 21 usuarios SFTP en zzz (apellido, leet-speak passwords, chroot /home/USER/python/)
** DONE Unit systemd sshfs: ~/napi-data2/ ↔ zzz:/var/www/napi2/data/
** DONE Generar lista alumnos-AKAs en ~/napi-data2/programacion-seguimiento-de-las-practicas.md
* DONE Watcher XMPP para entregas ASIR1 — python-upload-watcher.sh * TODO que el chatbot, en vez de :
CLOSED: [2026-02-25]
** DONE v1: notificación básica por fichero (inotifywait + xmpp-notify.py)
** DONE v1.1: detectar creación de carpetas (CREATE,ISDIR)
** DONE v2: batching por carpeta — UN mensaje XMPP con listado completo (10s de silencio)
** DONE v3: detectar re-entregas (delete+recreate <120s)
** DONE v4: fix — estado en disco en vez de variables bash (subshell pipeline)
** DONE v5: fix — eliminar 'local' fuera de funciones (syntax error en subshell)
** DONE v6: filtrar __pycache__/, *.pyc, .git/, .venv/, node_modules/, .idea/, .vscode/
** DONE v7: nombre completo en notificaciones ([María Jara] en vez de [jara])
* DONE Corregir notificaciones: no listar __pycache__/ ** zzz@librebits.info 17:04
CLOSED: [2026-02-25] 🐍 [jara] Entrega ASIR1: Practicas/adivina-el-numero.py (1812 bytes)
- Resuelto en watcher v6: is_junk() + is_junk_path() filtran directorios y ficheros basura
- Filtros: __pycache__, *.pyc, *.pyo, .git, .venv, node_modules, .idea, .vscode
- También filtra basura Windows/macOS: Thumbs.db, desktop.ini, .DS_Store, *.tmp
* DONE Nombre completo en notificaciones XMPP (nombre + apellido)
CLOSED: [2026-02-25]
- Resuelto en watcher v7: función fullname() mapea username → nombre completo
- Ejemplo: [jara] → [María Jara], [barrios] → [Andrés Barrios]
- El log sigue usando username (para correlacionar con el sistema)
* DONE Documentación actualizada ** diga : zzz@librebits.info 17:04
CLOSED: [2026-02-25] 🐍 [maría jara] Entrega ASIR1: Practicas/adivina-el-numero.py (1812 bytes)
- README.md: reescrito para cubrir ambos grupos (DDAW2 + ASIR1) es decir, mencionar el/la autor/a de la entrega por ambos, nombre y apellido
- CLAUDE.md: actualizado con arquitectura multi-grupo
- scripts/README.md: watcher v7, ejemplos con nombres completos
- nginx/README.md: ambos server blocks documentados
- Commits: aa3126c + 42c1a7d → pushed to origin/main * esto

View File

@ -7,7 +7,7 @@ Wants=network-online.target
What=fenix@qu3v3d0.tech:/var/www/napi/data What=fenix@qu3v3d0.tech:/var/www/napi/data
Where=/home/fenix/napi-data Where=/home/fenix/napi-data
Type=fuse.sshfs Type=fuse.sshfs
Options=reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,IdentityFile=/home/fenix/.ssh/id_rsa,_netdev,allow_other Options=reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,IdentityFile=/home/fenix/.ssh/id_rsa,_netdev,allow_other,auto_cache
[Install] [Install]
WantedBy=default.target WantedBy=default.target

View File

@ -7,7 +7,7 @@ Wants=network-online.target
What=fenix@qu3v3d0.tech:/var/www/napi2/data What=fenix@qu3v3d0.tech:/var/www/napi2/data
Where=/home/fenix/napi-data2 Where=/home/fenix/napi-data2
Type=fuse.sshfs Type=fuse.sshfs
Options=reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,IdentityFile=/home/fenix/.ssh/id_rsa,_netdev,allow_other Options=reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,IdentityFile=/home/fenix/.ssh/id_rsa,_netdev,allow_other,auto_cache
[Install] [Install]
WantedBy=default.target WantedBy=default.target