231 lines
6.0 KiB
Ruby
231 lines
6.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'date'
|
|
require_relative '../core/colores'
|
|
|
|
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
|
|
else
|
|
@logger.error("Tipo de generación desconocido: #{tipo}")
|
|
mostrar_ayuda_generar
|
|
exit 1
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def mostrar_ayuda_generar
|
|
puts "Uso: ./adn/tools/run generar <tipo> [argumentos]"
|
|
puts ""
|
|
puts "Tipos disponibles:"
|
|
puts " bitacora [fecha] Generar nueva bitácora (fecha: YYYY-MM-DD, default: hoy)"
|
|
puts " nodo <nombre> Generar ficha de nodo"
|
|
puts " proyecto <código> Generar manifiesto de proyecto"
|
|
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* |
|
|
|
|
## 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
|
|
end
|