Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013SfRSvDd335NPYEbBrDFGE
65 lines
4.5 KiB
Python
65 lines
4.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Primeras incidencias (27-oct-2026): las dos fallas de acceso de esta semana, para que el tablero de Incidencias arranque
|
|
con su historia. Se corre EN EL SERVIDOR después de reiniciar el servicio (lo hace scripts/despliegue-1027.sh):
|
|
cd /srv/projects/drogheda/hbox-docs/backend && venv/bin/python3 semilla_1027.py
|
|
Idempotente: si ya existe una incidencia con la misma firma, no la vuelve a abrir. Escribe como «claude» por 127.0.0.1:8081.
|
|
"""
|
|
import json
|
|
import os
|
|
import urllib.request
|
|
|
|
API = os.environ.get("VIGIA_API", "http://127.0.0.1:8081")
|
|
|
|
|
|
def api(metodo, ruta, cuerpo=None):
|
|
req = urllib.request.Request(API + ruta, method=metodo, data=json.dumps(cuerpo).encode() if cuerpo is not None else None,
|
|
headers={"X-Remote-User": "claude", "Content-Type": "application/json"})
|
|
with urllib.request.urlopen(req, timeout=15) as r:
|
|
return json.loads(r.read().decode())
|
|
|
|
|
|
SEMILLA = [
|
|
{"alta": {"firma": "semilla:acceso-restablecer", "origen": "agente", "tipo": "acceso", "gravedad": "alta",
|
|
"titulo": "Después de restablecer la contraseña no se podía volver a entrar (reporte de Adriana, 26-oct)",
|
|
"descripcion": "Adriana reportó el 26-oct que, después de restablecer contraseñas, la gente no podía volver a entrar. "
|
|
"El 23-oct se restableció a todos con una contraseña inicial y solo 4 de 19 la cambiaron. El 27-oct a "
|
|
"las 9:18 Gibran le restableció la suya a Adriana y con eso entró.",
|
|
"pagina": "/cuenta.html"},
|
|
"cambio": {"estado": "en-curso", "asignado": "claude", "publica": True,
|
|
"resumen_publico": "Desde el 27-oct se entra con una página nueva: tu usuario (o tu correo de Helgen) y tu "
|
|
"contraseña. Si tu navegador llena una contraseña vieja, bórrala y escribe la tuya.",
|
|
"comentario": "Causa: con la ventana gris de antes (HTTP Basic de nginx) el navegador y el teléfono guardaban la "
|
|
"contraseña anterior y la volvían a mandar sola; Mi cuenta no tenía campo de usuario, así que el "
|
|
"gestor de contraseñas nunca la actualizaba; el usuario con mayúscula («Adriana») no existía para "
|
|
"nginx, y el servidor no registraba quién fallaba ni por qué. Arreglo (27-oct): página de entrada "
|
|
"propia (usuario o correo, sin importar mayúsculas), sesión que sobrevive al cambio de contraseña, "
|
|
"cerrar sesión que sí cierra, el restablecimiento cierra las sesiones viejas, contraseñas sin "
|
|
"mayúscula automática en el teléfono, y cada intento queda registrado (sin la contraseña). Queda "
|
|
"en curso una semana: el vigía avisa si alguien sigue sin poder entrar."}},
|
|
{"alta": {"firma": "semilla:servicio-repetibles", "origen": "agente", "tipo": "datos", "gravedad": "media",
|
|
"titulo": "El servicio instalado a mano el 27-oct dejó fuera la prueba Ethernet/serie y no estaba en el repo",
|
|
"descripcion": "A las 9:15 del 27-oct se reinstaló /etc/systemd/system/actas-hbox.service con una copia vieja: "
|
|
"agregó a Gibran como administrador, pero ACTAS_REPETIBLES ya no incluía prueba-ethernet-serie "
|
|
"(la segunda acta de la misma serie se rechazaba con 409). El repo no tenía a Gibran.",
|
|
"pagina": "/formularios/ethernet-serie.html"},
|
|
"cambio": {"estado": "resuelta", "asignado": "claude",
|
|
"comentario": "Arreglado en el despliegue del 27-oct: el servicio del repo ahora lleva a Gibran como "
|
|
"administrador y la lista completa de actas repetibles, y se instaló desde el repo. El vigía "
|
|
"compara cada hora el servicio instalado contra el del repo y abre una incidencia si no coinciden."}},
|
|
]
|
|
|
|
|
|
def main():
|
|
for s in SEMILLA:
|
|
lista = api("GET", "/api/incidencias?estado=todas&q=" + urllib.request.quote(s["alta"]["titulo"][:30]))
|
|
if any(r.get("titulo") == s["alta"]["titulo"] for r in lista.get("incidencias", [])):
|
|
print("ya estaba:", s["alta"]["titulo"][:70])
|
|
continue
|
|
r = api("POST", "/api/incidencias", s["alta"])
|
|
api("PATCH", "/api/incidencia?id=" + r["id"], s["cambio"])
|
|
print("abierta:", r["id"], s["alta"]["titulo"][:70])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|