Files
Ricardo Monla 160da47f96 [P2606] WebServer NGINX: plan actualizado, ficha nodo, HTTPS operativo
- P2606: Plan v1.1 EN EJECUCIÓN. Fases 1-3 completadas.
- Ficha nodo srvv-nginx-rm.md. P2606 en adn/07_proyectos.md.
- Incluye cambios acumulados de sesiones anteriores.
2026-03-28 12:18:42 -03:00

284 lines
7.8 KiB
Ruby

# frozen_string_literal: true
require 'date'
require_relative '../core/colores'
require_relative '../core/help_formatter'
class SubcomandoGenerar
def initialize(args, logger)
@args = args
@logger = logger
end
def ejecutar
# Envolvemos todo en un manejador de eventos del sistema
ADN.eventos.publicar(:sistema_iniciado, { subcomando: 'generar' }, silencioso: true)
if @args.empty?
@logger.error("Se requiere tipo de generación")
mostrar_ayuda_generar
exit 1
end
tipo = @args[0]
@args.shift
case tipo
when 'bitacora'
generar_bitacora
when 'nodo'
generar_nodo
when 'proyecto'
generar_proyecto
when 'evento'
generar_evento
else
@logger.error("Tipo de generación desconocido: #{tipo}")
mostrar_ayuda_generar
exit 1
end
end
private
def mostrar_ayuda_generar
ayuda = ADN::HelpFormatter.generar_help(
titulo: "Generador de Componentes ADN",
descripcion: "Genera nuevos componentes en el ecosistema ADN",
uso: "./adn/tools/run generar <tipo> [argumentos]",
opciones: [
{ names: ['bitacora [fecha]'], desc: "Crea nueva bitácora (fecha: YYYY-MM-DD, default: hoy)" },
{ names: ['nodo <nombre>'], desc: "Crea ficha de nodo" },
{ names: ['proyecto <código>'], desc: "Crea manifiesto de proyecto" },
{ names: ['evento <tipo>'], desc: "Crea plantilla de detalle para evento" }
],
ejemplos: [
{ cmd: "./adn/tools/run generar bitacora", desc: "Crear bitácora para hoy" },
{ cmd: "./adn/tools/run generar nodo srv-nuevo", desc: "Crear ficha para el nodo srv-nuevo" },
{ cmd: "./adn/tools/run generar proyecto P2604", desc: "Crear manifiesto para el proyecto P2604" },
{ cmd: "./adn/tools/run generar evento implementacion", desc: "Ver plantilla de implementación" }
]
)
puts ayuda
end
def generar_bitacora
fecha = @args[0] || Date.today.iso8601
# Validar formato de fecha
unless fecha.match?(/^\d{4}-\d{2}-\d{2}$/)
@logger.error("Formato de fecha inválido. Usar YYYY-MM-DD")
exit 1
end
ruta_bitacora = File.join(ADN::BITACORAS_DIR, "#{fecha}.md")
if File.exist?(ruta_bitacora)
@logger.advertencia("La bitácora para #{fecha} ya existe")
puts "#{Color::YELLOW}⚠ La bitácora #{fecha}.md ya existe#{Color::RESET}"
exit 0
end
# Plantilla de bitácora
plantilla = <<~PLANTILLA_BITACORA
# Bitácora #{fecha}
---
## 📋 Control de Gestión
### Pendientes
| ID | Nodo | Detalle |
| :--- | :--- | :--- |
### En Proceso
| ID | Nodo | Detalle |
| :--- | :--- | :--- |
### Resumen de Actividades
| Nodo | Resumen Integral |
| :--- | :--- |
---
## 📝 Actividades Detalladas
<!-- Agregar actividades por nodo aquí -->
---
<!-- 🤖 PREMISAS DE TRABAJO (IA): Fuente de Verdad adn/05_ia.md -->
PLANTILLA_BITACORA
File.write(ruta_bitacora, plantilla)
@logger.exito("Bitácora creada: #{fecha}.md")
puts "#{Color::GREEN}✓ Bitácora creada en: #{ruta_bitacora}#{Color::RESET}"
puts "#{Color::DIM}Para editarla: vim #{ruta_bitacora}#{Color::RESET}"
end
def generar_nodo
if @args.empty?
@logger.error("Se requiere nombre para el nodo")
puts "Uso: ./adn/tools/run generar nodo <nombre-nodo>"
exit 1
end
nombre = @args[0].downcase # Forzar minúsculas según gobernanza
ruta_nodo = File.join(ADN::NODOS_DIR, "#{nombre}.md")
if File.exist?(ruta_nodo)
@logger.advertencia("La ficha para el nodo #{nombre} ya existe")
puts "#{Color::YELLOW}⚠ La ficha #{nombre}.md ya existe#{Color::RESET}"
exit 0
end
# Plantilla de nodo
plantilla = <<~PLANTILLA_NODO
# Ficha de Nodo: #{nombre}
| Atributo | Valor |
| :--- | :--- |
| **Hostname** | `#{nombre}` |
| **IP LAN** | `10.0.10.X` |
| **Sistema Operativo** | *Especificar* |
| **Rol** | *Describir función* |
## Especificaciones de Hardware
- **CPU**: *Especificar*
- **RAM**: *Especificar*
- **Disco**: *Especificar*
## Servicios y Responsabilidades
1. *Listar servicios críticos*
## Acceso y Mantenimiento
- **Gestión**: *SSH, Web, etc.*
- **Backup**: *Estrategia de respaldo*
- **Monitorización**: *Herramientas de monitoreo*
## Dependencias
- *Listar nodos/proyectos dependientes*
## Historial de Cambios Relevantes
- #{Date.today}: Ficha creada automáticamente
PLANTILLA_NODO
File.write(ruta_nodo, plantilla)
@logger.exito("Ficha de nodo creada: #{nombre}.md")
puts "#{Color::GREEN}✓ Ficha de nodo creada en: #{ruta_nodo}#{Color::RESET}"
end
def generar_proyecto
if @args.empty?
@logger.error("Se requiere código para el proyecto")
puts "Uso: ./adn/tools/run generar proyecto <código> [nombre]"
exit 1
end
codigo = @args[0].upcase
nombre = @args[1] || "Proyecto #{codigo}"
ruta_proyecto = File.join(ADN::PROYECTOS_DIR, "#{codigo}_#{nombre.downcase.gsub(/\s+/, '_')}.md")
if File.exist?(ruta_proyecto)
@logger.advertencia("El manifiesto para el proyecto #{codigo} ya existe")
puts "#{Color::YELLOW}⚠ El manifiesto #{codigo}_*.md ya existe#{Color::RESET}"
exit 0
end
# Plantilla de proyecto
plantilla = <<~PLANTILLA_PROYECTO
# #{codigo} - #{nombre}
**Estado:** 📍 Definido
**Fecha Inicio:** #{Date.today}
**Fecha Fin Estimada:** *Especificar*
## Objetivo
*Describir el propósito y qué problema resuelve*
## Stakeholders
| Rol | Nombre | Contacto |
| :--- | :--- | :--- |
| *Ej: Coordinador* | *Nombre* | *email/tel* |
## 🌐 Topología y Contexto de Red
*Describir ubicación de nodos, subredes, requisitos de acceso*
## Nodos Involucrados
### Nodos Exclusivos (Core)
- *Listar nodos centrales del proyecto*
### Nodos de Soporte/Infraestructura
- *Listar nodos de infraestructura compartida*
## Herramientas
- *Software, scripts y servicios utilizados*
## Hitos Clave
| ID | Hito | Estado | Fecha |
| :--- | :--- | :---: | :--- |
| 1 | *Primer hito* | 📍 | *Fecha* |
---
## 📊 Progreso
```
Fase 1: ░░░░░░░░░░ 0% Nombre de la Fase
```
---
## Dashboard
*URL del panel de seguimiento web (si aplica)*
## Referencias
- [ADN del Proyecto](../adn/00_indice.md)
- *Otras referencias relevantes*
---
*Manifiesto generado automáticamente el #{Date.today}*
PLANTILLA_PROYECTO
File.write(ruta_proyecto, plantilla)
@logger.exito("Manifiesto de proyecto creado: #{codigo}")
puts "#{Color::GREEN}✓ Manifiesto creado en: #{ruta_proyecto}#{Color::RESET}"
end
def generar_evento
require_relative '../templates/plantillas_eventos'
tipo = @args[0]
if tipo.nil? || tipo.empty?
puts "#{Color::CYAN}📋 Tipos de plantillas de eventos disponibles:#{Color::RESET}"
puts ""
ADN::PlantillasEventos.lista_tipos.each do |t|
puts " #{Color::GREEN}#{t}#{Color::RESET}"
end
puts ""
puts "Uso: #{Color::DIM}./adn/tools/run generar evento <tipo>#{Color::RESET}"
puts "Ejemplo: #{Color::DIM}./adn/tools/run generar evento implementacion#{Color::RESET}"
return
end
if ADN::PlantillasEventos.existe?(tipo)
puts "#{Color::CYAN}📝 Plantilla: #{tipo}#{Color::RESET}"
puts ""
puts ADN::PlantillasEventos.obtener(tipo)
else
puts "#{Color::RED}✗ Tipo de plantilla desconocido: #{tipo}#{Color::RESET}"
puts "#{Color::YELLOW}Tipos disponibles:#{Color::RESET}"
ADN::PlantillasEventos.lista_tipos.each { |t| puts " - #{t}" }
end
end
end