Agente · dev-auto-provision
Propósito
Desarrollo y mantenimiento del módulo Auto-Provision de CreaRack-Pro.
Cubre la app network/, el pipeline de descubrimiento de dispositivos, la base de datos de vendors y las integraciones con Observatory, Rack Editor y Wireless Monitor.
Estructura de archivos
Backend
network/
├── models.py # DeviceProfile, VendorProfile, CustomMib
├── api/
│ ├── discovery.py # Endpoints de discovery
│ ├── profiles.py # CRUD perfiles + configuración
│ ├── vendor.py # CRUD vendors + custom MIBs
│ └── common.py # Schemas Pydantic (DeviceProfileOut, etc.)
└── services/
├── device_discovery.py # DeviceDiscoveryService — pipeline 6 etapas
├── auto_config.py # AutoConfigService — configure-observatory + stencil
├── vendor_registry.py # VendorProfileRegistry — L1/L2 cache + lookups
├── port_config_reader.py # PortConfigReader — SNMP Q-BRIDGE + SSH
├── mib_manager.py # MibManager — pysmi download/compilation
└── oui_lookup.py # MAC OUI vendor lookup (38,893 entries)
Frontend
static/js/network/
├── auto_provision.js # AutoProvisionWizard class (orquestador)
└── auto_provision/
├── discovery.js # Lógica discovery (~650 LOC)
├── results.js # Tabla de resultados (~400 LOC)
├── actions.js # Acciones batch (~350 LOC)
├── deep_discovery.js # MIB upload + OID probe (~500 LOC)
└── sessions.js # Persistencia localStorage (~200 LOC)
Modelos
DeviceProfile
~40 campos. Almacena todo lo descubierto sobre un dispositivo.
Campos clave:
ip_address,mac_address,hostname,vendor,model,serial_numberos_type,os_version,device_type(router/switch/firewall/access_point/other)supports_snmp,supports_sshconfidence_score(0-100)snmp_community,snmp_version,snmp_v3_*(credenciales v3)interfaces(dict ifIndex→data),lldp_neighbors,cdp_neighborsdeep_snmp_data(JSONField — datos extendidos por categoría)discovery_method(ping/snmp/ssh/http)
VendorProfile
Base de datos de vendors. 17 curated (priority 10-90) + ~1,600 IANA (priority 100+).
Campos clave:
slug,display_name,aliasessnmp_communities— comunidades vendor-specificsys_descr_patterns— regex para sysDescrsys_object_id_prefix— prefijo OID enterprisescrapli_platform— plataforma SSHdeep_discovery_oids— OIDs extendidos por categoríamonitoring_oids,fast_poll_oids— para Observatory
Pipeline de descubrimiento (6 etapas)
DeviceDiscoveryService en network/services/device_discovery.py:
Stage 1: ICMP Ping → Verificar alcanzabilidad + RTT
Stage 2: SNMP Probing → sysDescr, sysObjectID, ifTable, hardware OIDs
Stage 3: SSH Fallback → show version/inventory/interfaces (si SNMP falla)
Stage 4: LLDP/CDP → Descubrimiento de vecinos
Stage 5: Stencil Match → Fuzzy matching con stencils del Rack Editor
Stage 6: Confidence → Calcular score 0-100%
Stage 2 — SNMP Probing
SNMPv2c (default):
- Community rotation: prueba community proporcionada → vendor-specific → fallbacks genéricos
- sysObjectID → lookup O(1) en VendorProfileRegistry por prefijo enterprise
- sysDescr → regex matching contra
VendorProfile.sys_descr_patterns - ifTable walk → nombres, tipos, velocidades, MTUs
- Hardware OIDs → CPU, memoria (HOST-RESOURCES-MIB)
SNMPv3 (cuando snmp_version == 'v3'):
- Credenciales directas via
UsmUserData— NO rota communities build_snmp_auth()ennetwork/services/device_discovery/snmp_auth.py- Si falla → error
snmpv3_auth_failed(no fallback a v2c)
Confidence Scoring
| Dato descubierto | Puntos |
|---|---|
| Ping success | +10 |
| SNMP response | +20 |
| sysDescr match | +10 |
| Modelo detectado | +15 |
| Vendor detectado | +10 |
| Hostname detectado | +5 |
| Interfaces > 0 | +5 |
| Hardware data | +5 |
| LLDP/CDP data | +5 |
| SNMP method verification | +5 |
| Máximo | 100 |
Vendor autodetect pipeline (prioridad)
- sysObjectID → enterprise OID prefix lookup (más fiable)
- sysDescr → regex patterns (fallback SNMP)
- Device
stencil_namedel Rack Editor vinculado (cuando no hay SNMP) - HTTP fingerprint → headers + body patterns (14 vendors)
- MAC OUI → IEEE database (último recurso)
⚠ El vendor siempre se resuelve automáticamente. NO hay selector manual de vendor en el wizard.
Deep Discovery (Stage 7, on-demand)
Activado via POST /profiles/{id}/deep-discover:
- Descarga MIBs vendor-specific via pysmi
- SNMP walks/gets extendidos por categoría: hardware, vlans, wireless, clients, ssids, cpu, memory, environment
- Almacena en
DeviceProfile.deep_snmp_data(JSONField) - Límite: máximo 200 OIDs por vendor (
MAX_DEEP_DISCOVERY_OIDS) - Dispatch: via WebSocket al Agent Primary (
mode: "ws") o REST directo (mode: "rest")
API Endpoints — Discovery y Profiles (21 endpoints)
Discovery
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/network/auto-provision/discover | Discovery completo 1 dispositivo (6 etapas) |
| POST | /api/network/auto-provision/bulk-enrich | Enriquecimiento rápido múltiples hosts (max 5 paralelos) |
| POST | /api/network/auto-provision/bulk-discover | Subnet completa CIDR /20-/30 (max 20 concurrentes) |
| POST | /api/network/auto-provision/profiles/{id}/deep-discover | Deep discovery on-demand |
| GET | /api/network/auto-provision/profiles/{id}/deep-discover-status | Estado job deep discovery |
Profile Management
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/network/auto-provision/profiles | Lista perfiles (filtros: vendor, device_type, min_confidence) |
| GET/PUT/DELETE | /api/network/auto-provision/profiles/{id} | CRUD perfil |
| GET | /api/network/device-profile/by-device/{device_id} | Perfil vinculado a Device del Rack Editor |
Configuration
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/network/auto-provision/profiles/{id}/configure-observatory | Auto-crear MonitoringTarget |
| POST | /api/network/auto-provision/profiles/{id}/suggest-stencil | Fuzzy match stencil |
| GET | /api/network/auto-provision/profiles/{id}/validation | Validar calidad del perfil |
| POST | /api/network/auto-provision/profiles/{id}/propagate-ports | Propagar interfaces al Rack Editor |
| POST | /api/network/device-profile/{id}/read-port-config | Leer config puertos via SNMP Q-BRIDGE o SSH |
| POST | /api/network/device-profile/{id}/refresh-interfaces | Re-escanear ifTable sin redescubrir |
Vendor Profiles
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/network/vendor-profiles/ | Lista todos los vendors |
| GET/POST/PUT | /api/network/vendor-profiles/{slug}/ | CRUD vendor |
| GET | /api/network/vendor-profiles/communities | Todas las communities (deduplicadas) |
| POST | /api/network/vendor-profiles/{slug}/upload-mib | Subir y compilar MIB custom (max 200 OIDs) |
| GET | /api/network/vendor-profiles/{slug}/custom-mibs | Lista MIBs custom |
| POST | /api/network/vendor-profiles/{slug}/custom-mibs/{id}/apply-oids | Aplicar OIDs seleccionados |
MAC OUI
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/network/mac/oui-lookup | Batch lookup MACs → vendor (max 500) |
Integración con Observatory
POST /configure-observatory → AutoConfigService:
- Crea/actualiza
MonitoringTargetconping_enabled=True+snmp_enabled=True - Auto-selecciona interfaz física primaria via
_select_primary_interface() - Copia
monitoring_oidsyfast_poll_oidsdel VendorProfile al config del target - Notifica Agent via WebSocket (
update_targets)
Pipeline selección de interfaz SNMP (_select_primary_interface)
DeviceProfile.interfaces (dict ifIndex→data)
↓
1. Excluir virtuales: wds, bridge, br-, lo, loopback, null, vlan, tunnel,
tun, tap, bond, lag, port-channel, management, mgmt, iap, bvi,
nve, stack, cpu, internal, unrouted
↓
2. Preferir físicas: gig, eth, ge-, xe-, te-, fa, gigabitethernet,
fastethernet, tengigabitethernet
↓
3. Ordenar: physical first → UP status (ifOperStatus=1) → mayor ifSpeed
↓
4. Retorna primer candidato como config.snmp_interface (ifIndex)
Quirks por vendor (ifIndex conocidos)
| Vendor/Modelo | ifIndex gig1 | ifIndex gig2 | Nota |
|---|---|---|---|
| Xirrus XR4847 | 28 | 20 | HC counters siempre 0, usa legacy |
| Xirrus XR4836/XR4830 | 33 | 23 | Mismo quirk HC |
| Xirrus XR630 | 24 | — | Single uplink |
| Cambium XE3-4 | 5 o 8 | — | HC counters funcionan |
Más quirks en
backend/MULTI_VENDOR_SNMP_GUIDE.md §4
Integración con Rack Editor
DeviceProfile → "Add to Rack" → floating panel
├── auto-fill name + management_config (IP)
├── auto-select stencil sugerido (fuzzy match)
└── propagate interfaces → enriched port format
{label, live: {vlan, description, speed, mode}, desired: {...}}
Integración con Local Agent (producción)
En producción el SaaS no puede alcanzar IPs privadas. El Agent actúa como proxy de red.
5 fases via Agent (localhost:5050):
| Fase | Endpoint Agent | Descripción |
|---|---|---|
| 1 | POST /network/ping-icmp | Ping sweep |
| 2 | POST /network/arp-table | MAC addresses ARP |
| 3 | POST /network/snmp-discover | SNMP bulk (sysDescr, ifTable) |
| 4 | POST /network/http-fingerprint | HTTP headers + body |
| 5 | SaaS /bulk-enrich | Enrichment final + scoring |
⚠ Confidence 10-20% en todos los dispositivos = Agent no conectado o no accesible. Verificar Fleet Manager en Observatory.
Dos modos de descubrimiento
| Modo | Endpoint | Tiempo típico |
|---|---|---|
| Single Device | POST /discover | ~5-10s |
| Subnet Scan | POST /bulk-discover CIDR /20-/30 | ~1-2 min para /24 |
Bulk-enrich concurrencia: max 5 paralelos (semáforo), usa quick_mode=True (~2s/device).
Persistencia de sesiones (frontend)
- Scans guardados en
localStorage["auto_provision_scans"](máx 20 sesiones) - Session keepalive cada 60s durante scans activos
- “Load Previous Results” para restaurar scans anteriores
Vendors curated (17)
Xirrus, Cambium, Cisco, Juniper, Arista, Huawei, HP, Ubiquiti, MikroTik, Fortinet, Palo Alto, Ruckus, Meraki, Dell, Netgear, TP-Link, ZyXEL.
Troubleshooting frecuente
| Problema | Causa | Solución |
|---|---|---|
| Confidence 10-20% generalizado | SaaS no alcanza IPs privadas | Verificar Agent conectado en Fleet Manager |
| SNMP timeout | Community incorrecta o ACL | Probar community del vendor |
| Cambium 10% | HTTP-only sin SNMP | Configurar community Cambium o habilitar SNMP |
| Xirrus ifTable vacía | Interfaces virtuales filtradas | Normal — solo gig1/gig2 son físicas |
| Deep Discovery 0 resultados | Agent WS desconectado | Reconectar Agent: POST /saas/reconnect |
| Bulk scan lento >2min | Daphne timeout | Verificar --http-timeout 300 en docker-compose |
API Endpoints adicionales (38 endpoints)
Endpoints de network/ no cubiertos en la seccion principal (discovery/profiles/vendors).
Devices (/api/network/device/)
| Metodo | Endpoint | Proposito |
|---|---|---|
| GET | /device/{id}/details | Detalles dispositivo (IP, vendor, credenciales) para SSH client |
| GET | /device/{id}/credentials | Descifrar credenciales del dispositivo |
| GET | /device/{id}/network-config | Config de gestion (IP, protocolo, puerto) |
| POST | /device/{id}/network-config | Guardar config de gestion (admin only) |
| POST | /device/{id}/status | Actualizar estado (llamado por Health Monitor) |
| GET | /device/{id}/status | Estado actual sin health check |
| POST | /device/{id}/check | Forzar health check SSH (3s timeout) |
| GET | /status | Lista todos los dispositivos gestionados (legacy) |
Port Connections (/api/network/port-connections/)
| Metodo | Endpoint | Proposito |
|---|---|---|
| GET | /port-connections/switches | Listar switches con puertos (filtro: rack_id) |
| GET | /port-connections/available-ports/{device_id} | Puertos libres de un switch |
| GET | /port-connections/suggest/{profile_id} | Auto-sugerir puerto via LLDP/CDP |
| GET | /port-connections | Listar conexiones profile→port (filtros: device_id, profile_id) |
| POST | /port-connections | Crear asignacion profile→puerto |
| GET | /port-connections/rack-devices | Listar dispositivos para UI dropdowns |
| GET | /port-connections/device | Listar conexiones device-to-device (bidireccional) |
| POST | /port-connections/device | Crear conexion device-to-device con metadata cable |
| DELETE | /port-connections/{id} | Eliminar conexion |
Schemas:
PortConnectionIn(device_id, port_key, profile_id, notes),DeviceConnectionIn(+ cable_type, cable_color, cable_length)
Cable Report (/api/network/cable-report/)
| Metodo | Endpoint | Proposito |
|---|---|---|
| GET | /cable-report | Informe JSON de cables y conexiones |
| GET | /cable-report/markdown | Descarga informe Markdown |
| GET | /cable-report/html | HTML standalone con diagrama Mermaid |
Query params:
scope(device/rack/all),id(device_id o rack_id)
Device Groups (/api/network/device-groups/)
| Metodo | Endpoint | Proposito |
|---|---|---|
| GET | /device-groups | Listar grupos de dispositivos |
| POST | /device-groups | Crear grupo (admin/operator) |
| PUT/POST | /device-groups/assign | Asignar dispositivos a grupos (bulk) |
| DELETE | /device-groups/{id} | Eliminar grupo (admin only) |
Backups (/api/network/backup/)
| Metodo | Endpoint | Proposito |
|---|---|---|
| GET | /device/{id}/backups | Listar backups de un dispositivo |
| GET | /backup/{id}/view | Ver contenido completo de un backup |
| POST | /backup/compare | Diff unificado entre dos backups |
| POST | /device/{id}/backup/trigger | Disparar backup (Cloud o Local Agent) |
| POST | /device/{id}/backup/save | Guardar config desde Local Agent |
| POST | /backup/{id}/restore | Restaurar backup a dispositivo (placeholder) |
| DELETE | /backup/{id}/delete | Eliminar backup (admin only) |
| GET | /backup/{id}/download | Descargar backup como .txt |
Patron Cloud/Agent:
triggerdevuelve 422 +USE_LOCAL_AGENTpara IPs privadas.
Scripts (/api/scripts/)
| Metodo | Endpoint | Proposito |
|---|---|---|
| GET | / | Listar templates (filtro: language) |
| POST | / | Crear template (admin/operator) |
| POST | /seed | Generar 5 templates por defecto |
| PUT | /{id} | Actualizar template |
| DELETE | /{id} | Eliminar template (admin only) |
| POST | /{id}/execute | Ejecutar script en dispositivo (Cloud/Agent hibrido) |
Router montado en
/api/scripts/(separado de/api/network/). Misma logica 422USE_LOCAL_AGENTpara IPs privadas.
Convenciones y restricciones
- El vendor siempre se resuelve automáticamente — no añadir selector manual
- SNMPv3: no hacer fallback a v2c si falla — retornar
snmpv3_auth_failed MAX_DEEP_DISCOVERY_OIDS = 200— no superar este límite por vendor_select_primary_interface()es la única fuente de verdad parasnmp_interface— no hardcodear ifIndex- Cambio de
snmp_interfaceenupdate_targets→ resetear baseline de contadores SNMP en Agent (evita spikes) - Formato enriched ports para Rack Editor:
{label, live: {vlan, description, speed, mode}, desired: {...}}
Véase también
- [[concept—network—auto-provision]] — concepto de auto-descubrimiento de red
- [[crearack-tech—backend—auto-provision-guide]] — guía técnica de Auto-Provision
- [[crearack—network—auto-provision-wizard]] — wizard de Auto-Provision
- [[crearack-tech—backend—multi-vendor-snmp-guide]] — SNMP multi-vendor
- [[entity—network—model—deviceprofile]] — perfil de dispositivo descubierto
- [[entity—network—model—vendorprofile]] — vendor y sus MIBs asociadas
- [[entity—network—model—custommib]] — MIB personalizada compilada
- [[crearack-tech—guides—port-assignment-guide]] — asignación de puertos físicos