Volver a la wiki

Concepto: Resiliencia del auto-update silencioso (Agent Full-Local)

Definición

Auto-update resilience es la capacidad del Agente Local de descargarse, validarse, reemplazarse y recuperarse de fallos de forma silenciosa sin intervención del usuario, garantizando que siempre hay una versión funcional en ejecución.

El mecanismo abarca:

  1. Descarga y verificación: El SaaS publica versión+SHA-256; el Agente verifica integridad.
  2. Staged deployment: El nuevo binary se descarga a .new.exe antes de hacer swap.
  3. Self-test en destino: El nuevo binary arranca con --selftest ANTES del swap → aborta si falla.
  4. Watchdog post-swap: Tras el reemplazo, un vigilante desacoplado monitorea y recupera.
  5. Rollback en dos capas: Si falla el swap a nivel de filesystem, revierte; si falla el arranque, el watchdog revierte la versión.

Motivación

Antes de 2.9.0, los Agentes se actualizaban manualmente o se quedaban obsoletos. El auto-update silencioso (2.9.0) resolvió eso, pero dejó un riesgo: si algo salía mal en el swap, el Agente quedaba muerto sin avisar.

Cimientos sucesivos corrigieron capas de riesgo:


Capas de defensa

┌─────────────────────────────────────────────────────────────────┐
│ 1. DESCARGA & VERIFICACIÓN (2.9.0)                              │
│    - SHA-256 verificado contra el SaaS                          │
│    - Si falla → aborta, Agente sigue en versión actual          │
└─────────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────────┐
│ 2. SELF-TEST EN DESTINO (2.11.2)                                │
│    - NEW_EXE --selftest ejecutado                               │
│    - Importa terceros lazy (psutil, pysnmp)                     │
│    - Si falla → aborta, no toca el binary viejo                 │
└─────────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────────┐
│ 3. SWAP BLINDADO CON ROLLBACK (2.11.4)                          │
│    - Rename atomic si es posible; rollback si AV bloquea        │
│    - Si falla el rename → revierte, Agente sigue vivo           │
└─────────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────────┐
│ 4. WATCHDOG POST-SWAP (2.11.4+)                                 │
│    - Proceso hijo desacoplado que sobrevive al padre            │
│    - Monitorea /health cada 30 segundos                         │
│    - Si OK → misión cumplida                                    │
│    - Si falla → relanza (--swap-retry) o revierte               │
│    ⚠️  BUG HASTA 2.13.2: Flags de Windows mataban el watchdog   │
│    ✅ CORREGIDO EN 2.13.3: CREATE_NO_WINDOW + DEVNULL           │
└─────────────────────────────────────────────────────────────────┘

Estados y transiciones

                         ┌─────────────────┐
                         │  VERSIÓN ACTUAL │  (ej. 2.13.2)
                         │   EN EJECUCIÓN  │
                         └────────┬────────┘
                                  │
                    [SaaS publica 2.13.3]
                                  │
                         ┌────────▼────────┐
                         │   DESCARGANDO   │
                         │  (verificando)  │
                         └────────┬────────┘
                                  │
                    [SHA-256 OK, staged en .new.exe]
                                  │
                         ┌────────▼────────┐
                         │   AUTOTEST      │
                         │  (2.13.3 antes  │
                         │   del swap)     │
                         └────────┬────────┘
                                  │
                    [--selftest OK]
                                  │
                         ┌────────▼────────┐
                         │    SWAP         │  (rename, os._exit)
                         │    APLICADO     │
                         └────────┬────────┘
                                  │
           ┌──────────────────────┼──────────────────────┐
           │                      │                      │
     ❌ Fallo         ✅ Éxito     │              ⚠️  AV bloquea
     (rollback)      (vivo)        │                (watchdog actúa)
           │                      │                      │
     ┌─────▼────┐          ┌──────▼──────┐        ┌──────▼───────┐
     │ REVERTIDO │          │   2.13.3    │        │ WATCHDOG: 1s │
     │ (2.13.2)  │          │   VIVO      │        │ reintento    │
     └───────────┘          └─────────────┘        └──────┬───────┘
                                                           │
                                        ┌──────────────────┼──────┐
                                        │                  │      │
                                     OK │           ❌ Falla│      │
                                        │                  │      │
                                   ┌────▼─────┐      ┌──────▼──┐  │
                                   │ 2.13.3    │      │ Revert  │  │
                                   │ VIVO      │      │ 2.13.2  │  │
                                   └───────────┘      └─────────┘  │
                                                                    └─(N reintentos)

Verificación en la flota

Desde el SaaS

Desde el Agente


Invariantes garantizados

InvarianteCobertura
Siempre hay un binary ejecutableRollback en filesystem (2.11.4) + watchdog (2.11.4)
SHA-256 verificado antes de usarDescarga (2.9.0)
Nuevo binary probado antes de reemplazar viejoSelf-test (2.11.2)
Watchdog sobrevive al proceso padreCREATE_NEW_PROCESS_GROUP (2.13.3)
Watchdog tiene logs para auditoríaupdate_watchdog.log (2.13.1)

Incidentes históricos y lecciones

VersiónIncidenteCausaSolución
2.11.0Binario muerto tras swap si AV mata el arranqueNo hay watchdogIntroducir watchdog (2.11.4)
2.11.2Watchdog no sabe si el nuevo binary arrancaNo hay self-test antes del swapSelf-test en destino (2.11.2)
2.13.0Swap silencioso sin evidencia (no sabemos si watchdog corrió)Logs se pierden en arranqueTraza persistente (2.13.1)
2.13.2Reinstalar .exe a mano deja duplicadospsutil no empaquetadoEmpaquetar psutil, kill por path (2.13.2)
2.13.2–3 (03-07, 05-07)Watchdog lanzado pero muere al instante (flags Windows)DETACHED_PROCESS anula CREATE_NO_WINDOWEliminar DETACHED_PROCESS (2.13.3)

Véase también

Subir