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]]