Propósito
core/sentinel_runtime.py es el módulo del Local Agent que gestiona el ciclo de vida completo del Modo Sentinel (el agente actuando como sonda primaria de monitorización SNMP/TCP de un site). Nace en la v2.25.1 (28-08-2026, PR #467) cuando app_main.py se trocea por la Regla 5 (tope de 500 líneas de lógica por módulo): antes esta lógica vivía mezclada dentro de app_main.py (677 líneas), ahora tiene módulo propio (209 líneas) sin ningún cambio de comportamiento — solo movimiento de código, verificado con la suite completa de tests del agente en verde.
Contrato
| Función | Qué hace |
|---|---|
start_sentinel_mode(state, auth) | Arranca el SentinelScheduler (resuelto en caliente para evitar import circular con sentinel/), aplica los targets pendientes que hubieran llegado por WS antes de que el scheduler estuviera listo, y arranca el SyncManager si hay sesión autenticada. |
stop_sentinel_mode(state) | Para el SyncManager y el SentinelScheduler, limpia la referencia de módulo _sentinel_scheduler y marca sentinel_enabled=false en el store local. |
get_sentinel_info(state) | Construye la foto de estado que consumen /info, /sentinel/status y el handler WS get_status: estado del scheduler, conexión WS, métricas pendientes de sync, última sincronización. |
_start_sync_for_sentinel(state, auth) | Arranca o reengancha el SyncManager a un scheduler ya corriendo, evitando reconexiones duplicadas. |
_auto_resume_sentinel(state) | Al arrancar el proceso, si el rol guardado en SQLite era primary y sentinel_enabled=true, retoma el Modo Sentinel sin esperar orden del SaaS. |
_sentinel_scheduler (referencia de módulo) | Apunta al scheduler activo — la usa network/snmp.py para compartir el mismo SnmpEngine entre Sentinel y Deep Discovery, en vez de abrir un socket UDP nuevo. |
Dependencias
- Usa:
core/auth.py(sesión con el SaaS),core/connector.py(estado de la conexión WS),core/store.py(TimeSeriesStore),core/sync.py(SyncManager, ver [[entity—terminal—service—sync-throttle]]), y resuelve en calientesentinel/scheduler.py(SentinelScheduler) para evitar el ciclo de imports. - Le usan:
app_main.py(lifespan de arranque/parada del servidor),core/saas_commands.py(handlers WSset_role,enable_sentinel,disable_sentinel,get_status),routes/health.py,routes/saas.py,routes/sentinel.pyynetwork/snmp.py(comparte_sentinel_schedulerpara elSnmpEngine).
Ejemplo de uso
from core.sentinel_runtime import start_sentinel_mode, get_sentinel_info
# Al recibir handle_set_role(role="primary") por WS:
await start_sentinel_mode(state, auth)
# Consultado por /info o el handler WS get_status:
info = get_sentinel_info(state) # {"running": True, "mode": "sentinel", "connected": True, ...}
Véase también
- [[entity—terminal—service—app-main]]
- [[entity—terminal—service—saas-commands]]
- [[entity—terminal—service—sync-throttle]]
- [[entity—terminal—service—connector-ws-diagnostics]]
- [[concept—terminal—local-agent]]