- README.md: complete rewrite covering DDAW2 + ASIR1, deployment guide, troubleshooting, security, full student roster - CLAUDE.md: updated to reflect both groups, simplified structure - scripts/README.md: watcher bumped to v7 (fullnames, __pycache__ filter) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| README.md | ||
| home-fenix-napi-data.mount | ||
| home-fenix-napi-data2.mount | ||
| nginx-user-config-watcher.service | ||
| nginx-user-config-watcher.sh | ||
| python-upload-watcher.service | ||
| python-upload-watcher.sh | ||
| xmpp-notify.py | ||
README.md
📜 Scripts y Servicios — napi
Copia de referencia de todos los scripts y unidades systemd desplegados en zzz (qu3v3d0.tech) y aldebaran/anka4 para el sistema de retroalimentación a estudiantes.
🗂️ Inventario
| Fichero | Dónde vive | Descripción |
|---|---|---|
python-upload-watcher.sh |
zzz:/usr/local/bin/ |
Watcher ASIR1 — detecta entregas SFTP en /home/USER/python/, agrupa por carpeta, notifica XMPP |
nginx-user-config-watcher.sh |
zzz:/usr/local/bin/ |
Watcher DDAW2 — valida y despliega *.conf de alumnos, analiza CSP, notifica XMPP |
xmpp-notify.py |
zzz:/usr/local/bin/ |
Bot XMPP one-shot (slixmpp) — envía mensaje a jla@librebits.info |
python-upload-watcher.service |
zzz:/etc/systemd/system/ |
Unit systemd para el watcher ASIR1 |
nginx-user-config-watcher.service |
zzz:/etc/systemd/system/ |
Unit systemd para el watcher DDAW2 |
home-fenix-napi-data.mount |
aldebaran:~/.config/systemd/user/ |
Mount sshfs ~/napi-data/ → zzz:/var/www/napi/data/ (DDAW2) |
home-fenix-napi-data2.mount |
aldebaran:~/.config/systemd/user/ |
Mount sshfs ~/napi-data2/ → zzz:/var/www/napi2/data/ (ASIR1) |
🐍 python-upload-watcher.sh (v7)
Propósito: Monitorizar las entregas de prácticas de Programación (ASIR1) subidas por SFTP.
Características
- ✅ Batching por carpeta — Cuando un alumno sube
PRACTICA3.1/con N ficheros, envía un solo mensaje XMPP con el listado completo (espera 10s de silencio) - ♻️ Re-entregas — Si el alumno borra y re-sube la misma carpeta (<120s), etiqueta como "Re-entrega"
- 👤 Nombre completo — Notifica
[María Jara]en vez de[jara](mapa usuario → nombre en el script) - 🪟 Windows-safe — Ignora
Thumbs.db,desktop.ini,.DS_Store,*.tmp,~$* - 🐍 Python-safe — Ignora
__pycache__/,*.pyc,*.pyo - 🛠️ Dev-safe — Ignora
.git/,.venv/,node_modules/,.idea/,.vscode/ - 📁 Iconos por tipo — 🐍
.py· 📦.zip/.rar· 📝.md· 📄.txt· 📕.pdf· 📘.docx
Ejemplo de notificación XMPP
📁 [Andrés Barrios] Entrega ASIR1: PRACTICA3.1/ (4 ficheros)
🐍 main.py (2048 bytes)
🐍 utils.py (1024 bytes)
📝 README.md (512 bytes)
📄 requisitos.txt (128 bytes)
📁 [Andrés Barrios] ♻️ Re-entrega ASIR1: PRACTICA3.1/ (3 ficheros)
🐍 main.py (2100 bytes)
📝 README.md (600 bytes)
📄 requisitos.txt (128 bytes)
Eventos inotifywait monitorizados
| Evento | Acción |
|---|---|
CREATE (directorio) |
Abre batch, detecta re-entrega si fue borrado recientemente |
CREATE (fichero) |
Ignorado (esperamos close_write) |
CLOSE_WRITE |
Fichero completado → añade al batch o notifica individual |
MOVED_TO |
Fichero movido al directorio → igual que close_write |
DELETE / MOVED_FROM |
Registra borrado de carpeta (para detectar re-entregas) |
Log
sudo tail -f /var/log/python-upload-watcher.log # en zzz
🌐 nginx-user-config-watcher.sh (v3)
Propósito: Despliegue automático de configuraciones Nginx subidas por alumnos de DDAW2 via SFTP.
Características
- ✅ Validación de seguridad — Verifica
server_name,root, bloquea directivas peligrosas (proxy_pass,include /, etc.) - 🔒 Análisis CSP — Revisa cabeceras
Content-Security-Policy, detectaunsafe-inline, multiline, HTTPS - 📛 Nomenclatura — Verifica patrón
mi-nginx[-SUFIJO].conf - 🌐 Multi-sitio v3 —
mi-nginx-hextris.conf→USER-hextris.qu3v3d0.tech - 🗑️ Undeploy — Borrar el
.confvia SFTP elimina el site de Nginx - 💡 Pistas humanizadas — Traduce errores
nginx -ta español comprensible
Límites
- Máximo 4 sitios por alumno
- Solo
.confdentro de/home/USER/html/
📨 xmpp-notify.py
Bot XMPP one-shot usando slixmpp. Envía un mensaje y desconecta.
/usr/local/bin/xmpp-notify.py "Mensaje de prueba"
- JID:
zzz@librebits.info - Destinatario:
jla@librebits.info - Config:
/etc/xmpp-notify.conf(credenciales)
⚙️ Units systemd
En zzz (system-level)
# Estado de los watchers
sudo systemctl status python-upload-watcher.service # ASIR1
sudo systemctl status nginx-user-config-watcher.service # DDAW2
# Reiniciar
sudo systemctl restart python-upload-watcher.service
sudo systemctl restart nginx-user-config-watcher.service
En aldebaran/anka4 (user-level)
# Estado de los mounts sshfs
systemctl --user status home-fenix-napi\\x2ddata.mount # DDAW2
systemctl --user status home-fenix-napi\\x2ddata2.mount # ASIR1
# Montar/desmontar
systemctl --user start home-fenix-napi\\x2ddata2.mount
systemctl --user stop home-fenix-napi\\x2ddata2.mount
🏗️ Estructura de directorios en zzz
/var/www/napi/ ← DDAW2
├── viewer.html
├── marked.min.js
├── twemoji.min.js
└── data/
├── anas/notas.md
├── pablo/notas.md
└── ... (19 alumnos)
/var/www/napi2/ ← ASIR1 (Programación)
├── viewer.html
├── marked.min.js
├── twemoji.min.js
└── data/
├── barja/notas.md
├── barrios/notas.md
└── ... (21 alumnos)
/home/USER/python/ ← Entregas SFTP (ASIR1)
├── PRACTICA3.1/
│ ├── main.py
│ └── README.md
└── fichero_suelto.py
📅 Historial de versiones
| Script | Versión | Fecha | Cambios |
|---|---|---|---|
python-upload-watcher.sh |
v7 | 2026-02-25 | Batching + re-entregas + Windows-safe + __pycache__ filter + nombres completos |
nginx-user-config-watcher.sh |
v3 | 2026-02-19 | Multi-sitio + undeploy + CSP analysis |
xmpp-notify.py |
v1 | 2026-01-27 | Bot one-shot slixmpp |