Auditoría Profunda de Código — CreaRack Pro v1.0.25
Fecha: 04-03-2026 Alcance: Backend (Python), Frontend (JS/CSS), Templates, Arquitectura, Docker, Dependencias Método: 3 agentes paralelos (Backend, Frontend, Arquitectura) Estado del proyecto: 171 endpoints, 15 modelos, producción activa
Resumen Ejecutivo
| Área | Calificación | Issues |
|---|---|---|
| Backend Python | 7.2/10 | 5 CRITICAL, 6 HIGH, 9 MEDIUM |
| Frontend JS/CSS | 7.5/10 | 3 CRITICAL, 7 HIGH, 10 MEDIUM |
| Templates | 6.5/10 | 2 CRITICAL (inline CSS/JS), 16 hardcoded URLs |
| Docker/Config | 8.5/10 | 1 MEDIUM (no non-root user) |
| Dependencias | 9.0/10 | Sin paquetes sin usar detectados |
| Migraciones | 7.0/10 | 20 migraciones en network/ (squash candidate) |
Calificación global: 7.5/10 — Funcionalmente sólido, con deuda técnica acumulada en archivos grandes y error handling.
1. Archivos que Exceden Límites de Tamaño
Python (>500 líneas)
| Archivo | Líneas | Prioridad |
|---|---|---|
network/services/device_discovery.py | 1,756 | HIGH — modularizar en stages |
terminal/api.py | 1,418 | HIGH — split en sub-módulos |
monitoring/services/metrics_reader.py | 777 | MEDIUM |
network/models.py | 725 | OK (modelo grande legítimo) |
JavaScript (>500 líneas)
| Archivo | Líneas | Prioridad |
|---|---|---|
observatory.js | 2,518 | CRITICAL — archivo más grande del proyecto |
EChartsService.js | 2,506 | CRITICAL — ya parcialmente modularizado |
network_tools_v3.js | 2,115 | HIGH |
WirelessDetail.js | 1,068 | MEDIUM |
MultiPaneManager.js | 1,032 | MEDIUM |
ObservatoryOverview.js | 1,030 | MEDIUM |
deep_discovery.js | 977 | MEDIUM |
map_editor.js | 963 | MEDIUM |
MapInteraction.js | 906 | MEDIUM |
CSS (>500 líneas)
| Archivo | Líneas | Prioridad |
|---|---|---|
observatory.css | 2,406 | HIGH |
editor.css | 1,062 | MEDIUM |
wireless.css | 911 | MEDIUM |
Templates (>300 líneas con inline code)
| Archivo | Líneas | Issue |
|---|---|---|
blueprint_editor.html | 1,201 | ~1090 líneas de CSS inline |
editor.html | 788 | Script inline en L716 |
base.html | 779 | 6 bloques <script> inline |
index.html | 713 | 2 bloques <script> inline |
2. Issues CRITICAL
C1. Bare except: en device_discovery.py (5 instancias)
Archivo: network/services/device_discovery.py L542, L740, L797, L864, L877
Riesgo: Errores SNMP/SSH desaparecen de los logs. Discovery falla silenciosamente.
Fix: Reemplazar con except (ValueError, TypeError): o except Exception as e: + logging.
C2. Fetch sin try/catch a localhost:5050 (5 instancias)
Archivos: observatory.js L1957/L2044/L2096, ObservatoryOverview.js L557/L717
Riesgo: Si el Agent está offline, la UI crashea.
Fix: Envolver en try/catch con fallback graceful.
C3. .catch(() => {}) silencioso (6 instancias)
Archivos: observatory.js L547-549, L1032-1033, terminal.js L284, WirelessDashboard.js L56
Riesgo: Operaciones fallidas parecen exitosas. Sin feedback al usuario.
Fix: Añadir logging + toast de error.
C4. CSS inline masivo en blueprint_editor.html (~1090 líneas)
Archivo: templates/blueprint_editor.html L10-1100
Riesgo: CSS no cacheable, template pesado, imposible de mantener.
Fix: Extraer a static/css/pages/blueprint-editor.css.
C5. N+1 Query en core/api.py
Archivo: core/api.py L143-145 (get_users_mfa_status)
Riesgo: 1 query por usuario para obtener authenticators. O(n) queries.
Fix: prefetch_related('authenticators') en el queryset.
3. Issues HIGH
H1. observatory.js (2,518 líneas) — Requiere modularización
Plan de split propuesto:
static/js/pages/observatory/
├── ObservatoryApp.js (~300) — Orquestador principal, lifecycle
├── ObservatoryTargets.js (~200) — Carga/gestión de targets
├── ObservatorySidebar.js (~200) — Sidebar, filtros, lista
├── ObservatoryChartManager.js (~400) — Timer, refresh, coordinación charts
├── ObservatorySentinel.js (~200) — Status sentinel, start/stop
├── ObservatoryAlerts.js (~150) — Alertas y rankings
└── (existentes: ChartCoordinator, ObservatoryOverview, ObservatorySettings, ObservatoryTabs)
H2. device_discovery.py (1,756 líneas) — Modularizar en stages
Plan propuesto:
network/services/discovery/
├── __init__.py
├── orchestrator.py — DeviceDiscoveryService (delega a stages)
├── icmp.py — PingStage
├── snmp.py — SNMPStage
├── ssh.py — SSHStage
├── lldp.py — LLDPStage
├── stencil.py — StencilMatchStage
└── confidence.py — ConfidenceScoringStage
H3. terminal/api.py (1,418 líneas) — Ya parcialmente split
Todavía contiene scripts + network devices + agent API en un solo archivo.
Plan: Split en terminal/api/scripts.py, terminal/api/network.py, terminal/api/agent.py.
H4. network_tools_v3.js (2,115 líneas)
Contiene 7 herramientas de red (Port Check, Ping, DNS, etc.) en un solo archivo. Plan: Un módulo por herramienta.
H5. 16 URLs hardcodeadas en templates
Archivos: base.html (7), index.html (3), HTMX templates (6)
Fix: Reemplazar con {% url 'app:view_name' %}.
H6. DOM queries sin null guards (70+ instancias)
Pattern: document.getElementById('x').classList.add(...) sin verificar que el elemento existe.
Fix: Añadir if (!el) return; guards.
H7. innerHTML para contenido dinámico (15+ instancias)
Riesgo XSS: Bajo (datos internos), pero patrón inseguro.
Fix: Usar textContent para texto, createElement() para DOM.
4. Issues MEDIUM
| # | Issue | Archivo(s) | Fix |
|---|---|---|---|
| M1 | Patrón org = request.user.organization or Organization.objects.first() repetido 20+ veces | core/api.py | Centralizar en get_user_org_safe(user) |
| M2 | Formato de error inconsistente (message vs error vs HttpError) | Múltiples APIs | Esquema ErrorResponse centralizado |
| M3 | SNMP community hardcoded “public” como fallback | monitoring/api/batch.py L109 | Retornar error si no configurado |
| M4 | Sin validación de tamaño de batch en endpoints | monitoring/api/batch.py | @field_validator max 100 items |
| M5 | setTimeout/setInterval sin tracking para cleanup | observatory.js (30+ instancias) | Almacenar IDs, limpiar en destroy() |
| M6 | Mixed async patterns (.then vs await) | observatory.js | Estandarizar en async/await |
| M7 | Cache busting manual ?v=N en imports | Todos los módulos ES | Solución global (importmap o Vite) |
| M8 | observatory.css (2,406 líneas) | static/css/pages/ | Split por sección |
| M9 | 20 migraciones en network/ | network/migrations/ | Squash a 2 archivos |
| M10 | Container Docker corre como root | Dockerfile | Añadir USER app |
5. Fortalezas del Proyecto
- Seguridad: CSP, rate limiting, CSRF, Passkeys/MFA — excelente
- Sin SQL raw: Todo via Django ORM — 0 riesgo de SQL injection
- Health checks:
/health,/ready,/alive+ Docker healthchecks - Separación backend:
monitoring/api/ya modularizado en 10 sub-módulos (desde v1.0.11) - Zero console.log: Solo 1
console.debugencontrado en frontend (limpieza previa exitosa) - Sin archivos muertos: Todos los .py/.js/.html están referenciados
- Dependencias: Todas las 60 dependencias están en uso
6. Plan de Mejora Priorizado
Fase 1: Error Handling & Seguridad (1-2 días)
| Tarea | Esfuerzo | Impacto |
|---|---|---|
Reemplazar bare except: en device_discovery.py (5) | 1h | CRITICAL |
Reemplazar bare except: en network_utils.py (6) | 1h | CRITICAL |
| try/catch en fetch localhost:5050 (5 instancias) | 30min | CRITICAL |
Reemplazar .catch(() => {}) con error handlers (6) | 30min | CRITICAL |
| Fix N+1 query core/api.py MFA status | 30min | CRITICAL |
| Validación tamaño batch en endpoints | 30min | MEDIUM |
Fase 2: Template Cleanup (1 día)
| Tarea | Esfuerzo | Impacto |
|---|---|---|
| Extraer CSS inline de blueprint_editor.html | 2h | CRITICAL |
| Extraer scripts inline de base.html (6 bloques) | 1h | HIGH |
| Extraer scripts inline de editor.html + index.html | 1h | HIGH |
Convertir 16 hardcoded URLs a {% url %} | 1h | HIGH |
Fase 3: Modularización JS (2-3 días)
| Tarea | Esfuerzo | Impacto |
|---|---|---|
| Split observatory.js (2,518 → 6 módulos) | 4h | HIGH |
| Split network_tools_v3.js (2,115 → 7 módulos) | 3h | HIGH |
| Null guards en DOM queries (70+ instancias) | 2h | HIGH |
| Centralizar error handling en ApiService wrapper | 1h | MEDIUM |
Fase 4: Modularización Python (1-2 días)
| Tarea | Esfuerzo | Impacto |
|---|---|---|
| Split device_discovery.py (1,756 → 7 módulos) | 4h | HIGH |
| Split terminal/api.py (1,418 → 3 módulos) | 3h | HIGH |
Centralizar get_user_org_safe() utility | 1h | MEDIUM |
| Estandarizar ErrorResponse schema | 1h | MEDIUM |
Fase 5: Infraestructura (medio día)
| Tarea | Esfuerzo | Impacto |
|---|---|---|
| Squash network migrations (20 → 2) | 1h | MEDIUM |
| Docker non-root user | 30min | MEDIUM |
| CSS split observatory.css (2,406 líneas) | 2h | MEDIUM |
Estimación Total
| Fase | Días | Prioridad |
|---|---|---|
| Fase 1: Error Handling | 1-2 días | Inmediata |
| Fase 2: Templates | 1 día | Alta |
| Fase 3: JS Modularización | 2-3 días | Alta |
| Fase 4: Python Modularización | 1-2 días | Media |
| Fase 5: Infraestructura | 0.5 días | Media |
| Total | ~6-8 días |
Generado por: Claude (Anthropic) — Auditoría automática con 3 agentes paralelos Próxima revisión: Tras implementar Fases 1-2
Véase también
- [[crearack-tech—reports—audit-punto-cero-04-04-2026]] — auditoría punto cero v1.0.51
- [[crearack-tech—reports—audit-abril-17-2026]] — auditoría exhaustiva abril 2026
- [[crearack-tech—backend—refactoring-guide]] — guía de refactoring
- [[crearack-tech—architecture—performance-optimization]] — plan de optimización de rendimiento
- [[crearack-tech—frontend—performance-guidelines]] — guidelines de frontend
- [[feature—refactor—audit-abril-2026]] — feature de refactor post-auditoría