[Core/Infra] Provisionamiento SSH en pc-dasu0 y unificación Nginx tailscale

This commit is contained in:
Ricardo Monla
2026-03-14 10:29:54 -03:00
parent e554bb5d0d
commit b13a389568
50 changed files with 2702 additions and 561 deletions
+74 -2
View File
@@ -107,6 +107,8 @@ module ADN
puts " #{Color::BOLD}Modo:#{Color::RESET} #{entrada['modo'] == 'P' ? 'Presencial' : 'Remoto'}"
puts " #{Color::BOLD}IA:#{Color::RESET} #{entrada['es_ia'] ? 'Sí' : 'No'}"
puts " #{Color::BOLD}Bitácora:#{Color::RESET} #{fecha_hoy} (ID: #{bitacora_id})"
mostrar_pendientes(db)
end
end
@@ -114,7 +116,7 @@ module ADN
def comando_evento_actualizar(args)
if args.length < 1 || args[0].start_with?('-')
puts "#{Color::YELLOW}Uso: adn db evento:actualizar <ID> [OPCIONES]#{Color::RESET}"
puts "Opciones soportadas: --fin \"HH:MM\", --inicio \"HH:MM\", --estado \"\", --descripcion \"Texto\""
puts "Opciones soportadas: --fin \"HH:MM\", --inicio \"HH:MM\", --estado \"\", --descripcion \"Texto\", --nodo \"Nombre\""
return
end
@@ -127,6 +129,7 @@ module ADN
opt.on("--fin HH:MM", "Nueva hora de fin") { |f| opts[:fin] = f }
opt.on("--descripcion TEXTO", "Nueva descripción") { |d| opts[:descripcion] = d }
opt.on("--estado ESTADO", "Nuevo estado (⏳, ✅, ❌, ⚠️, ⏸️)") { |e| opts[:estado] = e }
opt.on("--nodo NOMBRE", "Nuevo nodo") { |n| opts[:nodo_raw] = n }
opt.on("-h", "--help", "Mostrar ayuda") do
puts opt
exit
@@ -141,13 +144,27 @@ module ADN
end
if opts.empty?
puts "#{Color::YELLOW}⚠ No se especificó nada para actualizar. Use --fin, --inicio, --descripcion o --estado#{Color::RESET}"
puts "#{Color::YELLOW}⚠ No se especificó nada para actualizar. Use --fin, --inicio, --descripcion, --estado o --nodo#{Color::RESET}"
return
end
puts "#{Color::CYAN}🔄 Actualizando evento #{id_evento}...#{Color::RESET}"
BitacorasDB::BitacoraDB.with_connection do |db|
if opts.key?(:nodo_raw)
if opts[:nodo_raw].nil? || opts[:nodo_raw].empty?
opts[:nodo_id] = nil
else
nodo = db.find_nodo_by_nombre(opts[:nodo_raw])
if nodo
opts[:nodo_id] = nodo['id']
else
puts "#{Color::YELLOW}⚠ Nodo '#{opts[:nodo_raw]}' no encontrado#{Color::RESET}"
end
end
opts.delete(:nodo_raw)
end
begin
res = db.update_entrada(id_evento, opts)
if res
@@ -160,6 +177,8 @@ module ADN
rescue => e
puts "#{Color::RED}✗ Error: #{e.message}#{Color::RESET}"
end
mostrar_pendientes(db)
end
end
@@ -277,6 +296,59 @@ module ADN
rescue => e
puts "#{Color::RED}✗ Error al eliminar: #{e.message}#{Color::RESET}"
end
mostrar_pendientes(db)
end
end
private
def mostrar_pendientes(db)
puts ""
puts "#{Color::CYAN}⏳ Eventos pendientes de cierre:#{Color::RESET}"
# Filtrar por bitácora de hoy y estado '⏳' o '⏸️'
fecha_hoy = Date.today.to_s
bitacora = db.find_bitacora_by_fecha(fecha_hoy)
unless bitacora
puts " #{Color::DIM}No hay bitácora para hoy.#{Color::RESET}"
return
end
# Buscar todos los pendientes de hoy
entradas_pendientes = db.list_entradas(
bitacora_id: bitacora['id'],
estado: '⏳',
limit: 20
)
# Sumamos pausados si los hay
entradas_pausadas = db.list_entradas(
bitacora_id: bitacora['id'],
estado: '⏸️',
limit: 20
)
entradas = entradas_pendientes + entradas_pausadas
if entradas.empty?
puts " #{Color::GREEN}¡Excelente! No hay eventos pendientes de cierre.#{Color::RESET}"
return
end
# Ordenar por hora de inicio (más antiguos primero)
entradas = entradas.sort_by { |e| e['inicio'] }
entradas.each do |e|
id = e['id'].to_s
inicio = e['inicio'][0..4] # HH:MM:SS -> HH:MM
nodo = (e['nodo_nombre'] || '(sin nodo)')[0..14]
desc = e['descripcion']
desc = desc[0..47] + '...' if desc.length > 50
estado_icon = e['estado']
puts " #{estado_icon} #{Color::YELLOW}ID #{id.ljust(5)}#{Color::RESET} #{inicio.ljust(5)} #{nodo.ljust(15)} #{desc}"
end
end