Volver a la wiki

CreaRack Local Agent - Guía Completa

CreaRack Local Agent - Guía Completa

Versión: 2.0.13 Última actualización: 12-03-2026 Autor: Claude (Anthropic)


1. Introducción

El CreaRack Local Agent es un componente standalone que permite a CreaRack Pro conectarse a dispositivos de red con IPs privadas que no son accesibles desde el servidor Docker.

Por qué es necesario

┌─────────────────────────────────────────────────────────────────┐
│  PROBLEMA: Docker no puede alcanzar IPs privadas               │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  [Docker Container]              [Red Privada]                  │
│   Django Server    ──────X─────►  192.168.1.x                  │
│   localhost:8000                  10.0.0.x                      │
│                                   172.16.x.x                    │
│                                                                 │
│  SOLUCIÓN: Local Agent como puente                             │
│                                                                 │
│  [Navegador] ◄───► [Local Agent] ◄───► [Dispositivos]         │
│              WS     localhost:5050  SSH   192.168.x.x          │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

El agente se ejecuta en la máquina del usuario (Windows) y actúa como puente entre el navegador y los dispositivos de red locales.


2. Arquitectura

2.1 Stack Tecnológico

ComponenteTecnologíaPropósito
FrameworkFastAPIAPI REST + WebSocket
ServidorUvicornASGI de alto rendimiento
SSHasyncsshConexiones SSH asíncronas
Network AutomationScrapliMulti-vendor (Cisco, Arista, Juniper)
Terminalxterm.js (CDN)Emulador de terminal en navegador
CompiladorPyInstallerEmpaquetado como .exe

2.2 Estructura Modular (v1.0.0)

Arquitectura modular para mejor mantenibilidad:

terminal/agent/
├── local_agent.py         # Main: FastAPI app, endpoints, WebSocket
├── models.py              # Pydantic request/response models
├── windows_integration.py # Install/uninstall/registry Windows
├── logging_handler.py     # MemoryLogHandler + WebSocket broadcast
├── ssh_bridge.py          # SSHBridge: conexiones persistentes
├── scrapli_manager.py     # LocalScrapliManager: multi-vendor
├── cluster_engine.py      # ClusterEngine: ejecución paralela
├── network_utils.py       # Ping, scan, discovery, ARP
├── version.py             # AGENT_VERSION (single source of truth)
├── installer.py           # Always-reinstall strategy (silent)
├── auth_manager.py        # DPAPI + JWT authentication
├── offline_cache.py       # SQLite cache offline
├── monitoring_service.py  # Workers de monitoreo (ping/SNMP/HTTP)
├── saas_connector.py      # WebSocket persistent connection
├── timeseries_store.py    # SQLite WAL store for Sentinel metrics
├── sentinel_scheduler.py  # Async ping/SNMP/HTTP monitoring loops
├── sync_manager.py        # REST push metrics to SaaS + pull targets
└── assets/
    ├── terminal.html      # UI del terminal (xterm.js + Asteroids)
    ├── debug.html         # Agent Home: Tools Hub + Sentinel status
    └── oui_vendors.json   # Base de datos MAC vendors (~230 entries)

2.3 Installer Strategy (v6.0.7)

El installer sigue una estrategia de always-reinstall:

EscenarioAccion
Primera ejecucionDialogo de aceptacion (unica interaccion)
Ya instalado (cualquier version)Silent: kill -> uninstall -> install -> relaunch
Ejecutandose desde install dirContinua normalmente

Datos preservados en reinstall: credentials.enc, offline_cache.db, metrics.db, agent.log

Beneficios de la modularización:

2.3 Flujo de Datos

┌──────────────┐    HTTP/WS    ┌──────────────┐     SSH     ┌──────────────┐
│   Browser    │◄─────────────►│ Local Agent  │◄───────────►│   Device     │
│  (CreaRack)  │  localhost    │  port 5050   │  port 22    │ 192.168.x.x  │
└──────────────┘               └──────────────┘             └──────────────┘
       │                              │
       │  1. Abre modal SSH           │
       │  2. Envía credenciales       │
       │  ─────────────────────►      │
       │                              │  3. Establece túnel SSH
       │                              │  ─────────────────────►
       │                              │
       │  4. Streaming bidireccional  │
       │  ◄────────────────────►      │
       │                              │

3. Instalación

3.1 Auto-Instalación (Recomendado)

El agente se auto-instala automáticamente al ejecutarse por primera vez:

  1. Descargar CreaRackAgent.exe desde CreaRack Pro
  2. Ejecutar el archivo desde cualquier ubicación
  3. El agente:
    • Se copia a %APPDATA%\CreaRackAgent\
    • Registra el protocolo crearack://
    • Se añade al inicio de Windows
    • Genera uninstall.bat
    • Se relanza desde la nueva ubicación

Directorio de instalación:

%APPDATA%\CreaRackAgent\
├── CreaRackAgent.exe           # Ejecutable principal (nombre fijo)
├── version.txt                 # Versión instalada
├── credentials.enc             # Credenciales DPAPI activas (SaaS actual)
├── profiles.enc                # Multi-profile DPAPI (Local + Online)
├── offline_cache.db            # Cache offline SQLite
├── agent.log                   # Logs del agente
├── agent.lock                  # Lock de instancia única
└── uninstall.bat               # Desinstalador

3.2 Desinstalación

Ejecutar uninstall.bat desde el directorio de instalación, o:

  1. Abrir %APPDATA%\CreaRackAgent\
  2. Ejecutar uninstall.bat

El desinstalador:


4. Agent Home: Tools Hub (v6.0.0)

Acceder a http://localhost:5050/ desde el navegador para abrir el Agent Home.

4.1 Estructura de Tabs

La interfaz usa 3 tabs:

┌─────────────────────────────────────────────┐
│  CreaRack Local Agent v6.0.0               │
│  Status: ● ONLINE                           │
├─────────────────────────────────────────────┤
│  [Status]  [Tools]  [Debug]    ← Tab bar    │
├─────────────────────────────────────────────┤
│  Contenido de la tab activa                 │
├─────────────────────────────────────────────┤
│  Footer: Port · Refresh · CreaRack Pro link │
└─────────────────────────────────────────────┘

4.2 Tab: Status

Muestra información del agente en cards:

SecciónDatos
RuntimeUptime, versión Python, plataforma, modo (exe/dev)
InstallationDirectorio de instalación, si ejecuta desde install
Cluster EngineEstado de Scrapli, drivers nativos, soporte genérico SSH
Active SessionsLista de sesiones SSH con estado
Sentinel ModeTargets, métricas, sync status, uptime
SaaS ConnectionToggle Local/Online, Token Status, Proactive Refresh, Reconnect (colapsable, ver §8.5)

4.3 Tab: Tools (7 herramientas de red)

Cada herramienta es una card colapsable (click en header expande/colapsa). Al expandir muestra inputs + botón Run. Resultado aparece inline.

#HerramientaEndpointMétodoInputs
1Port Check/checkGETHost, Port (default 22)
2ICMP Ping/network/ping-icmpGETHost
3DNS Lookup/network/hostnameGETIP
4SSH Banner/network/bannerGETHost, Port (default 22)
5ARP Table/network/arp-tableGETSubnet filter (opcional)
6Network Discovery/network/discoverPOSTSubnet, Scan type (quick/standard/deep)
7Port Scan/network/scanPOSTTarget, Ports (default “22,80,443,3389,8080”)

Resultados:

4.4 Tab: Debug (Enhanced v2.0.4)

Consola de debug profesional con logs en tiempo real via WebSocket (/ws/debug):

Toolbar (4 botones + filtros + búsqueda):

ControlFunción
Pause / ResumeDetiene auto-scroll (logs siguen llegando). Botón cambia a amarillo cuando pausado
Copy AllCopia todos los logs al clipboard como texto plano
DownloadGenera archivo .txt con timestamp y lo descarga
ClearElimina todos los logs del DOM
Filtros de nivel4 checkboxes: ERROR, WARNING, INFO, DEBUG. Oculta/muestra líneas por nivel
SearchInput de texto con highlight amarillo en los matches visibles

Útil para:

4.3 Vendors Soportados

TipoVendors
Native DriversCisco IOS/NX-OS, Arista EOS, Juniper JunOS
Generic SSHCualquier dispositivo con SSH (Linux, MikroTik, Ubiquiti, Fortinet, etc.)

4.4 Ejemplo de Respuesta JSON (para API)

{
  "status": "online",
  "agent": "CreaRack Local Agent",
  "version": "3.0.1",
  "uptime": "2h 15m 30s",
  "uptime_seconds": 8130,
  "sessions": {
    "count": 2,
    "active": [
      {"id": "switch_01", "connected": true, "has_sftp": false, "logging": false},
      {"id": "router_main", "connected": true, "has_sftp": true, "logging": true}
    ]
  },
  "environment": {
    "python": "3.14.2",
    "platform": "Windows",
    "machine": "AMD64",
    "frozen": true
  },
  "paths": {
    "install_dir": "C:\\Users\\user\\AppData\\Roaming\\CreaRackAgent",
    "running_from_install": true,
    "exe_path": "C:\\Users\\user\\AppData\\Roaming\\CreaRackAgent\\CreaRackAgent.exe"
  }
}

5. Endpoints API

5.1 Health & Status

EndpointMétodoDescripción
/GETAgent Home: Tools Hub (HTML para navegador, JSON para API)
/infoGETInformación básica del agente
/healthGETHealth check simple ({"status": "healthy"})

5.2 Verificación de Conectividad

EndpointMétodoDescripción
/check?host=X&port=YGETVerificar si host:port es alcanzable

Ejemplo:

curl "http://localhost:5050/check?host=192.168.1.1&port=22"
# {"host": "192.168.1.1", "port": 22, "reachable": true}

Uso en CreaRack: El frontend usa este endpoint para verificar el estado de dispositivos con IP privada, ya que el backend Docker no puede alcanzarlos.

5.3 Terminal SSH

EndpointMétodoDescripción
/terminal/uiGETInterfaz HTML del terminal
/terminal/sessionsGETListar sesiones SSH activas (solo con conexión SSH viva)
/terminal/session/{id}/terminatePOSTTerminar sesión
/ws/terminal/{id}WebSocketCanal de comunicación del terminal

Protocolo WebSocket:

// Conectar a dispositivo
ws.send(JSON.stringify({
    action: "connect",
    host: "192.168.1.1",
    port: 22,
    username: "admin",
    password: "secret"
}));

// Enviar comando
ws.send(JSON.stringify({
    action: "data",
    data: "show version\r\n"
}));

// Mensajes recibidos
// { type: "output", data: "..." }      - Output del dispositivo
// { type: "status", message: "..." }   - Estado de conexión
// { type: "error", message: "..." }    - Errores

Atajos de Teclado del Terminal (v4.0.6):

AtajoAcción
Ctrl+CCopiar texto seleccionado al clipboard. Si no hay selección, envía SIGINT (comportamiento normal)
Ctrl+VPegar desde el clipboard al terminal
Ctrl+Shift+CCopiar (alternativo, siempre copia)
Ctrl+Shift+VPegar (alternativo, siempre pega)

Nota: La selección de texto se realiza con el ratón. Tras copiar con Ctrl+C, la selección se limpia automáticamente.

Nota: El iframe del terminal requiere allow="clipboard-read; clipboard-write" para que la Clipboard API funcione en iframes cross-origin (Chrome 2024+).

Persistencia de Sesiones SSH (v2.0.11):

Las sesiones SSH sobreviven a la navegación entre páginas del SaaS:

EscenarioComportamiento
Navegar fuera y volverReattach automático — se reproduce el output_buffer (últimos 2000 chunks) y se muestra “SESSION RESTORED”
Sesión SSH expirada (timeout remoto)Se detecta ssh_conn=None, se limpia el bridge stale y se crea sesión nueva
Cerrar pestaña del navegadorLa sesión SSH sigue viva en el Agent hasta que el servidor remoto la cierre

Flujo técnico de reattach:

  1. El iframe carga terminal.html y abre WebSocket /ws/terminal/{sid}
  2. El Agent detecta sid en ACTIVE_BRIDGES y verifica ssh_conn + ssh_process
  3. Si SSH está vivo → envía output_buffer por WS → “Tunnel Established!”
  4. Si SSH está muerto → limpia bridge stale → crea nueva sesión
  5. El frontend consulta GET /terminal/sessions antes de enviar CONNECT_SSH para distinguir reattach de nueva conexión
  6. En reattach, no se muestra el banner de versión ni se reenvía CONNECT_SSH

Selector de Tema (v4.1.0):

El terminal incluye un dropdown con temas profesionales:

TemaFondoDescripción
Campbell#0C0C0CTema por defecto de Windows Terminal
Gruvbox Dark#282828Retro cálido, marrones/naranjas, muy popular
Green Screen#001100Retro terminal verde fosforescente
Tango Dark#000000Paleta Tango clásica de GNOME

El selector envía SET_THEME al iframe del terminal.

Persistencia de Ajustes (Superpersistencia):

Los ajustes (tema y tamaño) se guardan automáticamente en localStorage bajo la clave crearack_terminal_settings. Los ajustes:

Selector de Tamaño:

BotónTamañoDescripción
L22pxLetra grande
M18pxLetra mediana
B14pxLetra base (default)

5.3.1 Sistema de Coloreado (Syntax Highlighting)

El terminal implementa colorización automática del output usando códigos de escape ANSI. El sistema tiene dos capas y puede activarse/desactivarse.

Toggle de Color (v4.2.0)

En la toolbar de cada terminal hay un botón “Color”:

El estado se guarda en localStorage con superpersistencia.

Capa 1: Keywords Highlighting (Palabras Clave)

ColorCódigo ANSIPalabras
Rojo (Error)\x1b[1;31merror, fail, failed, failure, critical, down, shutdown, refused, denied, unreachable
Verde (Éxito)\x1b[1;32mup, ok, success, connected, online, running, active
Amarillo (Advertencia)\x1b[1;33mwarning, alert, caution, deprecated, timeout
Cian (IPs)\x1b[1;36mDirecciones IPv4 (ej: 192.168.1.1)
Dorado (MACs)\x1b[33mDirecciones MAC (ej: AA:BB:CC:DD:EE:FF)

Nota (v4.0.9): Las keywords usan word boundaries (\b) para evitar falsos positivos. Por ejemplo, “support” no coloreará “up” porque no es una palabra completa.

Capa 2: Banner Highlighting (Malva/Magenta)

PatrónEjemplo
VersionesVersion 8.5.10, Ver. 2.0, v1.2.3
CopyrightCopyright (c) 2005-2022 Company
URLshttp://..., https://...
FabricantesCisco, Juniper, Arista, Xirrus, Cambium, Ubiquiti, MikroTik, Fortinet, Palo Alto, Huawei
ProductosArrayOS, IOS, NX-OS, JunOS, Wi-Fi Array, Access Point, Controller
AvisosLíneas que empiezan con NOTICE:, IMPORTANT:, ATTENTION:, NOTE:, INFO:
DisclaimersFrases con “management system”, “managed by”, “configuration changes”, etc.

Códigos de Escape ANSI Completos

Formato: \x1b[<estilo>;<color>m  ...texto...  \x1b[0m (reset)

ESTILOS (primer número):
┌────────┬─────────────────────────────────────┐
│ Código │ Efecto                              │
├────────┼─────────────────────────────────────┤
│   0    │ Reset (normal)                      │
│   1    │ Bold (brillante/negrita)            │
│   2    │ Dim (tenue)                         │
│   3    │ Italic (cursiva)                    │
│   4    │ Underline (subrayado)               │
│   5    │ Blink (parpadeo lento)              │
│   6    │ Blink (parpadeo rápido)             │
│   7    │ Reverse (invertir fg/bg)            │
│   8    │ Hidden (oculto)                     │
│   9    │ Strikethrough (tachado)             │
└────────┴─────────────────────────────────────┘

COLORES FOREGROUND (texto):
┌────────┬─────────────┬────────┬─────────────────┐
│ Normal │ Color       │ Bright │ Color Brillante │
├────────┼─────────────┼────────┼─────────────────┤
│   30   │ Negro       │   90   │ Gris            │
│   31   │ Rojo        │   91   │ Rojo Claro      │
│   32   │ Verde       │   92   │ Verde Claro     │
│   33   │ Amarillo    │   93   │ Amarillo Claro  │
│   34   │ Azul        │   94   │ Azul Claro      │
│   35   │ Magenta     │   95   │ Magenta Claro   │
│   36   │ Cian        │   96   │ Cian Claro      │
│   37   │ Blanco      │   97   │ Blanco Brillante│
└────────┴─────────────┴────────┴─────────────────┘

COLORES BACKGROUND (fondo):
┌────────┬─────────────┬────────┬─────────────────┐
│ Normal │ Color       │ Bright │ Color Brillante │
├────────┼─────────────┼────────┼─────────────────┤
│   40   │ Negro       │  100   │ Gris            │
│   41   │ Rojo        │  101   │ Rojo Claro      │
│   42   │ Verde       │  102   │ Verde Claro     │
│   43   │ Amarillo    │  103   │ Amarillo Claro  │
│   44   │ Azul        │  104   │ Azul Claro      │
│   45   │ Magenta     │  105   │ Magenta Claro   │
│   46   │ Cian        │  106   │ Cian Claro      │
│   47   │ Blanco      │  107   │ Blanco Brillante│
└────────┴─────────────┴────────┴─────────────────┘

COLORES 256 (extendido):
  \x1b[38;5;<n>m  - Foreground color (0-255)
  \x1b[48;5;<n>m  - Background color (0-255)

COLORES RGB (true color):
  \x1b[38;2;<r>;<g>;<b>m  - Foreground RGB
  \x1b[48;2;<r>;<g>;<b>m  - Background RGB

Ejemplos de Uso

// Rojo brillante + negrita
'\x1b[1;31mERROR: Connection failed\x1b[0m'

// Verde con fondo negro
'\x1b[32;40mSUCCESS\x1b[0m'

// Magenta brillante (usado para banners)
'\x1b[1;35mCopyright (c) 2024 Company\x1b[0m'

// Combinaciones múltiples
'\x1b[1;4;33mWarning: Bold + Underline + Yellow\x1b[0m'

5.3.2 Anatomía de una Terminal (Elementos Técnicos)

┌─────────────────────────────────────────────────────────────────────────────┐
│ ┌─ Title Bar ─────────────────────────────────────────────────────────────┐ │
│ │  Terminal - user@host                                           [_][□][X]│ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ ┌─ Menu Bar (opcional) ───────────────────────────────────────────────────┐ │
│ │  File   Edit   View   Terminal   Help                                   │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ ┌─ Toolbar (opcional) ────────────────────────────────────────────────────┐ │
│ │  [New] [Copy] [Paste] [Settings]                                        │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ ┌─ Terminal Viewport / Screen Buffer ─────────────────────────────────────┐ │
│ │                                                                         │ │
│ │  user@hostname:~$ ls -la                    ◄── Command Line [VERDE]    │ │
│ │  total 48                                   ◄── Output / Stdout         │ │
│ │  drwxr-xr-x  5 user user 4096 Jan 28 10:00 .                            │ │
│ │  drwxr-xr-x 18 user user 4096 Jan 27 15:30 ..                           │ │
│ │  -rw-r--r--  1 user user  220 Jan 28 09:00 file.txt                     │ │
│ │                                                                         │ │
│ │  user@hostname:~$ _                         ◄── Cursor [CIAN]           │ │
│ │                    ▲                                                    │ │
│ │                    └── Prompt (PS1)                                     │ │
│ │                                                                       ▲ │ │
│ │                                                                       █ │◄─ Scrollbar
│ │                                                                       ▼ │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
│ ┌─ Status Bar (opcional) ─────────────────────────────────────────────────┐ │
│ │  Rows: 24  Cols: 80  |  UTF-8  |  Connected  |  00:15:32                 │ │
│ └─────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘

Leyenda de Colores del Diagrama:

ElementoColorCódigo ANSI
Command LineVerde\x1b[1;32m
CursorCian\x1b[1;36m

Glosario de Términos Técnicos

TérminoDescripción
Terminal EmulatorSoftware que emula un terminal físico (VT100, xterm, etc.)
PTY (Pseudo-Terminal)Interfaz del kernel que simula un terminal hardware
ShellIntérprete de comandos (bash, zsh, cmd, PowerShell)
ViewportÁrea visible del terminal (lo que ves en pantalla)
Screen BufferMemoria que almacena todo el output (incluyendo scroll-back)
Scroll-back BufferHistorial de líneas que han salido del viewport
CursorIndicador de posición de escritura (block █, underline _, bar |)
Prompt (PS1)Texto que indica que el shell espera input (ej: user@host:~$)
Command LineLínea donde el usuario escribe comandos
StdoutSalida estándar (output normal de comandos)
StderrSalida de errores (mensajes de error)
StdinEntrada estándar (input del usuario)
ANSI Escape CodesSecuencias especiales para controlar formato, color, cursor
Control CharactersCaracteres no imprimibles (Ctrl+C = \x03, Enter = \r\n)
Line Feed (LF)Salto de línea \n (Unix)
Carriage Return (CR)Retorno de carro \r (vuelve al inicio de línea)
CRLFCombinación \r\n (Windows)
Bell (BEL)Carácter \x07 que produce un sonido/alerta
Backspace (BS)Carácter \x08 que borra hacia atrás
Tab (HT)Tabulador horizontal \x09
Escape (ESC)Carácter \x1b que inicia secuencias de control
CSI (Control Sequence Introducer)Secuencia \x1b[ que precede comandos ANSI
SGR (Select Graphic Rendition)Comandos ANSI para colores y estilos
Row/LineLínea horizontal en el terminal
ColumnPosición horizontal (carácter) en una línea
CellUna posición (row, column) que contiene un carácter
GlyphRepresentación visual de un carácter
FontTipografía usada (monospace requerida para alineación)
Baud RateVelocidad de transmisión en terminales seriales (histórico)

Secuencias de Control Comunes

SecuenciaEfecto
\x1b[HMover cursor a inicio (home)
\x1b[2JLimpiar pantalla completa
\x1b[KLimpiar desde cursor hasta fin de línea
\x1b[<n>AMover cursor N líneas arriba
\x1b[<n>BMover cursor N líneas abajo
\x1b[<n>CMover cursor N columnas derecha
\x1b[<n>DMover cursor N columnas izquierda
\x1b[<row>;<col>HMover cursor a posición específica
\x1b[?25hMostrar cursor
\x1b[?25lOcultar cursor
\x1b[sGuardar posición del cursor
\x1b[uRestaurar posición del cursor

5.4 SFTP

EndpointMétodoDescripción
/sftp/listPOSTListar directorio remoto
/sftp/downloadGETDescargar archivo
/sftp/uploadPOSTSubir archivo
/sftp/readPOSTLeer archivo como texto
/sftp/writePOSTEscribir texto a archivo

Nota: SFTP usa la sesión SSH existente. El terminal debe estar conectado primero.

5.5 Network Tools (v6.0.0)

EndpointMétodoDescripción
/network/arp-tableGETLeer tabla ARP de Windows con vendors MAC OUI
/network/hostname?ip=XGETResolver hostname via DNS reverse lookup
/network/ping-icmp?host=XGETPing ICMP con latencia y pérdida de paquetes
/network/banner?host=X&port=YGETCapturar banner SSH y detectar vendor
/network/discoverPOSTDescubrimiento de dispositivos en subnet
/network/scanPOSTEscaneo de puertos con detección de servicios

ARP Table Response:

{
  "entries": [
    {
      "ip": "192.168.0.1",
      "mac": "00-11-22-33-44-55",
      "type": "dynamic",
      "vendor": "Cisco Systems"
    }
  ],
  "total": 15
}

Hostname Response:

{
  "ip": "192.168.0.1",
  "hostname": "router.local"
}

MAC OUI Vendors soportados: ~150+ fabricantes incluyendo Cisco, HP, Dell, Samsung, Amazon, Apple, Intel, Arista, Juniper, Xirrus, y más.

5.6 Administración

EndpointMétodoDescripción
/admin/uninstallPOSTDesinstalar agente (limpia registro + elimina directorio completo)

6. Integración con CreaRack Pro

6.1 Detección de IP Privada

El frontend detecta automáticamente si un dispositivo tiene IP privada:

function isPrivateIPAddress(ip) {
    if (!ip) return false;
    const parts = ip.split('.').map(Number);
    if (parts.length !== 4) return false;

    // 10.0.0.0/8
    if (parts[0] === 10) return true;
    // 172.16.0.0/12
    if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) return true;
    // 192.168.0.0/16
    if (parts[0] === 192 && parts[1] === 168) return true;
    // localhost
    if (parts[0] === 127) return true;

    return false;
}

6.2 Verificación de Estado

Para dispositivos con IP privada, el frontend usa el Local Agent:

async function checkViaLocalAgent(ip, port = 22) {
    try {
        const response = await fetch(
            `http://localhost:5050/check?host=${ip}&port=${port}`
        );
        const data = await response.json();
        return data.reachable;
    } catch (e) {
        return false; // Agent no disponible
    }
}

6.3 Backup de Configuración

Para dispositivos con IP privada, el backup se ejecuta via WebSocket:

// 1. Conectar al dispositivo via WebSocket
const ws = new WebSocket(`ws://localhost:5050/ws/terminal/${sessionId}`);

// 2. Enviar credenciales
ws.send(JSON.stringify({
    action: 'connect',
    host: device.ip,
    port: 22,
    username: credentials.username,
    password: credentials.password
}));

// 3. Esperar conexión, enviar comando
ws.send(JSON.stringify({
    action: 'data',
    data: 'show running-config\r\n'
}));

// 4. Recopilar output con idle detection
// 5. Guardar via POST /api/network/device/{id}/backup/save

7. Compilación

7.1 Requisitos

7.2 Usando build_agent.bat (Recomendado)

cd C:\dev\CreaRack_Pro_app_Django
build_agent.bat

El script:

  1. Verifica rutas de Python y PyInstaller
  2. Verifica que existen assets requeridos
  3. Limpia builds anteriores
  4. Instala dependencias (incluyendo Scrapli)
  5. Compila con:
    • Assets externos (--add-data para HTML/JSON)
    • Módulos Python (--add-data para agent_modules/)
    • Hidden imports para uvicorn, asyncssh, scrapli
  6. Copia a static/downloads/
  7. Limpia archivos temporales

7.3 Estructura del .exe Compilado

CreaRackAgent.exe (extrae en _MEIPASS/)
├── assets/
│   ├── terminal.html      # UI terminal con xterm.js + Asteroids
│   ├── debug.html         # Agent Home: Tools Hub (3 tabs, 7 herramientas)
│   └── oui_vendors.json   # MAC vendor database
└── agent_modules/
    ├── models.py
    ├── windows_integration.py
    ├── logging_handler.py
    ├── ssh_bridge.py
    ├── scrapli_manager.py
    ├── cluster_engine.py
    ├── network_utils.py
    ├── version.py
    ├── installer.py
    ├── auth_manager.py
    ├── offline_cache.py
    ├── monitoring_service.py
    └── saas_connector.py

7.4 Imports Condicionales (Frozen vs Dev)

Los módulos usan detección de modo frozen para imports:

import sys

if getattr(sys, "frozen", False):
    # Modo frozen (PyInstaller .exe)
    from models import DeviceTarget
    from logging_handler import logger
else:
    # Modo desarrollo (Python directo)
    from .models import DeviceTarget
    from .logging_handler import logger

7.5 Resultado


8. Arquitectura SaaS-Connected (v5.0.0+)

A partir de v5.0.0, el agente funciona como una plataforma de monitoreo distribuido conectada al SaaS.

8.1 Diagrama de componentes

┌─────────────────────────────────────────────────────────────────────┐
│                        LOCAL AGENT v6.0.0                            │
├─────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  ┌───────────────┐  ┌───────────────┐  ┌─────────────────────────┐  │
│  │  Installer    │  │  Agent Core   │  │  Monitoring Service     │  │
│  │               │  │               │  │                         │  │
│  │  - Toast UI   │  │  - FastAPI    │  │  - Ping Worker          │  │
│  │  - Version    │  │  - WebSocket  │  │  - SNMP Worker          │  │
│  │  - Auto-update│  │  - SSH/SFTP   │  │  - HTTP Worker          │  │
│  └───────────────┘  └───────────────┘  └─────────────────────────┘  │
│                                                                      │
│  ┌───────────────┐  ┌───────────────┐  ┌───────────────┐           │
│  │  Auth Manager │  │ Offline Cache │  │ SaaS Connector│           │
│  │               │  │               │  │               │           │
│  │  - DPAPI      │  │  - SQLite     │  │  - WebSocket  │           │
│  │  - JWT        │  │  - Sync       │  │  - Heartbeat  │           │
│  │  - Refresh    │  │  - Cleanup    │  │  - Reconnect  │           │
│  └───────────────┘  └───────────────┘  └───────────────┘           │
│                                                                      │
└──────────────────────────────┬──────────────────────────────────────┘
                               │ WebSocket + HTTPS
                               ▼
┌─────────────────────────────────────────────────────────────────────┐
│                         CREARACK SAAS                                │
│  Agent API Gateway · Monitoring Targets · VictoriaMetrics · WS Hub  │
└─────────────────────────────────────────────────────────────────────┘

8.2 Módulos v5.0.0+

MóduloArchivoDescripción
Installerinstaller.pyToast de confirmación en primera ejecución, comparación de versiones, auto-update silencioso
Auth Managerauth_manager.pyAlmacenamiento seguro con Windows DPAPI, JWT con refresh automático
Offline Cacheoffline_cache.pySQLite local para métricas. Triple retention (48h synced, 7d fast, 30d standard). Sync automático al reconectar
Monitoringmonitoring_service.pyWorkers async para ping (icmplib), SNMP y HTTP. Controlado remotamente por el SaaS
SaaS Connectorsaas_connector.pyWebSocket persistente con reconexión exponencial y heartbeat cada 30s

8.3 SNMP Bandwidth Polling (Sentinel)

El módulo sentinel/snmp_bandwidth.py pollea contadores de interfaz cada 60s para calcular throughput en Mbps.

Pipeline completo:

AutoConfigService              Consumer                  Agent Sentinel
──────────────────             ────────                  ──────────────
_select_primary_interface() →  config.snmp_interface →   SentinelTarget.snmp_interface
  Elige ifIndex de gig1         Envía en update_targets    Construye OIDs con {ifIndex}
  (excluye wds/bridge/lo)       via WebSocket              Pollea 8 OIDs (HC+legacy+errors+discards)
                                + v3 credentials           Calcula Mbps = delta × 8 / dt / 1M
                                (si snmp_version == v3)    Envía métricas a SaaS → VictoriaMetrics

8 OIDs polleados por target (en un solo SNMP GET):

HC→Legacy Fallback: Si HC delta = 0 pero legacy delta > 0, usa legacy. Necesario para Xirrus APs donde ifHCInOctets devuelve 0 permanentemente en interfaces ethernet.

Baseline reset: Cuando snmp_interface cambia en update_targets(), se borran los contadores previos (_snmp_prev_counters) para evitar spikes por cambio de interfaz.

Spike protection: Rates > 10 Gbps descartados y baseline reseteado. Error/discard rates > 100k/min descartados.

Métricas escritas en VictoriaMetrics:

Métrica AgentMétrica VMUnidad
snmp_insnmp_bandwidth_in_mbpsMbps
snmp_outsnmp_bandwidth_out_mbpsMbps
snmp_errorssnmp_interface_errors_per_minerrors/min
snmp_discardssnmp_interface_discards_per_mindiscards/min

8.4 Protocolo WebSocket (SaaS ↔ Agent)

Mensajes del SaaS al Agent:

TipoPayloadDescripción
START_MONITORING{ targets: [...] }Inicia monitoreo con lista de targets
STOP_MONITORING—Detiene todo el monitoreo
UPDATE_TARGETS{ targets: [...] }Actualiza targets sin reiniciar
PING_NOW{ target_id: X }Check manual inmediato
GET_STATUS—Solicita estado del agente

Mensajes del Agent al SaaS:

TipoPayloadDescripción
AGENT_HELLO{ agent_id, version, capabilities }Identificación al conectar
METRICS{ batch: [{target_id, metric_type, value, timestamp}] }Batch de métricas
ALERT{ target_id, alert_type, message }Alerta de target caído
STATUS{ state, targets_count, uptime }Estado del agente
HEARTBEAT{ timestamp, sentinel_active }Keepalive cada 30s + estado Sentinel

8.5 Flujo de auto-instalación

Ejecutar .exe → ¿Desde %APPDATA%? → SÍ → Iniciar normalmente
                                   → NO → ¿Versión instalada?
                                           → No existe → Toast confirmación → Instalar
                                           → Misma → "Ya tienes la última versión"
                                           → Más antigua → Auto-update silencioso
                                           → Más nueva → "Tienes versión más reciente"

8.6 Multi-Profile SaaS Toggle (v1.0.0)

El agente puede almacenar credenciales para múltiples instancias SaaS (ej: localhost y producción) y cambiar entre ellas sin reinstalar.

Almacenamiento: profiles.enc (DPAPI cifrado, junto a credentials.enc)

Endpoints:

EndpointMétodoDescripción
/saas/profilesGETLista perfiles conocidos (URL, agent_id, is_active)
/saas/switchPOSTCambia al perfil indicado por saas_url y reconecta
/saas/register-profilePOSTRegistra perfil sin activarlo (para setup inicial)

UI: Card “SaaS Connection” en la tab Status de http://localhost:5050/:

Flujo de setup inicial (una sola vez por entorno):

1. Agent vinculado a localhost:8000 (auto-link desde Observatory local)
   → Perfil "http://localhost:8000" guardado automáticamente

2. Abrir link "Online" en Agent UI → abre crearack.com/monitoring/?setup_agent=1
   → Observatory llama POST /saas/register-profile (NO cambia el activo)
   → Perfil "https://crearack.com" guardado

3. Ambos perfiles cached → Toggle funciona libremente

Flujo de switch:

POST /saas/switch { "saas_url": "https://crearack.com" }
  1. AuthManager carga credenciales del perfil
  2. Guarda como credentials.enc (activo)
  3. SaaSConnector desconecta WebSocket actual
  4. setup_saas_connection() reconecta al nuevo SaaS
  5. Si Sentinel activo → SyncManager se reinicia

9. Seguridad

9.1 Scope de Acceso

El agente solo escucha en 127.0.0.1:5050, no es accesible desde la red.

9.2 CORS

Configurado con allow_origins=["*"] para permitir requests desde cualquier origin (localhost, crearack.com, etc.).

9.3 CSP (Content Security Policy)

frame-ancestors 'self'
  http://localhost:8000 http://127.0.0.1:8000
  http://localhost:5000 http://127.0.0.1:5000
  http://localhost:5002 http://127.0.0.1:5002
  https://crearack.com https://*.crearack.com;

9.4 Credenciales


10. Troubleshooting

El agente no inicia

  1. Verificar que puerto 5050 no está en uso
  2. Revisar logs en %APPDATA%\CreaRackAgent\agent.log
  3. Verificar que no hay otra instancia corriendo

Conexión SSH falla

  1. Verificar credenciales
  2. Verificar que el dispositivo es alcanzable (/check endpoint)
  3. Verificar que SSH está habilitado en el dispositivo

El panel de debug no carga

  1. Abrir http://localhost:5050/ (no https)
  2. Verificar que el agente está corriendo
  3. Revisar consola del navegador para errores

Backup tarda mucho

El sistema usa idle detection (1.5s de inactividad = completado). Si el dispositivo tarda en responder, el backup puede parecer lento. Esto es normal para dispositivos con mucha configuración.


11. Cluster Mode API

10.1 Endpoints de Cluster

EndpointMétodoDescripción
/cluster/statusGETEstado del engine y vendors soportados
/cluster/executePOSTEjecutar comando en múltiples dispositivos
/cluster/scriptPOSTEjecutar script en múltiples dispositivos
/cluster/healthPOSTVerificar conectividad de múltiples dispositivos
/cluster/backupPOSTBackup de múltiples dispositivos
/execute/singlePOSTEjecutar comando en un solo dispositivo

10.2 Ejemplo: Cluster Execute

curl -X POST http://localhost:5050/cluster/execute \
  -H "Content-Type: application/json" \
  -d '{
    "devices": [
      {"ip": "192.168.1.1", "username": "admin", "password": "xxx", "vendor": "cisco_ios"},
      {"ip": "192.168.1.2", "username": "admin", "password": "xxx", "vendor": "arista_eos"}
    ],
    "command": "show version"
  }'

Respuesta:

{
  "status": "completed",
  "command": "show version",
  "total_devices": 2,
  "success_count": 2,
  "failed_count": 0,
  "total_time_seconds": 1.45,
  "results": [
    {"device": "192.168.1.1", "ip": "192.168.1.1", "vendor": "cisco_ios", "success": true, "output": "...", "elapsed_seconds": 0.8},
    {"device": "192.168.1.2", "ip": "192.168.1.2", "vendor": "arista_eos", "success": true, "output": "...", "elapsed_seconds": 0.7}
  ]
}

10.3 Vendors Soportados (Scrapli)

VendorPlatform ID
Cisco IOS/IOS-XEcisco_ios, cisco_iosxe
Cisco NX-OScisco_nxos
Arista EOSarista_eos
Juniper Junosjuniper_junos
Genéricogeneric

12. Changelog

v2.0.6 (03-03-2026) — Zero-Intervention Token Recovery (Layer 3 Auto-Reauth)

Problema: Si ambos tokens (access + refresh) expiran — por ejemplo, equipo apagado >30 días o SaaS offline prolongado — el Agent quedaba atrapado sin poder auto-recuperarse. Requería intervención manual (“Reauth” en Fleet Manager).

Objetivo: Zero intervención del usuario en el manejo del Agent.

Layer 3 Auto-Reauth (core/auth.py):

SaaS: Nuevo endpoint (terminal/api.py):

SaaS: TTLs extendidos (terminal/api.py):

Resumen de capas de protección:

CapaMecanismoCuándo actúa
Layer 1Agent proactive refresh (75% lifetime)Token al 75% de vida (~54h)
Layer 2SaaS WS push (<2h remaining)Token <2h restantes
Layer 3Auto-reauth via DPAPI credentialsAmbos tokens expirados

Resultado: El Agent puede auto-recuperarse de CUALQUIER escenario de tokens expirados sin intervención humana.

v2.0.8 (04-03-2026) — Heartbeat Sentinel Status Reporting

Problema: Tras un fallo transitorio de DNS o reconexión WebSocket, el Observatory mostraba Sentinel como “desconectado” aunque el Agent estuviera activo y ejecutando loops Sentinel localmente. El estado sentinel_active solo se enviaba una vez al conectar el WS (_send_agent_status()), así que cualquier pérdida de ese mensaje dejaba el estado stale en la DB del SaaS.

Heartbeat mejorado (connector.py):

SaaS Consumer (consumers.py):

Resultado: Si el WS se desconecta y reconecta (DNS hiccup, deploy, suspensión), el estado Sentinel se corrige automáticamente en el siguiente heartbeat (~30s).

v2.0.5 (03-03-2026) — Sleep/Wake Recovery for Windows Suspension

Problema: Tras suspender/hibernar Windows, el Agent se “congelaba” ~5 minutos antes de volver a enviar datos. Causas: circuit breaker acumulaba fallos pre-sleep, SNMP baselines corruptas (dt enorme), WebSocket heartbeat fallaba antes de que la NIC estuviera lista, sync manager asumia conectividad activa.

Sleep/Wake Detector (config.py + scheduler.py):

Sentinel Loops (5 archivos):

Connector Heartbeat (connector.py):

Sync Manager (sync.py):

Resultado: De ~5 minutos de congelacion → <15 segundos tras wake.

v2.0.12 (06-03-2026) — metrics.db Triple Retention + Purge UI

v2.0.11 (06-03-2026) — SSH Session Persistence + Clipboard Fix

v2.0.4 (02-03-2026) — Debug Console Pro + Token Status + Fleet Reauth

Agent debug.html:

SaaS Fleet Manager (base.js):

v1.0.0 (18-02-2026) — First Production Release

v6.5.1 (13-02-2026)

v6.5.0 (13-02-2026)

v6.4.0 (12-02-2026)

v6.3.0 (10-02-2026)

v6.2.0 (10-02-2026)

v6.1.0 (09-02-2026)

v6.0.9 (09-02-2026)

v6.0.8 (09-02-2026)

v6.0.7 (07-02-2026)

v6.0.0 (05-02-2026)

v5.0.9 (05-02-2026)

v4.3.1 (29-01-2026)

v4.3.0 (29-01-2026)

v4.0.6 (28-01-2026)

v4.0.5 (27-01-2026)

v4.0.0 (27-01-2026)

v3.0.1 (28-01-2026)

v3.0.0 (26-01-2026)


Documento relacionado: NETWORK_MANAGEMENT_IMPLEMENTATION.md

Véase también

Subir