B4J=true Group=Default Group ModulesStructureVersion=1 Type=Class Version=8.8 @EndOfDesignText@ 'Handler class Sub Class_Globals Dim j As JSONGenerator ' Dim rdcc As RDCConnector End Sub Public Sub Initialize End Sub Sub Handle(req As ServletRequest, resp As ServletResponse) ' 1. --- Bloque de Seguridad --- If req.GetSession.GetAttribute2("user_is_authorized", False) = False Then resp.SendRedirect("/login") Return End If Dim Command As String = req.GetParameter("command") If Command = "" Then Command = "ping" Log($"Command: ${Command}"$) ' --- MANEJO ESPECIAL PARA SNAPSHOT --- ' El comando "snapshot" no devuelve HTML, sino una imagen. Lo manejamos por separado al principio. If Command = "snapshot" Then Try resp.ContentType = "image/png" Dim robot, toolkit As JavaObject robot.InitializeNewInstance("java.awt.Robot", Null) toolkit.InitializeStatic("java.awt.Toolkit") Dim screenRect As JavaObject screenRect.InitializeNewInstance("java.awt.Rectangle", Array As Object( _ toolkit.RunMethodJO("getDefaultToolkit", Null).RunMethod("getScreenSize", Null))) Dim image As JavaObject = robot.RunMethod("createScreenCapture", Array As Object(screenRect)) Dim ImageIO As JavaObject ImageIO.InitializeStatic("javax.imageio.ImageIO").RunMethod("write", Array As Object(image, "png", resp.OutputStream)) Catch resp.SendError(500, LastException.Message) End Try Return ' Detenemos la ejecución aquí para no enviar más HTML. End If ' --- FIN DE MANEJO ESPECIAL --- ' Para todos los demás comandos, construimos la página HTML resp.ContentType = "text/html" Dim sb As StringBuilder sb.Initialize ' --- Estilos y JavaScript (igual que antes) --- sb.Append("") sb.Append("") sb.Append("") ' --- Cabecera, Botón y Formulario Oculto (igual que antes) --- sb.Append("

Panel de Administración jRDC

") sb.Append($"Bienvenido, ${req.GetSession.GetAttribute("username")}
"$) sb.Append("
") ' sb.Append("") sb.Append("") ' --- Resultado del Comando --- sb.Append("

Resultado del Comando: '" & Command & "'

") sb.Append("
") ' ========================================================================= ' ### INICIO DE TU LÓGICA DE COMANDOS INTEGRADA ### ' ========================================================================= If Command = "reload" Then Private estaDB As String = "" For i = 0 To Main.listaDeCP.Size - 1 Main.Connectors.Get(Main.listaDeCP.get(i)).As(RDCConnector).Initialize(Main.listaDeCP.get(i)) If Main.listaDeCP.get(i) <> "DB1" Then estaDB = "." & Main.listaDeCP.get(i) Else estaDB = "" sb.Append($"Recargando config${estaDB}.properties ($DateTime{DateTime.Now})
"$) sb.Append($"Queries en config.properties: ${Main.Connectors.Get(Main.listaDeCP.get(i)).As(RDCConnector).commands.Size}
"$) sb.Append($"JdbcUrl: ${Main.Connectors.Get(Main.listaDeCP.get(i)).As(RDCConnector).config.Get("JdbcUrl")}
"$) sb.Append($"User: ${Main.Connectors.Get(Main.listaDeCP.get(i)).As(RDCConnector).config.Get("User")}
"$) sb.Append($"ServerPort: ${Main.srvr.Port}

"$) Next Else If Command = "test" Then Try Dim con As SQL = Main.Connectors.Get("DB1").As(RDCConnector).GetConnection("") sb.Append("Connection successful.

") Private estaDB As String = "" Log(Main.listaDeCP) For i = 0 To Main.listaDeCP.Size - 1 If Main.listaDeCP.get(i) <> "" Then estaDB = "." & Main.listaDeCP.get(i) sb.Append($"Using config${estaDB}.properties
"$) Next con.Close Catch resp.Write("Error fetching connection.") End Try Else If Command = "stop" Then ' Public shl As Shell... Else If Command = "rsx" Then Log($"Ejecutamos ${File.DirApp}\start.bat"$) sb.Append($"Ejecutamos ${File.DirApp}\start.bat"$) ' Public shl As Shell... Else If Command = "rpm2" Then Log($"Ejecutamos ${File.DirApp}\reiniciaProcesoPM2.bat"$) sb.Append($"Ejecutamos ${File.DirApp}\reiniciaProcesoPM2.bat"$) ' Public shl As Shell... Else If Command = "reviveBow" Then Log($"Ejecutamos ${File.DirApp}\reiniciaProcesoBow.bat"$) sb.Append($"Ejecutamos ${File.DirApp}\reiniciaProcesoBow.bat

"$) sb.Append($"!!!BOW REINICIANDO!!!"$) Public shl As Shell shl.Initialize("shl","cmd",Array("/c",File.DirApp & "\reiniciaProcesoBow.bat " & Main.srvr.Port)) shl.WorkingDirectory = File.DirApp shl.Run(-1) Else If Command = "paused" Then GlobalParameters.IsPaused = 1 sb.Append("Servidor pausado.") Else If Command = "continue" Then GlobalParameters.IsPaused = 0 sb.Append("Servidor reanudado.") Else If Command = "logs" Then If GlobalParameters.mpLogs.IsInitialized Then j.Initialize(GlobalParameters.mpLogs) sb.Append(j.ToString) End If Else If Command = "block" Then Dim BlockedConIP As String = req.GetParameter("IP") If GlobalParameters.mpBlockConnection.IsInitialized Then GlobalParameters.mpBlockConnection.Put(BlockedConIP, BlockedConIP) sb.Append("IP bloqueada: " & BlockedConIP) End If Else If Command = "unblock" Then Dim UnBlockedConIP As String = req.GetParameter("IP") If GlobalParameters.mpBlockConnection.IsInitialized Then GlobalParameters.mpBlockConnection.Remove(UnBlockedConIP) sb.Append("IP desbloqueada: " & UnBlockedConIP) End If Else If Command = "restartserver" Then Log($"Ejecutamos ${File.DirApp}/restarServer.bat"$) sb.Append("Reiniciando servidor...") Else If Command = "runatstartup" Then File.Copy("C:\jrdcinterface", "startup.bat", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp", "startup.bat") sb.Append("Script de inicio añadido.") Else If Command = "stoprunatstartup" Then File.Delete("C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp", "startup.bat") sb.Append("Script de inicio eliminado.") Else If Command = "totalrequests" Then If GlobalParameters.mpTotalRequests.IsInitialized Then j.Initialize(GlobalParameters.mpTotalRequests) sb.Append(j.ToString) End If Else If Command = "totalblocked" Then If GlobalParameters.mpBlockConnection.IsInitialized Then ' j.Initialize(Global.mpBlockConnection) sb.Append(j.ToString) End If Else If Command = "totalcon" Then If GlobalParameters.mpTotalConnections.IsInitialized Then j.Initialize(GlobalParameters.mpTotalConnections) sb.Append(j.ToString) End If Else If Command = "ping" Then sb.Append($"Pong ($DateTime{DateTime.Now})"$) End If ' ========================================================================= ' ### FIN DE TU LÓGICA DE COMANDOS ### ' ========================================================================= ' --- Cerramos la página y la enviamos --- sb.Append("

Cerrar Sesión | Cambiar Contraseña

") resp.Write(sb.ToString) If GlobalParameters.mpLogs.IsInitialized Then GlobalParameters.mpLogs.Put(Command, "Manager : " & Command & " - Time : " & DateTime.Time(DateTime.Now)) End Sub Sub Handle0(req As ServletRequest, resp As ServletResponse) ' 1. --- Bloque de Seguridad (se mantiene igual) --- If req.GetSession.GetAttribute2("user_is_authorized", False) = False Then resp.SendRedirect("/login") Return End If Dim Command As String = req.GetParameter("command") If Command = "" Then Command = "ping" Log($"Command: ${Command}"$) resp.ContentType = "text/html" ' 2. --- Construimos la ESTRUCTURA de la página --- Dim sb As StringBuilder sb.Initialize ' Estilos para la página sb.Append("") ' Cabecera y bienvenida sb.Append("

Panel de Administración jRDC

") sb.Append($"Bienvenido, ${req.GetSession.GetAttribute("username")}
"$) ' Menú de navegación (se define una sola vez) sb.Append("") ' Formulario para cambiar contraseña sb.Append("
") sb.Append("

Cambiar Contraseña

") sb.Append("
") sb.Append("Contraseña Actual:
") sb.Append("Nueva Contraseña:
") sb.Append("Confirmar Nueva Contraseña:
") sb.Append("") sb.Append("
") ' Sección para el resultado del comando sb.Append("

Resultado del Comando: '" & Command & "'

") sb.Append("
") ' 3. --- Lógica de TUS COMANDOS (modificada para usar sb.Append) --- If Command = "reload" Then Private estaDB As String = "" For i = 0 To Main.listaDeCP.Size - 1 Main.Connectors.Get(Main.listaDeCP.get(i)).As(RDCConnector).Initialize(Main.listaDeCP.get(i)) If Main.listaDeCP.get(i) <> "DB1" Then estaDB = "." & Main.listaDeCP.get(i) Else estaDB = "" sb.Append($"Recargando config${estaDB}.properties ($DateTime{DateTime.Now})
"$) sb.Append($"Queries en config.properties: ${Main.Connectors.Get(Main.listaDeCP.get(i)).As(RDCConnector).commands.Size}
"$) sb.Append($"JdbcUrl: ${Main.Connectors.Get(Main.listaDeCP.get(i)).As(RDCConnector).config.Get("JdbcUrl")}
"$) sb.Append($"User: ${Main.Connectors.Get(Main.listaDeCP.get(i)).As(RDCConnector).config.Get("User")}
"$) sb.Append($"ServerPort: ${Main.srvr.Port}

"$) Next else If Command = "stop" Then ' Tu código para "stop" else If Command = "rsx" Then Log($"Ejecutamos ${File.DirApp}\start.bat"$) sb.Append($"Ejecutamos ${File.DirApp}\start.bat"$) Public shl As Shell shl.Initialize("shl","cmd",Array("/c",File.DirApp & "\start.bat " & Main.srvr.Port)) shl.WorkingDirectory = File.DirApp shl.Run(-1) else If Command = "rpm2" Then Log($"Ejecutamos ${File.DirApp}\reiniciaProcesoPM2.bat"$) sb.Append($"Ejecutamos ${File.DirApp}\reiniciaProcesoPM2.bat"$) Public shl As Shell shl.Initialize("shl","cmd",Array("/c",File.DirApp & "\reiniciaProcesoPM2.bat " & Main.srvr.Port)) shl.WorkingDirectory = File.DirApp shl.Run(-1) else If Command = "reviveBow" Then Log($"Ejecutamos ${File.DirApp}\reiniciaProcesoBow.bat"$) sb.Append($"Ejecutamos ${File.DirApp}\reiniciaProcesoBow.bat

"$) sb.Append($"!!!BOW REINICIANDO!!!"$) Public shl As Shell shl.Initialize("shl","cmd",Array("/c",File.DirApp & "\reiniciaProcesoBow.bat " & Main.srvr.Port)) shl.WorkingDirectory = File.DirApp shl.Run(-1) else if Command = "totalrequests" Then If GlobalParameters.mpTotalRequests.IsInitialized Then j.Initialize(GlobalParameters.mpTotalRequests) sb.Append(j.ToString) End If else if Command = "ping" Then sb.Append($"Pong ($DateTime{DateTime.Now})"$) End If '...(aquí continuaría el resto de tus Else If)... ' 4. --- Cerramos la página y la enviamos TODA JUNTA --- sb.Append("
") ' Cierre de div.output sb.Append("

Cerrar Sesión

") sb.Append("") resp.Write(sb.ToString) ' Se envía toda la página de una vez ' Lógica final de logs (se mantiene igual) If GlobalParameters.mpLogs.IsInitialized Then GlobalParameters.mpLogs.Put(Command, "Manager : " & Command & " - Time : " & DateTime.Time(DateTime.Now)) End Sub