Modelo CustomMib (MIBs compilados subidos por admin)
Propósito
CustomMib registra los MIBs (Management Information Base, “fichas técnicas SNMP” en ASN.1) que un admin carga manualmente para extender el catálogo de fabricantes. Cada entrada:
- Apunta a un
VendorProfile(catálogo global) - Contiene metadatos del MIB (nombre de módulo, hash)
- Linkea OIDs extraídos propios y los que el asistente IA propone
Estructura
| Campo | Tipo | Notas |
|---|---|---|
vendor_profile | FK → VendorProfile | El vendor para el que se sube este MIB (catálogo global) |
module_name | CharField | Nombre del módulo ASN.1 (ej: CISCO-SYSTEM-MIB) |
file_hash | CharField | SHA256 del contenido original (evita duplicados) |
extracted_oids_json | JSONField | OIDs parseados de pysmi (name, oid, type, syntax) |
extracted_count | IntegerField | Cantidad de OIDs extraídos |
compiled_path | CharField | Ruta del .py compilado por pysmi (en MIB_CACHE_DIR) |
is_stale | BooleanField | ¿Requiere recompilación? (si hay cambios en dependencias) |
error_log | TextField | Errores de compilación pysmi (si ocurrieron) |
created_at | DateTimeField | Timestamp de upload |
Seguridad (s114)
Upload (path traversal fix)
POST /api/vendor-profiles/{slug}/upload-mib:
- Autorización: admin only (new in s114)
- Validación de extensión: debe estar en
{.mib, .my, .txt, .asn1, .asn} - Extracción de module_name: del contenido del fichero (búsqueda de “MODULE DEFINITIONS ::= BEGIN”)
- Validación de module_name: debe coincidir con
^[A-Za-z0-9._-]+$(s114 fix):- Previo:
module_namesin validación + nombres con../permitían path traversal - Ahora: lista blanca estricta, rejaza separadores y relativos
- Previo:
- Verificación realpath: el fichero resultante debe quedar dentro de
custom_dir:if os.path.dirname(os.path.realpath(source_path)) != os.path.realpath(custom_dir): return 400, {"message": "Resolved MIB path escapes the custom MIB directory."}
Borro (nombre exacto, no prefijo)
DELETE /api/vendor-profiles/{slug}/custom-mibs/{mib_id}:
- Autorización: admin only (s114)
- Borro por nombre exacto (new in s114):
- Previo:
startswith(f"{slug}_{module_name}")arrastraba ficheros con prefijo común (FOO vs FOO-EXT) - Ahora: itera
MIB_ALLOWED_EXTy borra solo{slug}_{module_name}{ext}si existe
- Previo:
Compilación
Los .py compilados por pysmi se almacenan en MIB_CACHE_DIR pero NUNCA se importan/ejecutan (solo se leen como texto en extract_oids_from_compiled). El docstring de get_mib_dir() advierte: son archivos derivados de input no confiable.
OID Extraction y Gemma 4
Tras compilación, se extraen OIDs y se almacenan en extracted_oids_json. Luego:
- El endpoint
/mib-assistant/analyze(admin only, s114) envía estos OIDs a Gemma 4 (google_genai) para proponer categorías (monitoring vs deep_discovery) - Los nombres/sintaxis se sanitizan con
wrap_untrusted()(reutilizasanitize.pyde CNS) para evitar prompt injection
Véase también
- [[entity—network—model—vendor-profile]]
- [[entity—network—service—mib-manager]]
- [[entity—network—service—mib-assistant]]
- [[feature—network—sa3-auditoria-vendor-mib]]