Volver a la wiki

Fix Auto-Provision Refresh: Re-descubrimiento vía Local Agent

Problema

El botón Refresh en el panel de Auto-Provision (Parte 4a) llamaba a un endpoint server-side:

POST /auto-provision/profiles/{id}/rediscover

Este endpoint ejecutaba el descubrimiento completo (Ping, ARP, SNMP, HTTP) en el servidor PROD (Hetzner) reutilizando las credenciales SNMP/SSH del DeviceProfile.

Pero el problema: los dispositivos a descubrir viven en la LAN privada del cliente (IPs privadas: 10.x.x.x, 192.168.x.x, 172.16.x.x), y el servidor PROD no alcanza esas redes. Resultado: Device 10.4.4.2 is not reachable → respuesta 400.

Los tests de CI mockeaban DeviceDiscoveryService.provision_device(), por lo que pasaban en verde sin detectar el problema.

Solución

El descubrimiento DEBE ir siempre por el Local Agent (cliente), igual que el escaneo de subred normal. El servidor nunca debe intentar ping/nmap/SNMP directo: esas redes son inaccesibles.

Cambios realizados

1. Nuevo método _agentProbeIp() en discovery.js

Probe silencioso vía Local Agent sin modificar la UI del wizard. Fases:

  1. ICMP Ping → http://localhost:5050/network/ping-icmp?host=<ip>
  2. ARP lookup → http://localhost:5050/network/arp-table?subnet=10.4.4.0
  3. SNMP discover → POST http://localhost:5050/network/snmp-discover con múltiples communities (guardada + vendor-specific + públicas)
  4. HTTP fingerprint → POST http://localhost:5050/network/http-fingerprint (opcional)

Devuelve objeto:

{
  pingResult: { reachable: true, rtt_ms: 2.5 },
  arpData: { mac: "00:11:22:33:44:55", vendor: "Cisco Systems" },
  snmpData: { sysDescr: "...", sysObjectID: "...", ... },
  httpData: { ports: [...], certificates: [...], ... }
}

Reutiliza la community SNMP guardada en el profile + intenta fallback a communities conocidas.

2. refreshProfile() en deep_discovery.js — client-side

Flujo nuevo:

  1. Obtiene credenciales SSH guardadas (endpoint GET /api/network/auto-provision/profiles/{id}/credentials).
  2. Llama _agentProbeIp(ip, { snmpCommunity }) → ejecuta probe en el cliente.
  3. Construye payload compatible con el endpoint normal /api/network/auto-provision/discover:
    {
      ip,
      snmp_community,
      mac_address,
      vendor_hint,
      rtt_ms,
      snmp_data,
      http_data,
      ssh_username,
      ssh_password,
      snmp_version, // 'v2c' o 'v3'
      snmp_v3_*     // si aplica
    }
  4. Reutiliza el mismo endpoint de enriquecimiento que el discovery normal → actualiza el DeviceProfile in-place.

3. Eliminación de /auto-provision/profiles/{id}/rediscover

Se retira completamente:

El código es architecturally broken para el caso real (LAN privada) y fue un patrón de error que pasó por fallback de mocks en CI.

Impacto arquitectónico

Coherencia: ahora TODO el discovery (escaneo + refresh) es vía Local Agent, eliminando dependencia de conectividad PROD→LAN cliente.

Requisitos para el Local Agent

El Local Agent debe implementar estos endpoints (accesibles en http://localhost:5050/):

Si el Local Agent no está disponible, _agentProbeIp() lanza: "Local Agent not available. Please start CreaRackAgent.exe".

Testing

Véase también

Subir