Volver a la wiki

Auditoría Profunda de Código — CreaRack Pro v1.0.25

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

ÁreaCalificaciónIssues
Backend Python7.2/105 CRITICAL, 6 HIGH, 9 MEDIUM
Frontend JS/CSS7.5/103 CRITICAL, 7 HIGH, 10 MEDIUM
Templates6.5/102 CRITICAL (inline CSS/JS), 16 hardcoded URLs
Docker/Config8.5/101 MEDIUM (no non-root user)
Dependencias9.0/10Sin paquetes sin usar detectados
Migraciones7.0/1020 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)

ArchivoLíneasPrioridad
network/services/device_discovery.py1,756HIGH — modularizar en stages
terminal/api.py1,418HIGH — split en sub-módulos
monitoring/services/metrics_reader.py777MEDIUM
network/models.py725OK (modelo grande legítimo)

JavaScript (>500 líneas)

ArchivoLíneasPrioridad
observatory.js2,518CRITICAL — archivo más grande del proyecto
EChartsService.js2,506CRITICAL — ya parcialmente modularizado
network_tools_v3.js2,115HIGH
WirelessDetail.js1,068MEDIUM
MultiPaneManager.js1,032MEDIUM
ObservatoryOverview.js1,030MEDIUM
deep_discovery.js977MEDIUM
map_editor.js963MEDIUM
MapInteraction.js906MEDIUM

CSS (>500 líneas)

ArchivoLíneasPrioridad
observatory.css2,406HIGH
editor.css1,062MEDIUM
wireless.css911MEDIUM

Templates (>300 líneas con inline code)

ArchivoLíneasIssue
blueprint_editor.html1,201~1090 líneas de CSS inline
editor.html788Script inline en L716
base.html7796 bloques <script> inline
index.html7132 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

#IssueArchivo(s)Fix
M1Patrón org = request.user.organization or Organization.objects.first() repetido 20+ vecescore/api.pyCentralizar en get_user_org_safe(user)
M2Formato de error inconsistente (message vs error vs HttpError)Múltiples APIsEsquema ErrorResponse centralizado
M3SNMP community hardcoded “public” como fallbackmonitoring/api/batch.py L109Retornar error si no configurado
M4Sin validación de tamaño de batch en endpointsmonitoring/api/batch.py@field_validator max 100 items
M5setTimeout/setInterval sin tracking para cleanupobservatory.js (30+ instancias)Almacenar IDs, limpiar en destroy()
M6Mixed async patterns (.then vs await)observatory.jsEstandarizar en async/await
M7Cache busting manual ?v=N en importsTodos los módulos ESSolución global (importmap o Vite)
M8observatory.css (2,406 líneas)static/css/pages/Split por sección
M920 migraciones en network/network/migrations/Squash a 2 archivos
M10Container Docker corre como rootDockerfileAñadir USER app

5. Fortalezas del Proyecto


6. Plan de Mejora Priorizado

Fase 1: Error Handling & Seguridad (1-2 días)

TareaEsfuerzoImpacto
Reemplazar bare except: en device_discovery.py (5)1hCRITICAL
Reemplazar bare except: en network_utils.py (6)1hCRITICAL
try/catch en fetch localhost:5050 (5 instancias)30minCRITICAL
Reemplazar .catch(() => {}) con error handlers (6)30minCRITICAL
Fix N+1 query core/api.py MFA status30minCRITICAL
Validación tamaño batch en endpoints30minMEDIUM

Fase 2: Template Cleanup (1 día)

TareaEsfuerzoImpacto
Extraer CSS inline de blueprint_editor.html2hCRITICAL
Extraer scripts inline de base.html (6 bloques)1hHIGH
Extraer scripts inline de editor.html + index.html1hHIGH
Convertir 16 hardcoded URLs a {% url %}1hHIGH

Fase 3: Modularización JS (2-3 días)

TareaEsfuerzoImpacto
Split observatory.js (2,518 → 6 módulos)4hHIGH
Split network_tools_v3.js (2,115 → 7 módulos)3hHIGH
Null guards en DOM queries (70+ instancias)2hHIGH
Centralizar error handling en ApiService wrapper1hMEDIUM

Fase 4: Modularización Python (1-2 días)

TareaEsfuerzoImpacto
Split device_discovery.py (1,756 → 7 módulos)4hHIGH
Split terminal/api.py (1,418 → 3 módulos)3hHIGH
Centralizar get_user_org_safe() utility1hMEDIUM
Estandarizar ErrorResponse schema1hMEDIUM

Fase 5: Infraestructura (medio día)

TareaEsfuerzoImpacto
Squash network migrations (20 → 2)1hMEDIUM
Docker non-root user30minMEDIUM
CSS split observatory.css (2,406 líneas)2hMEDIUM

Estimación Total

FaseDíasPrioridad
Fase 1: Error Handling1-2 díasInmediata
Fase 2: Templates1 díaAlta
Fase 3: JS Modularización2-3 díasAlta
Fase 4: Python Modularización1-2 díasMedia
Fase 5: Infraestructura0.5 díasMedia
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

Subir