Files
dtic-DIIAA/tools/agregar_hitos_dashboard.rb
T

191 lines
8.9 KiB
Ruby

#!/usr/bin/env ruby
# frozen_string_literal: true
# tools/agregar_hitos_dashboard.rb — Script simple para agregar hitos al dashboard P2601
# ================================================================================
# Este script agrega hitos adicionales al dashboard P2601 de forma manual y controlada.
# Es una versión simplificada que evita problemas de parsing complejo.
require 'fileutils'
# Hitos adicionales para agregar (formato simplificado)
HITOS_ADICIONALES = <<~HTML
<!-- Hitos adicionales agregados automáticamente - #{Time.now.strftime('%Y-%m-%d %H:%M')} -->
<div class="tl-item">
<div class="tl-dot pending"></div>
<div class="tl-content">
<div class="tl-header"><span class="tl-id">BKP02</span><span class="tl-date">Pendiente</span></div>
<div class="tl-title">🔒 Backup Automático de VMs en Proxmox</div>
<div class="tl-desc">Configurar backups automáticos VZDump programados para DC y SQL Server. Establecer retención de 7 días, almacenamiento en NAS/SMB compartido.</div>
<div class="tl-tags"><span class="tag tag-remote">Remoto: ~2h</span><span class="tag tag-phys">Requiere acceso físico</span></div>
</div>
</div>
<div class="tl-item">
<div class="tl-dot pending"></div>
<div class="tl-content">
<div class="tl-header"><span class="tl-id">DB02</span><span class="tl-date">Pendiente</span></div>
<div class="tl-title">🗄️ Backup Automático de Base de Datos sysdasuten</div>
<div class="tl-desc">Configurar jobs de SQL Server Agent para backup diario completo y log cada 15 minutos. Verificar restauración periódica en ambiente de pruebas.</div>
<div class="tl-tags"><span class="tag tag-remote">Remoto: ~2h</span><span class="tag">SQL Agent</span></div>
</div>
</div>
<div class="tl-item">
<div class="tl-dot pending"></div>
<div class="tl-content">
<div class="tl-header"><span class="tl-id">MON01</span><span class="tl-date">Pendiente</span></div>
<div class="tl-title">📊 Monitoreo de Recursos del Hipervisor</div>
<div class="tl-desc">Implementar sistema de monitoreo básico para CPU, RAM, almacenamiento y red de srv-dasu. Alertas por email/Telegram para recursos críticos.</div>
<div class="tl-tags"><span class="tag tag-remote">Remoto: ~3h</span><span class="tag">Herramientas ADN</span></div>
</div>
</div>
<div class="tl-item">
<div class="tl-dot pending"></div>
<div class="tl-content">
<div class="tl-header"><span class="tl-id">DOC01</span><span class="tl-date">Pendiente</span></div>
<div class="tl-title">📋 Documentación Operativa del Sistema</div>
<div class="tl-desc">Crear manual de operaciones: procedimientos de backup/restore, acceso remoto, resolución de problemas comunes, contactos de soporte, diagramas de red.</div>
<div class="tl-tags"><span class="tag tag-remote">Remoto: ~6h</span><span class="tag">Herramientas ADN</span><span class="tag">Git</span></div>
</div>
</div>
<div class="tl-item">
<div class="tl-dot pending"></div>
<div class="tl-content">
<div class="tl-header"><span class="tl-id">PERF01</span><span class="tl-date">Pendiente</span></div>
<div class="tl-title">⚡ Pruebas de Rendimiento del Sistema</div>
<div class="tl-desc">Realizar pruebas de carga simulada en sistema DASUTEN. Medir tiempos de respuesta, consumo de recursos, identificar cuellos de botella. Generar reporte de performance.</div>
<div class="tl-tags"><span class="tag tag-phys">Físico: 2h</span><span class="tag tag-remote">Remoto: ~2h</span><span class="tag">SQL Profiler</span></div>
</div>
</div>
HTML
def main
puts "🔄 AGREGANDO HITOS AL DASHBOARD P2601"
puts "=" * 60
# Ruta del dashboard
dashboard_path = '/home/rmonla/Documentos/GitHub/dtic-srv-NS8/dashboard/index.html'
# Verificar que el archivo existe
unless File.exist?(dashboard_path)
puts "❌ Error: No se encuentra el dashboard en #{dashboard_path}"
exit 1
end
# Leer contenido actual
puts "📖 Leyendo dashboard actual..."
contenido = File.read(dashboard_path)
puts "✅ Dashboard leído (#{contenido.length} bytes, #{contenido.lines.count} líneas)"
# Crear backup
backup_path = "#{dashboard_path}.backup_#{Time.now.strftime('%Y%m%d_%H%M%S')}"
puts "💾 Creando backup en: #{backup_path}"
File.write(backup_path, contenido)
puts "✅ Backup creado exitosamente"
# Buscar el lugar donde insertar los hitos (antes del cierre del div .timeline)
# Buscamos el último </div> antes del footer
if contenido.include?('</div><!-- Timeline de Hitos -->')
puts "📍 Marcador de timeline encontrado"
marcador = '</div><!-- Timeline de Hitos -->'
elsif contenido.include?('</div>\n <div class="footer">')
puts "📍 Marcador antes del footer encontrado"
marcador = '</div>\n <div class="footer">'
else
# Buscar el patrón: cierre de timeline y luego footer
timeline_end_index = contenido.index('</div>\n <div class="footer">')
if timeline_end_index
puts "📍 Patrón timeline->footer encontrado"
marcador = '</div>\n <div class="footer">'
else
puts "⚠️ No se encontró marcador específico, usando búsqueda genérica"
# Buscar el último </div> antes del footer
footer_index = contenido.index('<div class="footer">')
if footer_index
# Retroceder para encontrar el </div> anterior
prev_div_index = contenido.rindex('</div>', footer_index)
if prev_div_index
marcador = contenido[prev_div_index..prev_div_index+5] # '</div>'
puts "📍 Último </div> antes del footer encontrado"
else
puts "❌ No se pudo encontrar lugar para insertar hitos"
exit 1
end
else
puts "❌ No se encontró el footer del dashboard"
exit 1
end
end
end
# Insertar los hitos antes del marcador
puts "✏️ Insertando #{HITOS_ADICIONALES.lines.count} líneas de hitos adicionales..."
nuevo_contenido = contenido.gsub(marcador) do |match|
"#{HITOS_ADICIONALES}\n\n #{match}"
end
# Verificar que se insertó correctamente
if nuevo_contenido.length > contenido.length
lineas_agregadas = nuevo_contenido.lines.count - contenido.lines.count
puts "✅ #{lineas_agregadas} líneas agregadas al dashboard"
puts "📊 Nuevo tamaño: #{nuevo_contenido.length} bytes (#{nuevo_contenido.lines.count} líneas)"
else
puts "⚠️ No se detectaron cambios en el contenido"
puts " Intentando método alternativo..."
# Método alternativo: insertar antes del footer
footer_start = '<div class="footer">'
if nuevo_contenido.include?(footer_start)
nuevo_contenido = nuevo_contenido.gsub(footer_start) do |match|
"#{HITOS_ADICIONALES}\n\n #{match}"
end
puts "✅ Hitos insertados antes del footer"
else
puts "❌ No se pudo insertar los hitos"
exit 1
end
end
# Guardar el archivo actualizado
puts "💾 Guardando dashboard actualizado..."
File.write(dashboard_path, nuevo_contenido)
puts "✅ Dashboard actualizado exitosamente"
# Verificación rápida
puts "\n🔍 VERIFICACIÓN RÁPIDA:"
puts " • Archivo original: #{contenido.lines.count} líneas"
puts " • Archivo nuevo: #{nuevo_contenido.lines.count} líneas"
puts " • Diferencia: #{nuevo_contenido.lines.count - contenido.lines.count} líneas agregadas"
# Mostrar algunos de los hitos agregados
puts "\n📋 HITOS AGREGADOS:"
puts " 1. 🔒 BKP02 - Backup Automático de VMs en Proxmox"
puts " 2. 🗄️ DB02 - Backup Automático de Base de Datos sysdasuten"
puts " 3. 📊 MON01 - Monitoreo de Recursos del Hipervisor"
puts " 4. 📋 DOC01 - Documentación Operativa del Sistema"
puts " 5. ⚡ PERF01 - Pruebas de Rendimiento del Sistema"
puts "\n🚀 PRÓXIMOS PASOS:"
puts " 1. Verificar dashboard en: https://ns8.frlr.utn.edu.ar/bitacoras/p2601"
puts " 2. Revisar que los hitos se muestren correctamente"
puts " 3. Actualizar estado según progreso real del proyecto"
puts " 4. Usar herramientas ADN para seguimiento automático"
puts " 5. Registrar cambios en bitácora del proyecto"
puts "\n📅 #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
puts "=" * 60
end
if __FILE__ == $0
begin
main
rescue => e
puts "❌ Error: #{e.message}"
puts e.backtrace if ENV['DEBUG']
exit 1
end
end