Volver a la wiki

Multi-Vendor SNMP Support — Guia Tecnica

Multi-Vendor SNMP Support — Guia Tecnica

Fecha: 13-03-2026 Version: v1.0.37 Archivos clave:


Resumen

Sistema de 3 niveles para soportar >90% de equipos de datacenter via SNMP sin intervencion manual del usuario:

NivelDescripcionCobertura
1. Pre-built Profiles1,605 VendorProfiles con OIDs estandar + vendor-specific~70-80%
2. MIB AssistantGemini Flash analiza MIBs subidos y propone OID mappings+15-20%
3. Auto-DiscoveryPattern matching + heuristics para vendors desconocidos+5-10%

Nivel 1: Pre-built VendorProfiles

Migrations

MigrationDescripcion
0032_enrich_all_vendor_profilesStandard MIBs (ENTITY-MIB, IF-MIB, LLDP-MIB) para TODOS + vendor-specific para 10 principales
0033_infrastructure_vendor_profilesNuevos perfiles: APC, Eaton, CyberPower, Synology, QNAP, Aruba, Extreme, Vertiv, Raritan
0034_generic_fallback_profilePerfiles genericos: generic, generic-ups, generic-printer
0035_fix_infra_vendor_oidsFix OIDs para vendors que ya existian en DB

Perfiles por Categoria

WiFi Access Points: Cisco, Aruba, Ruckus, Ubiquiti, Meraki, Fortinet, MikroTik, Cambium, Xirrus, Extreme, HP, TP-Link, Zyxel, D-Link, Netgear

Switches/Routers: Cisco, Juniper, Arista, Huawei, HP/ProCurve, Dell, MikroTik

Firewalls: Fortinet (FortiGate), Palo Alto, Cisco ASA

UPS: APC/Schneider, Eaton, CyberPower, Vertiv/Liebert + generic-ups (UPS-MIB RFC 1628)

PDU: APC, Raritan + generic

NAS/Storage: Synology, QNAP + generic

Impresoras: generic-printer (Printer-MIB RFC 3805)

Standard MIBs (todos los vendors)

Todas las 1,605 VendorProfiles incluyen deep_discovery_oids con:

MIBCategoriaOIDs
SNMPv2-MIBsystemsysDescr, sysObjectID, sysName, sysLocation, sysContact
ENTITY-MIBhardwaremodelName, serialNum, softwareRev, hardwareRev, physicalDescr
IF-MIBinterfacesifDescr, ifType, ifSpeed, ifOperStatus, ifName, ifAlias
LLDP-MIBneighborslldpRemSysName, lldpRemPortId, lldpRemChassisId

SNMPv3 Support (v1.0.37)

Todos los vendors se pueden consultar con SNMPv3 USM. Los OIDs son idénticos a v2c — SNMPv3 solo cambia la autenticación y el cifrado del transporte.

ComponenteArchivoFunción
Auth buildernetwork/services/device_discovery/snmp_auth.pybuild_snmp_auth() → CommunityData o UsmUserData
Auth protocolsMD5, SHA, SHA-224, SHA-256, SHA-384, SHA-512
Priv protocolsDES, AES-128, AES-192, AES-256
DeviceProfile5 campos v3 (migration 0037)snmp_v3_username, snmp_v3_auth_protocol, snmp_v3_auth_key, snmp_v3_priv_protocol, snmp_v3_priv_key
MonitoringTargetAlmacenados en config JSONFieldMismos 6 campos (snmp_version + 5 v3)

Nota: SNMPv3 NO mejora la calidad de los datos de monitoreo — los OIDs retornan exactamente los mismos valores. Es una feature de seguridad (autenticación + cifrado en tránsito) para entornos que requieren/exigen v3 o que tienen v2c deshabilitado.

Vendor-specific monitoring_oids

VendorMetricasOIDs
CiscoCPU, memory used/freeCISCO-PROCESS-MIB, CISCO-MEMORY-POOL-MIB
JuniperCPU, memory, temperatureJUNIPER-MIB (jnxOperating)
FortinetCPU, memory, sessionsFORTINET-FORTIGATE-MIB
Palo Altoactive/max sessionsPAN-COMMON-MIB
MikroTikCPU, memory, temperatureMIKROTIK-MIB (mtxrHl)
UbiquitiCPU, memory, clientsUBNT-UniFi-MIB
APCUPS battery + PDU powerPowerNet-MIB + UPS-MIB
SynologyCPU, temp, disk, RAIDSYNOLOGY-SYSTEM-MIB
QNAPCPU, temp, memoryNAS-MIB

Bandwidth Monitoring OIDs (todos los vendors)

El Agent Sentinel pollea estos OIDs por target para calcular bandwidth (Mbps), errores y discards. El ifIndex concreto lo determina AutoConfigService._select_primary_interface() durante el auto-provisioning (ver AUTO_PROVISION_GUIDE.md §6.1).

OIDNombreTipoUso
1.3.6.1.2.1.31.1.1.1.6.{ifIndex}ifHCInOctetsCounter64Bandwidth IN (preferido)
1.3.6.1.2.1.31.1.1.1.10.{ifIndex}ifHCOutOctetsCounter64Bandwidth OUT (preferido)
1.3.6.1.2.1.2.2.1.10.{ifIndex}ifInOctetsCounter32Bandwidth IN (fallback legacy)
1.3.6.1.2.1.2.2.1.16.{ifIndex}ifOutOctetsCounter32Bandwidth OUT (fallback legacy)
1.3.6.1.2.1.2.2.1.14.{ifIndex}ifInErrorsCounter32Error rate (errors/min)
1.3.6.1.2.1.2.2.1.20.{ifIndex}ifOutErrorsCounter32Error rate (errors/min)
1.3.6.1.2.1.2.2.1.13.{ifIndex}ifInDiscardsCounter32Discard rate (discards/min)
1.3.6.1.2.1.2.2.1.19.{ifIndex}ifOutDiscardsCounter32Discard rate (discards/min)

HC→Legacy Fallback (snmp_bandwidth.py): Si ifHCInOctets + ifHCOutOctets delta = 0 pero legacy delta > 0, usa contadores legacy 32-bit. Necesario para Xirrus donde HC counters devuelven 0 permanentemente en interfaces ethernet.

Cálculo: Mbps = delta_octets × 8 / dt_seconds / 1,000,000

Protecciones: Spike clamp > 10 Gbps (descarta y resetea baseline). Error/discard clamp > 100k/min.


Quirks por Vendor — Bandwidth SNMP

Xirrus (XR/XD series)

QuirkDetalle
ifHCInOctets = 0 permanenteLos HC counters (64-bit) de interfaces ethernet (gig1/gig2) siempre devuelven 0. Solo ifInOctets (32-bit) tiene datos reales
Interfaces virtuales sin tráficowds1, wds2, bridge — ifIndex 1-N devuelven 0 octets. El ifIndex correcto es el de gig1 (varía por modelo)
ifIndex varía por modeloXR4847→28, XR4836/4830→33, XR630→24, XD4-240→25, XD2-240→9
totalConnectedClients acumulativoOID .7.0 es contador ACUMULATIVO, no clientes actuales. Usar clientsPerRadio walk_sum
associatedClients en ifStatsSolo contiene interfaces cableadas (gig1/gig2). Usar stationMac walk_count para clientes WiFi

Cambium (XE series)

QuirkDetalle
HC counters funcionanifHCInOctets/ifHCOutOctets incrementan normalmente en interfaces ethernet
ifIndex varíaXE3-4 puede ser 5 u 8 según firmware

Nivel 2: MIB Assistant

Servicio: network/services/mib_assistant.py

Flujo:

  1. Usuario sube un archivo .mib via POST /api/vendor-profiles/{slug}/upload-mib
  2. MibManager compila y extrae OIDs
  3. Usuario llama POST /api/vendor-profiles/{slug}/mib-assistant/analyze
  4. Gemini Flash (gemini-3-flash-preview) clasifica los OIDs en categorias
  5. Si Gemini no disponible, fallback a reglas por keywords
  6. Usuario confirma via POST /api/vendor-profiles/{slug}/mib-assistant/apply
  7. OIDs propuestos se fusionan en VendorProfile (no sobreescribe existentes)

API Endpoints

POST /api/vendor-profiles/{slug}/mib-assistant/analyze
  -> Analiza OIDs de CustomMibs con Gemini Flash
  <- { device_type, confidence, monitoring_oids, deep_discovery_oids }

POST /api/vendor-profiles/{slug}/mib-assistant/apply
  Body: { monitoring_oids: {...}, deep_discovery_oids: {...} }
  <- { vendor_slug, monitoring_added, deep_discovery_added, ... }

Funciones principales

FuncionDescripcion
analyze_mib_oids()Envia OIDs a Gemini Flash, retorna propuesta clasificada
_fallback_classify()Clasificacion por keywords cuando Gemini no disponible
apply_proposal()Fusiona propuesta confirmada en VendorProfile
_call_gemini()Wrapper para google-genai SDK

Prompt de Gemini

El prompt pide a Gemini:

Fallback (sin Gemini)

Cuando la API de Gemini no esta disponible, _fallback_classify() usa keyword matching:


Nivel 3: Auto-Classifier

Servicio: network/services/device_discovery/auto_classifier.py

Integrado en: DeviceDiscoveryService.provision_device() (service.py) Punto de insercion: Despues de Stage 2 SNMP, cuando ni sysObjectID ni sysDescr matchean un VendorProfile.

Algoritmo de clasificacion

5 metodos combinados, cada uno asigna puntos:

MetodoPuntos maxDescripcion
Enterprise OID+40ENTERPRISE_HINTS dict (318=UPS, 6574=NAS, 674=server, etc.)
sysDescr keywords+30Busca “switch”, “ups”, “printer”, “nas”, etc. en sysDescr
Hostname hints+15Prefijos: “sw-”=switch, “ups-”=ups, “ap-”=access_point
Interface count+20>24 interfaces = switch, 4-12 = router
Interface type+25ifType=71 (ieee80211) = access_point

Confianza minima: 20% para activar (muy conservador — cualquier signal es suficiente)

Device Types reconocidos

TypeGeneric ProfileKeywords clave
access_pointgenericwireless, ap, 802.11, radio
switchgenericswitch, catalyst, nexus, poe
routergenericrouter, gateway, bgp, ospf
firewallgenericfirewall, asa, fortigate, utm
upsgeneric-upsups, smart-ups, battery backup
pdugenericpdu, power distribution
nasgenericnas, diskstation, synology, qnap
servergenericserver, idrac, ilo, bmc
printergeneric-printerprinter, laserjet, mfp
sensorgenericnetbotz, environmental, temperature sensor

Integracion en pipeline

Stage 2: SNMP
    ├── sysObjectID match? → VendorProfile found ✓
    ├── sysDescr match?    → VendorProfile found ✓
    └── Neither matched?   → AUTO-CLASSIFIER
                              ├── classify_from_all_data(snmp, http, nmap)
                              ├── confidence >= 20%?
                              │   ├── Set generic profile (generic/generic-ups/generic-printer)
                              │   ├── Set detected_vendor from generic profile
                              │   └── snmp_data['auto_classified'] = True
                              └── confidence < 20%?
                                  └── No vendor, continue as unknown

Enterprise OID Hints

Cuando el sysObjectID tiene un enterprise number conocido pero no hay VendorProfile con ese prefix:

ENTERPRISE_HINTS = {
    318: "ups",       # APC
    534: "ups",       # Eaton
    476: "ups",       # Vertiv
    3808: "ups",      # CyberPower
    850: "ups",       # Tripp Lite
    6574: "nas",      # Synology
    24681: "nas",     # QNAP
    789: "nas",       # NetApp
    674: "server",    # Dell iDRAC
    232: "server",    # HP iLO
    13742: "pdu",     # Raritan
    1718: "pdu",      # ServerTech
    21239: "pdu",     # Geist/Vertiv
}

Ejemplos de Clasificacion

Caso 1: UPS APC no reconocido

Input:  sysDescr="APC Smart-UPS 3000", sysObjectID="1.3.6.1.4.1.318.1.3.17", hostname="ups-rack01"
Output: device_type=ups, confidence=85%, profile=generic-ups
Reason: enterprise OID 318, sysDescr 'ups', hostname 'ups-'

Caso 2: Switch con 48 puertos

Input:  sysDescr="Generic L2 Switch", hostname="sw-core-01", 48 interfaces
Output: device_type=switch, confidence=35%, profile=generic
Reason: hostname 'sw-', 48 interfaces

Caso 3: NAS Synology

Input:  sysDescr="Linux NAS 5.10.0-synology", sysObjectID="1.3.6.1.4.1.6574.1", hostname="nas-backup"
Output: device_type=nas, confidence=85%, profile=generic
Reason: enterprise OID 6574, sysDescr 'nas', hostname 'nas-'

Testing

Auto-Classifier

from network.services.device_discovery.auto_classifier import classify_from_snmp_data

result = classify_from_snmp_data({
    'sys_descr': 'APC Smart-UPS 3000',
    'sys_object_id': '1.3.6.1.4.1.318.1.3.17',
    'hostname': 'ups-rack01',
    'interfaces': {},
})
# → device_type=ups, confidence=85, profile=generic-ups

MIB Assistant (fallback sin Gemini)

from network.services.mib_assistant import _fallback_classify

oids = [
    {'name': 'cpuUsage', 'oid': '1.3.6.1.4.1.99.1', 'type': 'get', 'access': 'readonly'},
    {'name': 'memTotal', 'oid': '1.3.6.1.4.1.99.2', 'type': 'get', 'access': 'readonly'},
]
result = _fallback_classify(oids, 'switch')
# → monitoring_oids: {cpu_usage: {...}, memory_usage: {...}}

MIB Assistant (con Gemini)

# Requiere GEMINI_API_KEY en env
curl -X POST http://localhost:8000/api/vendor-profiles/cisco/mib-assistant/analyze

Archivos Modificados

ArchivoCambio
network/migrations/0032_enrich_all_vendor_profiles.pyNuevo: standard + vendor OIDs
network/migrations/0033_infrastructure_vendor_profiles.pyNuevo: APC, Eaton, etc.
network/migrations/0034_generic_fallback_profile.pyNuevo: generic profiles
network/migrations/0035_fix_infra_vendor_oids.pyNuevo: fix pre-existing vendors
network/services/mib_assistant.pyNuevo: Gemini + fallback OID classifier
network/services/device_discovery/auto_classifier.pyNuevo: heuristic device classifier
network/services/device_discovery/service.pyModificado: auto-classifier hook
network/api/vendor.pyModificado: +2 MIB Assistant endpoints
network/migrations/0036_av_digital_signage_profiles.pyNuevo: 11 AV/Digital Signage vendors
network/services/device_discovery/auto_classifier.pyModificado: +4 device types, +9 enterprise hints

Mantenido por: Claude (Anthropic) + Equipo CreaRack

Nivel 1 Ampliacion: AV / Digital Signage (Migration 0036)

Perfiles por Categoria

Media Players: SpinetiX (PEN 29888), Crestron (PEN 3212), Extron (PEN 17049), BrightSign (PEN 44804)

Projectors: Barco (PEN 10103), Christie (PEN 19124), NEC/Sharp (PEN 119)

Audio DSP: QSC (PEN 30815), Shure (PEN 20918), Biamp (PEN 37890)

Displays: LG Display (PEN 2116)

Monitoring OIDs (vendor-specific)

VendorMetricasOIDs
SpinetiXCPU, memoryHOST-RESOURCES-MIB (hrProcessorLoad, hrStorageUsed)
CrestronCPUHOST-RESOURCES-MIB (hrProcessorLoad)

Deep Discovery (vendor-specific)

VendorCategoriasOIDs
SpinetiXstorage, softwarehrStorageDescr/Size/Used, hrSWInstalledName
CrestroncrestrondeviceModel, deviceSerial, firmwareVersion (enterprise OIDs)

Nota: Vendors sin monitoring_oids (Extron, Barco, etc.) usan standard MIBs. Enriquecer via MIB Assistant (Level 2) subiendo MIBs vendor-specific.

Auto-Classifier: Nuevos Device Types

TypeGeneric ProfileKeywords clave
media_playergenericdigital signage, spinetix, brightsign, crestron, extron, streaming
projectorgenericprojector, barco, christie, dlp, lcd projector
audio_dspgenericqsc, q-sys, shure, biamp, tesira, dante, audio dsp
displaygenericwebos, lg signage, video wall, commercial display

Enterprise OID Hints (auto-classifier)

29888: "media_player",  # SpinetiX
3212: "media_player",   # Crestron
17049: "media_player",  # Extron
10103: "projector",     # Barco
44804: "media_player",  # BrightSign
19124: "projector",     # Christie
30815: "audio_dsp",     # QSC
20918: "audio_dsp",     # Shure
37890: "audio_dsp",     # Biamp

Véase también

Subir