167 lines
6.7 KiB
Ruby
167 lines
6.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# tools/adn/subcomando_db.rb — Subcomando para operaciones con base de datos dtic-BITACORAs
|
|
# ==============================================================================
|
|
# Este subcomando integra las operaciones de base de datos PostgreSQL con la CLI ADN.
|
|
# Proporciona comandos para gestión de bitácoras, nodos, temas y entradas directamente
|
|
# en la base de datos, permitiendo la migración gradual desde archivos .md.
|
|
#
|
|
# Comandos disponibles:
|
|
# • adn db salud:bd — Verificar conexión y estado de la BD
|
|
# • adn db bitacora:crear [FECHA] — Crear nueva bitácora diaria
|
|
# • adn db bitacora:listar [--limit N] — Listar bitácoras existentes
|
|
# • adn db evento:crear [OPCIONES] — Crear nueva entrada cronológica
|
|
# • adn db evento:listar [OPCIONES] — Listar entradas con filtros
|
|
# • adn db nodo:crear [OPCIONES] — Crear nuevo nodo (servidor/VM/PC)
|
|
# • adn db nodo:listar [OPCIONES] — Listar nodos del sistema
|
|
# • adn db migrar:md [FECHA] — Migrar bitácora .md a base de datos
|
|
# • adn db estadisticas — Mostrar estadísticas del sistema
|
|
#
|
|
# Uso:
|
|
# ./tools/adn/run db [SUBCOMANDO] [OPCIONES]
|
|
|
|
require 'optparse'
|
|
require 'date'
|
|
require 'time'
|
|
|
|
# Cargar módulo BitacorasDB
|
|
begin
|
|
require_relative '../db/core/bitacora_db'
|
|
require_relative '../db/importers/md_importer'
|
|
require_relative '../db/exporters/md_exporter'
|
|
rescue LoadError => e
|
|
# Fallback para desarrollo
|
|
puts "⚠ Advertencia: No se pudo cargar BitacoraDB o MDImporter: #{e.message}"
|
|
puts " Asegúrate de que los archivos en tools/adn/db/ existen"
|
|
end
|
|
|
|
module ADN
|
|
class SubcomandoDB
|
|
require_relative 'db/bitacora'
|
|
require_relative 'db/evento'
|
|
require_relative 'db/nodo'
|
|
require_relative 'db/hito'
|
|
require_relative 'db/misc'
|
|
include SubcomandoDBBitacora
|
|
include SubcomandoDBEvento
|
|
include SubcomandoDBNodo
|
|
include SubcomandoDBHito
|
|
include SubcomandoDBMisc
|
|
# Inicializa el subcomando con argumentos y logger
|
|
#
|
|
# @param args [Array<String>] Argumentos de línea de comandos
|
|
# @param logger [ADNLogger] Instancia de logger para registro
|
|
def initialize(args, logger)
|
|
@args = args
|
|
@logger = logger
|
|
@config = cargar_configuracion
|
|
end
|
|
|
|
# Ejecuta el subcomando según los argumentos proporcionados
|
|
def ejecutar
|
|
if @args.empty? || @args[0] == 'help'
|
|
mostrar_ayuda
|
|
return
|
|
end
|
|
|
|
subcomando = @args[0]
|
|
sub_args = @args[1..-1] || []
|
|
|
|
case subcomando
|
|
when 'salud:bd'
|
|
comando_salud_bd
|
|
when 'bitacora:crear'
|
|
comando_bitacora_crear(sub_args)
|
|
when 'bitacora:listar'
|
|
comando_bitacora_listar(sub_args)
|
|
when 'evento:crear'
|
|
comando_evento_crear(sub_args)
|
|
when 'evento:listar'
|
|
comando_evento_listar(sub_args)
|
|
when 'evento:actualizar'
|
|
comando_evento_actualizar(sub_args)
|
|
when 'nodo:crear'
|
|
comando_nodo_crear(sub_args)
|
|
when 'nodo:listar'
|
|
comando_nodo_listar(sub_args)
|
|
when 'hito:listar'
|
|
comando_hito_listar(sub_args)
|
|
when 'hito:actualizar'
|
|
comando_hito_actualizar(sub_args)
|
|
when 'hito:renombrar'
|
|
comando_hito_renombrar(sub_args)
|
|
when 'hito:ordenar'
|
|
comando_hito_ordenar(sub_args)
|
|
when 'estadisticas'
|
|
comando_estadisticas
|
|
when 'backup'
|
|
comando_backup(sub_args)
|
|
when 'archivar:md'
|
|
comando_archivar_md
|
|
|
|
else
|
|
@logger.error("Subcomando desconocido: #{subcomando}")
|
|
puts "#{Color::RED}✗ Subcomando desconocido: '#{subcomando}'#{Color::RESET}"
|
|
puts ""
|
|
mostrar_ayuda
|
|
exit 1
|
|
end
|
|
rescue Interrupt
|
|
puts "\n#{Color::YELLOW}⚠ Operación interrumpida por el usuario#{Color::RESET}"
|
|
@logger.info("Operación de base de datos interrumpida por usuario")
|
|
exit 130
|
|
rescue => e
|
|
@logger.error("Error en operación de base de datos: #{e.message}", { backtrace: e.backtrace })
|
|
puts "#{Color::RED}✗ Error: #{e.message}#{Color::RESET}"
|
|
puts "#{Color::DIM}#{e.backtrace.first}#{Color::RESET}" if ENV['ADN_DEBUG']
|
|
exit 1
|
|
end
|
|
|
|
private
|
|
|
|
# ─── COMANDOS PRINCIPALES ──────────────────────────────────────────────
|
|
|
|
# ─── MÉTODOS AUXILIARES ──────────────────────────────────────────────
|
|
|
|
# Carga la configuración desde config.yml
|
|
def cargar_configuracion
|
|
config_path = File.join(__dir__, 'config.yml')
|
|
return {} unless File.exist?(config_path)
|
|
|
|
begin
|
|
YAML.load_file(config_path)
|
|
rescue => e
|
|
@logger.error("Error cargando configuración: #{e.message}")
|
|
{}
|
|
end
|
|
end
|
|
|
|
# Muestra la ayuda general del subcomando
|
|
def mostrar_ayuda
|
|
puts "#{Color::BOLD}Uso: ./tools/adn/run db [SUBCOMANDO] [OPCIONES]#{Color::RESET}"
|
|
puts ""
|
|
puts "#{Color::BOLD}Subcomandos disponibles:#{Color::RESET}"
|
|
puts ""
|
|
puts " #{Color::CYAN}salud:bd#{Color::RESET} Verificar conexión y estado de la BD"
|
|
puts " #{Color::CYAN}backup [OPCIONES]#{Color::RESET} Crear backup de la base de datos"
|
|
puts " #{Color::CYAN}bitacora:crear [FECHA]#{Color::RESET} Crear nueva bitácora diaria"
|
|
puts " #{Color::CYAN}bitacora:listar [OPCIONES]#{Color::RESET} Listar bitácoras existentes"
|
|
puts " #{Color::CYAN}evento:crear [OPCIONES]#{Color::RESET} Crear nueva entrada cronológica"
|
|
puts " #{Color::CYAN}evento:listar [OPCIONES]#{Color::RESET} Listar entradas con filtros"
|
|
puts " #{Color::CYAN}nodo:crear [OPCIONES]#{Color::RESET} Crear nuevo nodo (servidor/VM/PC)"
|
|
puts " #{Color::CYAN}nodo:listar [OPCIONES]#{Color::RESET} Listar nodos del sistema"
|
|
puts " #{Color::CYAN}estadisticas#{Color::RESET} Mostrar estadísticas del sistema"
|
|
puts " #{Color::CYAN}archivar:md#{Color::RESET} Mueve los archivos .md migrados al archivo histórico"
|
|
puts ""
|
|
puts "#{Color::BOLD}Ejemplos:#{Color::RESET}"
|
|
puts " ./tools/adn/run db salud:bd"
|
|
puts " ./tools/adn/run db bitacora:crear --resumen \"Inicio de proyecto\""
|
|
puts " ./tools/adn/run db evento:crear --inicio 09:00 --descripcion \"Reunión\" --nodo srv-ns8"
|
|
puts " ./tools/adn/run db nodo:listar --tipo servidor"
|
|
puts ""
|
|
puts "#{Color::YELLOW}⚠ Nota:#{Color::RESET} Requiere PostgreSQL en ejecución (puerto 5433)"
|
|
puts " Iniciar contenedor: #{Color::DIM}cd dtic-BITACORAs && docker-compose up -d#{Color::RESET}"
|
|
end
|
|
end
|
|
end
|