Diagnóstico inicial
Diagnóstico inicial
Ejecuta esta batería de pruebas tras la instalación y configuración inicial para confirmar que TraceWall está listo para operar.
Matriz de validación
| Área | Prueba | Comando / Acción | Criterio de éxito |
|---|---|---|---|
| App | Arranque limpio | Lanzar app → sin errores en consola / Event Viewer | Ventana abre < 10 s, sin crashes |
| App | Ventana principal | UI renderiza, sidebar navega | Command Center visible, sin pantallas blancas |
| Sensor | Panel sidebar | Local Sensor (izq) muestra datos | Interfaces, CPU, RAM, Disco, Uptime poblados |
| Sensor | Módulo completo | Navegar a Local Sensor (módulo) | Todas las pestañas (Interfaces, Procesos, Puertos, Rutas, DNS) con datos |
| Sensor | Persistencia | Reiniciar app → datos reaparecen | tracewall.db tiene filas en assets, interfaces, processes |
| Inventario | Activos | Assets & Inventory → filas > 0 | Host local + al menos 1 interfaz, confidence ≥ 0.9 |
| Inventario | Filtros | Filtrar por type=host, reachable=true | Resultados coherentes |
| Topología | Grafo renderizado | Network Topology → nodos/aristas visibles | Gateway + subred local + host local como nodo |
| Topología | Interacción | Zoom, pan, clic nodo → panel detalle | Sin lag, detalle muestra metadata |
| Exposición | Perfil DNS | Exposure Intelligence → Perfil DNS → [Ejecutar] | Hallazgos generados (o “sin hallazgos” explícito) |
| Exposición | Perfil Web | Perfil Web → [Ejecutar] | Escaneo puertos 80/443 → evidencia HTTP/TLS |
| Exposición | Perfil Internet-facing | Perfil Internet-facing → [Ejecutar] | IP pública detectada (si hay salida a Internet) |
| Eventos | Buffer poblado | Events / SIEM → últimos 100 eventos | Severidad, tipo, timestamp, origen, mensaje |
| Eventos | Búsqueda | Filtrar por severity=critical | Resultados instantáneos (< 500 ms) |
| Eventos | Exportación | [Exportar CSV] → archivo válido | CSV abre en Excel, columnas esperadas |
| ARGUS | Motor iniciado | ARGUS Workspace → estado 🟢 / “Listo” | Health check 200 OK en loopback |
| ARGUS | Modelo cargado | Settings → ARGUS → modelo listado | Tamaño GB > 0, nombre .gguf |
| ARGUS | Chat funcional | ARGUS Workspace → “Resume estado actual” | Respuesta en < 30 s, cita evidencia (sensor/inventario) |
| ARGUS | Herramientas | Preguntar “¿Qué puertos abiertos en 10.0.0.5?” | Invoca get_interface_status o search_assets |
| Integr. | Conectividad | Settings → Integraciones → [Probar] cada una | 🟢 Éxito en test |
| Integr. | Datos fluyen | Assets filtrar source=<integ> → filas > 0 | Datos normalizados en inventario |
| Logs | Sin errores críticos | Settings → Logs / carpeta logs → buscar ERROR/FATAL | 0 en último ciclo (warnings aceptables) |
| Perf | CPU/MEM en idle | Task Manager / htop → proceso TraceWall | CPU < 5% idle, RAM < 2 GB (sin ARGUS) / < 10 GB (con ARGUS) |
Script de diagnóstico automatizado
Windows (PowerShell) — diag-tracewall.ps1
# Requiere: TraceWall corriendo, acceso a %LOCALAPPDATA%\TraceWall\$base = "$env:LOCALAPPDATA\TraceWall"$db = "$base\tracewall.db"$logs = "$base\logs"
Write-Host "=== TraceWall Diagnostic ===" -ForegroundColor Cyan
# 1. DB existe y accesibleif (Test-Path $db) { Write-Host "✅ DB encontrada: $db" -ForegroundColor Green # Query rápida via sqlite3 (si instalado) o .NET Add-Type -AssemblyName System.Data.SQLite $conn = New-Object System.Data.SQLite.SQLiteConnection $conn.ConnectionString = "Data Source=$db;Read Only=True;" $conn.Open() $cmd = $conn.CreateCommand() $cmd.CommandText = "SELECT COUNT(*) FROM assets;" $count = $cmd.ExecuteScalar() Write-Host " Assets en inventario: $count" -NoNewline if ($count -gt 0) { Write-Host " ✅" -ForegroundColor Green } else { Write-Host " ⚠️ Vacío" -ForegroundColor Yellow } $conn.Close()} else { Write-Host "❌ DB NO encontrada: $db" -ForegroundColor Red}
# 2. Logs recientes sin ERROR/FATAL$recentLogs = Get-ChildItem "$logs\*.log" | Sort-Object LastWriteTime -Descending | Select-Object -First 3foreach ($log in $recentLogs) { $errors = Select-String -Path $log.FullName -Pattern "ERROR|FATAL" -SimpleMatch Write-Host "Log: $($log.Name)" -NoNewline if ($errors.Count -eq 0) { Write-Host " ✅ Sin errores" -ForegroundColor Green } else { Write-Host " ⚠️ $($errors.Count) errores" -ForegroundColor Yellow; $errors | Select-Object -First 3 | ForEach-Object { Write-Host " $_" } }}
# 3. Proceso TraceWall$proc = Get-Process -Name "TraceWall" -ErrorAction SilentlyContinueif ($proc) { Write-Host "Proceso principal: PID $($proc.Id)" -NoNewline Write-Host " CPU: $([math]::Round($proc.CPU,1))s RAM: $([math]::Round($proc.WorkingSet64/1MB,1)) MB" # Child processes $children = Get-CimInstance Win32_Process | Where-Object { $_.ParentProcessId -eq $proc.Id } foreach ($c in $children) { Write-Host " └─ $($c.Name) (PID $($c.ProcessId)) CPU: $([math]::Round($c.CPU,1))s RAM: $([math]::Round($c.WorkingSetSize/1MB,1))MB" }} else { Write-Host "❌ Proceso TraceWall NO encontrado" -ForegroundColor Red}
# 4. ARGUS health (si habilitado)$argusPort = Get-ChildItem "$base\argus" -Filter "port.txt" -ErrorAction SilentlyContinueif ($argusPort) { $port = Get-Content $argusPort.FullName -Raw try { $resp = Invoke-WebRequest -Uri "http://127.0.0.1:$port/health" -TimeoutSec 3 -UseBasicParsing Write-Host "ARGUS health (port $port): $($resp.StatusCode) $($resp.Content)" -ForegroundColor Green } catch { Write-Host "ARGUS health: ❌ $($_.Exception.Message)" -ForegroundColor Red }} else { Write-Host "ARGUS: No habilitado o puerto no detectado"}
# 5. Sensor data freshnessif (Test-Path $db) { $conn = New-Object System.Data.SQLite.SQLiteConnection $conn.ConnectionString = "Data Source=$db;Read Only=True;" $conn.Open() $cmd = $conn.CreateCommand() $cmd.CommandText = "SELECT MAX(last_seen) FROM assets;" $last = $cmd.ExecuteScalar() if ($last) { $age = [DateTimeOffset]::FromUnixTimeSeconds($last) $diff = (Get-Date) - $age Write-Host "Última telemetría asset: $age (hace $([math]::Round($diff.TotalMinutes,1)) min)" -NoNewline if ($diff.TotalMinutes -lt 5) { Write-Host " ✅" -ForegroundColor Green } elseif ($diff.TotalMinutes -lt 30) { Write-Host " ⚠️" -ForegroundColor Yellow } else { Write-Host " ❌ STALE" -ForegroundColor Red } } $conn.Close()}
Write-Host "`n=== Fin diagnóstico ===" -ForegroundColor CyanLinux (Bash) — diag-tracewall.sh
#!/usr/bin/env bashset -euo pipefail
BASE="$HOME/.local/share/tracewall"DB="$BASE/tracewall.db"LOGS="$BASE/logs"
echo "=== TraceWall Diagnostic ==="
# 1. DBif [[ -f "$DB" ]]; then echo "✅ DB: $DB" if command -v sqlite3 &>/dev/null; then count=$(sqlite3 -readonly "$DB" "SELECT COUNT(*) FROM assets;") echo " Assets: $count" if [[ $count -gt 0 ]]; then echo " ✅" else echo " ⚠️ Vacío" fi # Freshness last=$(sqlite3 -readonly "$DB" "SELECT MAX(last_seen) FROM assets;") if [[ -n "$last" ]]; then age=$(( $(date +%s) - last )) echo " Última telemetría: $(date -d "@$last" '+%F %T') (hace ${age}s)" if [[ $age -lt 300 ]]; then echo " ✅"; elif [[ $age -lt 1800 ]]; then echo " ⚠️"; else echo " ❌ STALE"; fi fi fielse echo "❌ DB NO encontrada: $DB"fi
# 2. Logs recientesecho "Logs recientes:"for log in $(ls -t "$LOGS"/*.log 2>/dev/null | head -3); do errors=$(grep -c -E "ERROR|FATAL" "$log" 2>/dev/null || echo 0) if [[ $errors -eq 0 ]]; then echo " $(basename "$log") ✅" else echo " $(basename "$log") ⚠️ $errors errores" grep -E "ERROR|FATAL" "$log" | head -3 | sed 's/^/ /' fidone
# 3. Procesospids=$(pgrep -f tracewall 2>/dev/null || true)if [[ -n "$pids" ]]; then echo "Procesos TraceWall:" for pid in $pids; do ps -p ps -p "$pid" -o pid,ppid,cmd,%cpu,%mem --no-headers 2>/dev/null | sed 's/^/ /' done doneelse echo "❌ No hay procesos tracewall"fi
# 4. ARGUS healthport_file=$(find "$BASE/argus" -name "port.txt" 2>/dev/null | head -1)if [[ -f "$port_file" ]]; then port=$(cat "$port_file") if curl -sf --max-time 3 "http://127.0.0.1:$port/health" >/dev/null; then echo "ARGUS health (port $port): ✅" else echo "ARGUS health (port $port): ❌" fielse echo "ARGUS: No habilitado"fi
echo "=== Fin diagnóstico ==="Interpretación de resultados
| Escenario | Acción |
|---|---|
| Todo ✅ | Sistema listo para operar. Proceder a uso en producción. |
| Sensor ⚠️/❌ | Ver Solución: Sensor inactivo y Interfaces no detectadas |
| Inventario vacío | Sensor no inserta → revisar logs sensor, permisos, Npcap (Win) |
| Topología vacía | No hay gateway detectado → verificar tabla de rutas, ARP, sensor interfaces |
| Exposición sin hallazgos | Normal si red limpia; ejecutar perfil Puertos/Internet-facing para validar motor |
| Eventos vacíos | Sin integraciones o sin logs locales → configurar al menos Syslog local o Wazuh |
| ARGUS ❌ | Ver ARGUS: Diagnóstico — modelo, puerto, OOM, GPU |
| Integración ❌ | Ver página específica del conector + Integración sin conexión |
| Logs con ERROR | Revisar mensaje; buscar en Solución de problemas o contactar soporte con ZIP logs |
| CPU/RAM alta | Sensor intervalo muy bajo, ARGUS en CPU sin GPU, leak → ajustar Settings |
Lista de verificación para entrega a operaciones
- Diagnóstico automatizado pasa (0 ❌, ≤ 2 ⚠️)
- Sensor local 🟢 en Command Center y módulo
- Inventario ≥ 1 host local + interfaces
- Topología renderiza gateway + segmento
- Al menos 1 perfil Exposure ejecutado sin error
- Events buffer recibe datos (local o integración)
- ARGUS 🟢 y responde a prompt de prueba
- Integraciones configuradas 🟢 en test
- Logs limpios de ERROR/FATAL
- Retención y backups configurados
- Documentado:
config.json+tracewall.dben backup diario - Equipo operativo entrenado en Command Center, ARGUS, Incidentes