Gestió remota dels laboratoris de la EPSC ....
Full text
TRABAJO DE FIN DE CARRERA TÍTULO DEL TFC: Gestión remota de los laboratorios de la EPSC TITULACIÓN: Ingeniería Técnica de Telecomunicación, especialidad Sistemas de Telecomunicación AUTOR: Juan Ballestero Cano DIRECTORA: Dolors Royo Vallés FECHA: 11 de noviembre de 2009
TÍTULO DEL TFC: Gestión remota de los laboratorios de la EPSC AUTOR: Juan Ballestero Cano DIRECTORA: Dolors Royo Vallés FECHA: 11 de noviembre de 2009 Resumen El objetivo de este proyecto es diseñar e implementar una aplicación informática multiplataforma que permita gestionar de manera remota el apagado y/o encendido de los sistemas informáticos conectados a una red, en este caso los laboratorios de la EPSC. A su vez, dado que este proyecto está enmarcado en el plan de sostenibilidad de la escuela, se desea tener un control del uso de los equipos informáticos con el fin de tratar de minimizar el consumo energético, con lo cual, todo encendido y apagado de los equipos quedará registrado remotamente en una base de datos. La mayoría de tarjetas de red (Network Interface Card, NIC’s) que existen en la actualidad incorporan el sistema denominado “Wake on Lan” que permite el encendido remoto de un sistema, debido a su simplicidad, este punto no será tratado en este proyecto. Para el proceso de apagado se ha implementado una aplicación en Java, dado su característica de ser un lenguaje multiplataforma, nos permitirá migrar la aplicación independientemente del sistema operativo instalado en el equipo. Dicha aplicación, quedará residente en el sistema remoto que se desee gestionar, y funcionará de manera transparente para el usuario, esperando recibir la orden de apagado/reiniciado desde un servidor, o sino recibe dicha orden, apagando el equipo a la hora programada. Esta misma aplicación informará a un servidor central si el equipo se ha encendido o apagado y quedará registrado en la base de datos. Para el envío de las órdenes de apagado/reiniciado se ha implementado una aplicación también en Java, que a su vez se encarga de gestionar la base de datos. El apagado/reiniciado se puede detener de manera sencilla por parte del usuario remoto en el caso de que esté haciendo uso de la máquina. Para ambas aplicaciones se han diseñado e implementado dos versiones según el protocolo utilizado. Versión sobre TCP/IP y versión Multicast (grupos Multicast).
Title: Remote steps in the EPSC laboratories. Author: Juan Ballestero Cano Director: Dolors Royo Vallés Date: November, 11th 2009 Overview The main goal of this project is designing and implementing a multiplatform computing appliance that could enable dealing in a remote way the switching on and/or off of the computing systems connected to a LAN; In this case, the EPSC laboratories. On the other hand, due the fact that this project is framed on the school sustainability plan. There is a whish of taking control of the use of the computing system with the aim of reducing the energetic charge. Thanks to what is mentioned previously, every switching on or off will be recorded remotely in a date base. Most formerly existing Network Interface Card (NIC’s) are provided with a system called “Wake on LAN” allows the system’s remote switching on. Due to its simplicity, this topic will not be dealt in the project. For the switching off process, there is an increase on the Java application, due to the fact that it is a multiplatform language which will let us migrate the application regardless of the operating system installed in the system. The application mentioned above, will be kept in the remote system wanted to be dealt with. And it will work invisibly for the user, who will wait for the order of switching on or off, otherwise, if the user does not receive such order, the system will be switched off at the scheduled time. This same application will inform a central server if the system has been switched on or off and will be recorded on the data base. It has also been implemented a Java application for the sending of switching orders, which also deals with the data base. The switching off /restart can be stopped by the remote user easily if the machine is being used. It has been designed and implemented two sceneries according to the protocol used on both applications. A version about TCP/IP and Multicast version (Multicast groups).
ÍNDICE INTRODUCCIÓN ............................................................................................... 6 CAPÍTULO 1. TECNOLOGÍAS UTILIZADAS.................................................... 8 1.1 Lenguaje de programación...........................................................................................8 1.2 Control remoto...............................................................................................................8 1.2.1 Encendido remoto...............................................................................................8 1.2.2 Apagado remoto ...............................................................................................10 1.3 Protocolos de conexión..............................................................................................11 1.3.1 Protocolo UDP..................................................................................................11 1.3.2 Protocolo TCP...................................................................................................12 1.3.3 Direccionamiento Multicast................................................................................13 1.4 Sistemas Operativos...................................................................................................15 1.5 Bases de Datos............................................................................................................15 CAPÍTULO 2. DISEÑO DE LA APLICACIÓN ................................................. 17 2.1 Versión TCP/IP.............................................................................................................17 2.1.1 Aplicación Remota............................................................................................17 2.1.2 Aplicación Servidor Central...............................................................................19 2.1.3 Gestión y creación de la base de datos.............................................................21 2.2 Versión Multicast.........................................................................................................25 2.2.1 Aplicación Remota............................................................................................25 2.2.2 Aplicación Servidor Central...............................................................................27 CAPÍTULO 3. PRUEBAS REALIZADAS......................................................... 29 3.1 Versión TCP/IP.............................................................................................................30 3.2 Versión Multicast.........................................................................................................32 CAPÍTULO 4. AMBIENTALIZACIÓN .............................................................. 34 CAPÍTULO 5. CONCLUSIONES.....................................................................35 CAPÍTULO 6. BIBLIOGRAFÍA........................................................................ 36 CAPÍTULO 7. ANEXOS................................................................................... 41 7.1 Versión TCP/IP.............................................................................................................41 7.1.1 Código aplicación Remota (“Aplicación Servidor”).............................................41 7.1.2 Código aplicación Servidor Central (“Aplicación Cliente”) ..................................48 7.1.3 Código consulta a la Base de datos...................................................................54 7.1.4 Código aplicación Servidor recibe aviso y gestión BDD.....................................58
7.2 Versión Multicast.........................................................................................................64 7.2.1 Código aplicación Servidor Central (“Servidor Multicast”) ..................................64 7.2.2 Código aplicación Remota (“Cliente Recibe Info Multicast”)...............................67
6 Gestión Remota de los laboratorios de la EPSC INTRODUCCIÓN Afortunadamente desde hace unos pocos años la conciencia ecológica a nivel mundial ha crecido considerablemente. Años atrás, conceptos como desarrollo sostenible, ahorro energético, el efecto invernadero, emisiones/reducciones de CO2 a la atmósfera, la destrucción de la capa de ozono, se conocían, pero económicamente hablando no interesaban. Por suerte esto ha ido cambiando y en la actualidad tanto instituciones publicas como empresas privadas apuestan por un desarrollo sostenible y un ahorro energético, gracias también, a acuerdos internacionales como el protocolo de Kyoto. Dado el plan de sostenibilidad existente en la escuela, el proyecto que trataremos a continuación está enmarcado en este contexto. El objetivo de dicho proyecto es diseñar e implementar una aplicación informática multiplataforma que permita gestionar de manera remota el apagado y/o encendido de los sistemas informáticos conectados a una red, en este caso los laboratorios de la EPSC. Dado que se pretende minimizar el consumo energético, necesitaremos conocer el uso de los sistemas, con lo cual, todo encendido y apagado de los equipos informáticos quedará registrado remotamente en una base de datos. La mayoría de tarjetas de red (NIC’s) que existen en la actualidad incorporan el sistema denominado “Wake on Lan” (los laboratorios de la escuela cuentan con este sistema), que permite el encendido remoto de un sistema, debido a su simplicidad y a que se ha considerado que el usuario encenderá un ordenador estando físicamente presente en el laboratorio de la escuela, este punto no será tratado en este proyecto. Para el proceso de apagado se ha implementado una aplicación en Java, dado su característica de ser un lenguaje multiplataforma, nos permitirá migrar la aplicación independientemente del sistema operativo instalado en el equipo. Dicha aplicación, quedará residente en el sistema remoto que se desee gestionar, y funcionará de manera transparente para el usuario, esperando recibir la orden de apagado/reiniciado desde un servidor central, o sino recibe dicha orden, apagando el equipo a una hora programada, de esta manera se conseguiría ahorrar energía dado que a partir de la hora del cierre del centro se apagarían automáticamente todos los equipos. Esta misma aplicación informará al servidor central si el equipo se ha encendido o apagado y quedará registrado en la base de datos. El apagado/reiniciado se puede detener de manera sencilla por parte del usuario remoto en el caso de que esté haciendo uso de la máquina, dado que cuando reciba la orden, aparecerá en pantalla un dialogo para confirmar si se desea cancelar. Para el envío de las órdenes de apagado/reiniciado se ha implementado una aplicación también en Java, que a su vez se encarga de gestionar la base de datos, y desde la cual podemos realizar consultas sobre la información almacenada en la base de datos.
Introducción 7 Para ambas aplicaciones se han diseñado e implementado dos versiones según el protocolo utilizado. Una versión sobre TCP/IP y una versión Multicast (grupos Multicast). A continuación en el capitulo 1 describiremos las tecnologías utilizadas en este proyecto, en el capitulo 2 los pasos seguidos en el diseño de la aplicación con uno y otro protocolo, continuaremos detallando las pruebas realizadas en el capitulo 3, finalizaremos con la ambientalización del proyecto (capitulo 4) y expondremos las conclusiones obtenidas en el capitulo 5.
8 Gestión Remota de los laboratorios de la EPSC CAPÍTULO 1. TECNOLOGÍAS UTILIZADAS 1.1 Lenguaje de programación Se nos plantea realizar una aplicación multiplataforma, es decir, que sea funcional independientemente del sistema operativo instalado, con lo cual, decidimos utilizar como lenguaje de programación Java, dado que cumple con los requisitos necesarios para el diseño. La versión de Java utilizada es EE 5 SDK (para más información ver referencia bibliográfica nº 18). Como entorno de programación hemos escogido utilizar el IDE Eclipse (para más información ver referencias bibliográficas nº 2 y 17), se trata de un entorno de código abierto con versiones tanto para Windows como para Linux. 1.2 Control remoto La aplicación diseñada ha de ser capaz de controlar remotamente el encendido y/o apagado los equipos informáticos ubicados en los laboratorios de la escuela, sin dejar de ser extrapolable a cualquier red donde nos encontremos. Veremos a continuación que tecnologías podemos aplicar para resolver esta situación. 1.2.1 Encendido remoto Para el encendido remoto de un sistema informático existe lo que se conoce como Wake On Lan (WOL). Este sistema permite encender un ordenador de manera remota siempre y cuando se encuentre dentro de la misma red desde donde se ha enviado la orden de encendido. Funcionamiento Pongámonos en contexto. Tenemos un laboratorio con una serie de ordenadores conectados a la red y disponemos de un ordenador, al que llamaremos “servidor” y desde el cual queremos encender el resto de máquinas. Este servidor ha de disponer de una aplicación capaz de enviar las órdenes de encendido. Estas órdenes serán una serie de paquetes de datos determinados conocidos como “Magic Packet” y que detallaremos más adelante. Partiendo de la base que los equipos son compatibles con este sistema de encendido remoto, aunque estén apagados, mantienen sus placas base en Stand by y sus NIC’s se encuentran escuchando la red pero sin procesar la información que circula por ella. Cuando la NIC de un equipo detecta un Magic
Tecnologías Utilizadas 9 Packet dirigido a él, envía la orden necesaria a la placa base para que arranque el sistema. Requisitos Disponer de una fuente de alimentación ATX, actualmente todos los equipos incorporan fuentes ATX, pero todavía nos podemos encontrar con algunos equipos antiguos que usan fuentes AT, las cuales son incompatibles con Wake On LAN (WOL). Las antiguas fuentes AT se activan mediante un interruptor que proviene de la misma fuente a través de un cable, mientras que las ATX la enciende y la apaga la placa base. Esto hace imposible un encendido por software con fuente AT ya que cuando apagamos el ordenador no existe corriente alguna en la placa base. Disponer de una placa base que soporte el sistema WOL y activar la opción correspondiente a este sistema en la BIOS. Si no disponemos de una tarjeta de red integrada en la placa base, además de conectar una NIC en el slot correspondiente deberemos conectar dicha tarjeta a la placa base por medio de un cable. Figura 1. Fuente AT vs ATX Figura 2 . Placa Base compatible con WOL Figura 3 . NIC con cable de 3 pines
16 Gestión Remota de los laboratorios de la EPSC Puente JDBC-ODBC El Puente JDBC-ODBC es un driver utilizado por Sun para popularizar JDBC. Este driver convierte todas las llamadas JDBC a llamadas ODBC y realiza la conversión correspondiente de los resultados. La ventaja de este driver es que proporciona, a aplicaciones diseñas en Java, acceso inmediato a todas las fuentes posibles de bases de datos, con lo que sería posible actualizar una aplicación diseñada en c, por ejemplo, a una diseñada en Java y continuar utilizando la misma base de datos, sin la necesidad del volcar la enorme cantidad de datos que puede llegar a contener una determinada base de datos o una nueva diseñada en Java. Figura 5. Puente JDBC-ODBC
Diseño de la Aplicación 17 CAPÍTULO 2. DISEÑO DE LA APLICACIÓN En este capítulo veremos los pasos que hemos seguido para el diseño e implementación de nuestra aplicación. Pongámonos en contexto, queremos gestionar desde un ordenador local el apagado de una serie de ordenadores remotos. El esquema de diseño será el siguiente. Por una banda detallaremos la versión implementada sobre el protocolo TCP y los procedimientos de creación y gestión de la base de datos; y por otra banda detallaremos la versión implementada sobre direccionamiento multicast, o lo que es lo mismo multidifusión IP. 2.1 Versión TCP/IP 2.1.1 Aplicación Remota La aplicación para los equipos remotos la hemos llamado “aplicación servidor” y su código puede ser consultado en los anexos con tal nombre, de aquí en adelante nos referiremos a dicha aplicación como “aplicación remota” para evitar confusiones en la lectura de este documento. Esta aplicación se tendrá que configurar para que se cargue automáticamente cuando la máquina arranque, tanto para entorno Windows como para entorno Linux, y ha tener en ambos sistemas derechos de ejecución como administrador. Una vez cargada, funcionará de manera transparente para el usuario. Al iniciarse el sistema el primer proceso que realiza la aplicación es abrir un puerto sobre protocolo TCP (la elección del número del puerto la realizará el administrador de la red), y trata de establecer comunicación con la IP del Servidor Central, la cual tendremos que conocer a priori porque se especifica en el entorno de programación, dado que dicha aplicación será la encargada de guardar la información que reciba en la base de datos, si la comunicación ha Figura 6. Esquema de diseño.
18 Gestión Remota de los laboratorios de la EPSC tenido éxito informará de su estado, es decir, que se ha encendido y cerrará el puerto. Si la comunicación no ha tenido éxito mostrará un mensaje en pantalla indicando el error que ha sucedido, no habrá constancia en la base de datos de que el ordenador se ha encendido, pero seguirá funcionando (la aplicación remota) y ejecutando el resto de procesos que veremos a continuación. El siguiente proceso que realiza nuestra aplicación es abrir otro puerto sobre protocolo TCP (la elección del número del puerto la realizará el administrador de la red), una vez abierto se mantendrá a la espera escuchando dicho puerto esperando recibir las instrucciones precisas para apagar o reiniciar el ordenador. Aunque se establezca comunicación en dicho puerto, por motivos de seguridad dado que las IP’s de la escuela son publicas, se rechazarán las conexiones que no se realicen estrictamente desde Servidor Central, y se continuará a la espera. Si recibimos una conexión desde el Servidor Central y la orden es correcta, es decir recibimos exactamente “APAGAR” o “REBOOT”, a continuación, comprobará sobre que sistema operativo está trabajando empleando la propiedad “os.name” de la clase “System” de Java que nos permite saber el sistema operativo que se ejecuta, dado que para apagar o reiniciar nuestra aplicación invocará a procedimientos nativos del sistema operativo, y estos son ligeramente diferentes si nos encontramos en Windows o en Linux. El proceso que invocamos para apagar o reiniciar al sistema es “shutdown” y dependiendo los atributos que utilicemos apagará o reiniciará el sistema. Para apagar utilizaremos “shutdown –s –t 180” en Windows y “shutdown –h 3” en Linux; para reiniciar utilizaremos “shutdown –r –t 180” y “shutdown –r 3” respectivamente. El sistema no se apagará o reiniciará instantáneamente sino al cabo de 3 minutos (o 180 segundos), y brindará al usuario la posibilidad de cancelar el apagado, a través de una ventana de dialogo. En el caso de cancelar el proceso, se invocará a shutdown utilizando el atributo –a para Windows y el atributo –c para Linux. Una vez realizado este proceso se ejecuta de nuevo el proceso anterior, avisando a la base de datos de que el ordenador ha sido apagado. Si la primera comunicación (al encenderse el ordenador) ha sido fallida, este punto no se realizará. Figura 7. Aviso de apagado y opción de cancelarlo.
Diseño de la Aplicación 19 Para dotar a nuestro programa de cierta autonomía, y teniendo en cuenta que es posible que la conexión falle y al iniciarse no avise a la base de datos de que está encendido, hemos implementado que llegada una determinada hora, por ejemplo las 21:00, el ordenador se apague automáticamente. Para ello hemos utilizado el método thread de Java (hilos de ejecución), que permite a una misma aplicación tener dos o más procesos ejecutándose paralelamente al mismo tiempo. Como podemos observar en la siguiente figura, el consumo computacional de nuestra aplicación remota es relativamente bajo (11.224KB), en comparación por ejemplo al navegador firefox que está haciendo uso de 102.936KB. Con lo cual nuestra aplicación podría funcionar correctamente en equipos con bajos recursos. 2.1.2 Aplicación Servidor Central La aplicación para el envío de las ordenes de apagado o reiniciado del Servidor Central la hemos llamado “aplicación cliente” y su código puede ser consultado en los anexos con tal nombre, de aquí en adelante nos referiremos a dicha aplicación como “aplicación del Servidor Central” para evitar confusiones en la lectura de este documento. Se trata de una pequeña aplicación visual, muy sencilla de utilizar. Como podemos observar en la siguiente figura, consta de tres botones desde los cuales podemos realizar una consulta a la base de datos (que será la única opción que nos permita justo al iniciar el programa), y Figura 8. Consumo de recursos.
20 Gestión Remota de los laboratorios de la EPSC apagar o reiniciar un equipo remoto introduciendo la IP de dicho equipo en el espacio habilitado para ello. Al pulsar el botón de consulta, internamente estaremos haciendo uso del conector o puente JDBC-ODBC, el cual establecerá una conexión con la base de datos para obtener los datos que contenga según los criterios de selección empleados en la consulta, en este caso aparecerán todos los datos, pero por ejemplo podríamos decidir que solo nos muestre la información de las máquinas remotas que están encendidas omitiendo las apagadas. Si la conexión falla mostrará el correspondiente mensaje de error avisando al usuario. Tras realizar la consulta a la base de datos, estos se nos mostraran en una tabla incrustada en la aplicación; el aspecto visual será el siguiente. Una vez decido que máquina remota queremos apagar, introduciremos la IP en el cuadro de texto y pulsaremos el botón correspondiente. En ese momento nuestra aplicación intentará establecer comunicación con la máquina remota a través del puerto seleccionado anteriormente para la aplicación remota, sobre protocolo TCP. Si no se puede establecer conexión, la IP introducida no es valida o hemos introducido un carácter no valido, la aplicación nos mostrará el correspondiente mensaje de error. Si la conexión ha sido exitosa la información en la base de datos se actualizará y se cerrarán los correspondientes puertos que estén abiertos. Figura 9. Aplicación Servidor Central. Figura 10 . Aplicación Servidor Central tras realizar una consulta.
Diseño de la Aplicación 21 Como podemos observar en la siguiente figura, el consumo computacional de nuestra aplicación cliente es relativamente bajo (15.372KB), en comparación por ejemplo al navegador firefox que está haciendo uso de 104.620KB. Con lo cual nuestra aplicación podría funcionar correctamente en equipos con bajos recursos. 2.1.3 Gestión y creación de la base de datos Llegados a este punto, hemos decido tratar como un proceso independiente, aunque su uso está supeditado al Servidor Central, la gestión de la base de datos con lo cual, hemos diseñado e implementado una pequeña aplicación llamada “Servidor recibe Aviso” y su código puede ser consultado en los anexos con tal nombre, que se ejecutará en segundo plano automáticamente al cargar el sistema, y que hará visible un “icono de sistema” en el área de notificaciones (justo al lado del reloj). Esto nos permite reducir cargas innecesarias en el sistema, dado que, podemos llevar el control de la base de datos por una parte, y cuando queramos apagar un equipo o consultar la base de datos podemos ejecutar la aplicación correspondiente. Figura 11 . Consumo de recursos. Figura 12. Icono de sistema.
22 Gestión Remota de los laboratorios de la EPSC El concepto de funcionamiento de esta aplicación es similar a la aplicación remota; igual que esta, abre el puerto seleccionado para la base de datos sobre protocolo TCP y se mantiene a la espera escuchando dicho puerto. Si se establece conexión y recibe el mensaje “ENCENDIDO”, conectará con la base de datos utilizando el puente JDBC-ODBC y añadirá un nuevo registro en la tabla que contiene el registro, valga la redundancia, de actividad de los equipos remotos, almacenado en dicha tabla el nombre del equipo remoto que se ha encendido, la IP, el estado (encendido o apagado), la fecha y la hora de encendido (campo hora_on); si recibe el mensaje “APAGADO” conectará de nuevo con la base de datos y actualizará el campo “estado” con el nuevo estado para dicha máquina remota, y además añadirá al campo “hora_off” la hora en que se ha apagado. Para hacer uso del conector JDBC-ODBC simplemente tendremos que especificarle a nuestra aplicación los detalles del controlador ODBC instalado en la máquina que gestionará la base de datos; estos detalles son el nombre del driver, el nombre de usuario y la contraseña; la ruta de acceso a la base de datos se especifica en el controlador ODBC. Los pasos a seguir para la instalación de un controlador ODBC son los siguientes. Accederemos a panel de control, una vez ahí ejecutaremos “Orígenes de datos ODBC”, lo encontraremos dentro de “Herramientas administrativas”. (Inciso: para sistemas operativos de 64bits es posible que el driver necesario no lo encontremos disponible, con lo cual, tendremos que ejecutar la misma aplicación pero versión de 32 bits que encontraremos en el directorio “SysWOW64” dentro del directorio “Windows”; en este caso la aplicación se llama “odbcad32.exe”. Nos aparecerá una ventana como la siguiente. Figura 13. Orígenes de datos ODBC.
Diseño de la Aplicación 23 En la pestaña “DSN de usuario” haremos clic en el botón agregar. En la nueva ventana, seleccionaremos el driver “Microsoft Access Driver (*.mdb)” y pulsaremos el botón finalizar. A continuación aparecerá la pantalla de configuración de ODBC de Microsoft Access. Daremos nombre al controlador que hemos creado, una pequeña descripción, y seleccionaremos la base de datos que vamos a utilizar. Una vez hecho esto, pulsaremos el botón “Avanzadas” donde estableceremos el nombre de usuario para iniciar sesión, la contraseña, y en opciones de “Driver” a “valor de driver” le pondremos el nombre que hemos establecido en la ventana anterior. Finalizaremos la instalación del nuevo driver aceptando todas las ventanas que tengamos abiertas. Figura 14. Elección del driver. Figura 15. Configuración de ODBC Microsoft Access.
24 Gestión Remota de los laboratorios de la EPSC La base de datos que utilizaremos, se ha creado utilizando Microsoft Access 2003. Se trata simplemente de una tabla con los siguientes campos, nombre del equipo, IP del equipo, estado del equipo (encendido/apagado), fecha, hora de encendido y hora de apagado. En cuanto al consumo computacional de esta aplicación, como podemos observar en la siguiente figura, es relativamente bajo (10.468KB) e incluso inferior al consumo que tienen las dos aplicaciones anteriores. Figura 16. Opciones avanzadas de configuración. Figura 17. Consumo de recursos.
Diseño de la Aplicación 25 2.2 Versión Multicast El esquema de diseño seguido para la implementación de nuestra aplicación utilizando direccionamiento multicast es el mismo que hemos empleado en el caso anterior; tenemos un equipo local, Servidor Central, desde el cual se desea apagar o reiniciar una serie de máquinas remotas. En este caso, mantendremos la nomenclatura utilizada hasta ahora, refiriéndonos al equipo local como “Servidor Central” y a los equipos remotos como “Aplicación Remota”, en los anexos podremos consultar el código de ambas aplicaciones con los nombres de “Servidor Multicast” y “Cliente Recibe Info Multicast” respectivamente. 2.2.1 Aplicación Remota De la misma manera que la aplicación remota de la versión anterior, esta aplicación se tendrá que configurar, en los ordenadores remotos, para que se cargue automáticamente cuando la máquina arranque, tanto para entorno Windows como para entorno Linux, y ha tener en ambos sistemas derechos de ejecución como administrador. Una vez cargada, funcionará de manera transparente para el usuario. Siguiendo las pautas de diseño de la versión TCP, para dotar a nuestro programa de cierta autonomía, hemos implementado que llegada una determinada hora, por ejemplo las 21:00, el ordenador se apague automáticamente. Para ello, como hemos comentado anteriormente, utilizamos el método thread de Java (hilos de ejecución), que permite a una misma aplicación tener dos o más procesos ejecutándose paralelamente al mismo tiempo. Al iniciarse nuestra aplicación abrirá un socket multicast en un puerto sobre protocolo UDP (la elección del número del puerto la realizará el administrador de la red), e informará al router de que desea pertenecer a un grupo multicast determinado, en este caso nuestro grupo multicast vendrá determinado por la IP Multicast que hemos elegido, siendo esta una IP de clase D “225.1.2.3”; De Figura 18. Esquema de diseño.
32 Gestión Remota de los laboratorios de la EPSC Como vemos, el proceso que hemos cancelado se refleja correctamente de nuevo en la base de datos, teniendo constancia de que ese ordenador sigue en uso. Si el tiempo entre la hora de apagado y la nueva hora de encendido fuera superior a 3 minutos, sabríamos que ha sido un nuevo usuario el que ha encendido la máquina. En el caso de que el usuario apagara el equipo y nuestra aplicación no interviniera en dicho proceso, no habría constancia en la base de datos sobre la hora de apagado de dicho ordenador, quedando este campo vacío; Añadiéndose un nuevo registro en el siguiente ciclo de encendido del equipo. 3.2 Versión Multicast Las pruebas realizadas sobre multicast son bastante más sencillas. Tenemos nuestra aplicación multicast funcionando en todos las máquinas remotas a la espera de recibir las ordenes desde el servidor central. Ejecutamos por tanto la aplicación en el servidor central, y pulsamos el botón correspondiente para realizar el apagado o el reiniciado de las máquinas. Como hemos comentado en el capitulo de diseño de la aplicación, no hemos de indicarle ninguna IP, dado que únicamente hemos creado un grupo multicast. En el caso de extrapolarse a una situación real en la EPSC, posiblemente sería interesante crear diferentes grupos multicast, por ejemplo un grupo que identificara a cada laboratorio. El servidor central envía la orden correspondiente y es el enrutador el encargado de hacer copias del paquete enviado y enviarlos a todos los ordenadores que han informado de su pertenencia al grupo multicast. Comprobamos insitu que en todas las pantallas de los 10 equipos con los que cuenta el laboratorio se muestra el dialogo para cancelar el proceso e informa del apagado del equipo en 3 minutos. La imagen mostrada, es similar a la que vemos en la siguiente figura. Figura 28 . Aviso de apagado y opción de cancelarlo.
Pruebas Realizadas 33 Llegado el caso de implantar nuestro proyecto en un entorno real, tendremos que tener en cuenta si el hardware que conforma la topología de nuestra red es compatible con direccionamiento multicast. Para ambas versiones, (Multicast y TCP), hemos realizado pruebas a través de la red WIFI existente en la escuela. Consistía en apagar las máquinas del laboratorio, donde estamos realizando las pruebas, desde un portátil conectado a la red inalámbrica; Los resultados han sido negativos, es decir, la aplicación no funciona correctamente. Según servicios técnicos de la escuela, esto se debe a problemas con los enrutadores y los puntos de acceso inalámbricos al gestionar los paquetes de información entre distintos rangos de IP. La IP asignada al portátil en la red inalámbrica es de clase A del tipo 10.189.11.XXX, y la red del laboratorio de clase B del tipo 147.83.114.XXX. Dado que las máquinas del laboratorio no cuentan con ninguna distribución del sistema operativo Linux. Hemos realizado una prueba de funcionalidad entre únicamente dos ordenadores, uno de los cuales si contaba con dicho SO. Para ello hemos utilizado un ordenador con entorno Windows Vista como Servidor Central, y el segundo equipo con la distribución de Linux conocida con el nombre de Mandriva. Hemos instalado con privilegios de “Root” la aplicación remota, y enviado desde el servidor central el mensaje “REBOOT”, para reiniciar el equipo (también podíamos haber enviado la orden “APAGAR”). Como podemos observar en la siguiente figura, nuestra aplicación funciona correctamente en Linux, dado que avisa de que va a ser apagada (en este caso de que se va a reiniciar) y permitiendo al usuario del sistema cancelar dicho proceso. Figura 29. Aviso de apagado y opción de cancelarlo sobre SO Linux.
34 Gestión Remota de los laboratorios de la EPSC CAPÍTULO 4. AMBIENTALIZACIÓN Desde que se inicia la construcción del Campus del Baix Llobregat en Castelldefels, el Plan de Medio Ambiente y la Investigación ambiental de la UPC, (para más información ver referencias bibliográficas nº 19 y 20 respectivamente), han trabajado para convertirlo en un campus ejemplar desde el punto de vista ambiental y de la sostenibilidad. Con esta finalidad se elabora el Plan Ambiental del Campus, (para más información ver referencia bibliográfica nº 21), que pretendía impulsar el desarrollo de diversas actuaciones, especialmente durante la fase de diseño, con el fin de iniciar este proceso aplicando una política ambiental preventiva y global. El proyecto de Investigación para la Excelencia Ambiental del Campus de Castelldefels (Laboratorio REAL, nacido en el año 2001) surge de la voluntad de alcanzar los objetivos marcados en dicho Plan. En términos globales se puede entender como la oportunidad de vincular la vida universitaria con la investigación y el desarrollo ambiental. Con ello se brinda la oportunidad a grupos de investigación de la UPC de participar en esta propuesta. Se conforma por tanto como uno de los proyectos emblemáticos de la Universidad Politécnica de Cataluña, en relación con su apuesta por un Desarrollo Sostenible, por las oportunidades que ofrece como un nuevo modelo de referencia para la sociedad. El Parque Mediterráneo de la Tecnología representa un marco desde donde desarrollar proyectos de investigación que tengan el campus o la UPC, como escenario y que pretendan la integración de criterios de sostenibilidad en su desarrollo, tanto en la fase de diseño y ejecución, como en la posterior etapa de funcionamiento. El Campus del Baix Llobregat será al mismo tiempo una prueba piloto y marco de referencia para el resto de intervenciones y proyectos que la UPC realice en un futuro. Teniendo en cuenta todo este contexto, nuestro proyecto está enmarcado precisamente en él, dado que los criterios para el diseño e implementación de nuestra aplicación multiplataforma, que permite gestionar de manera remota y/o programada el apagado de los sistemas informáticos conectados a una red, en este caso los laboratorios de la EPSC, se basan en un desarrollo sostenible y tienen como finalidad minimizar el consumo energético, provocado por la actividad de dichos equipos en periodos no lectivos como pueden ser las noches, los fines de semana o periodos vacacionales.
Conclusiones 35 CAPÍTULO 5. CONCLUSIONES Las conclusiones que podemos extraer una vez finalizado el proyecto son positivas. Los objetivos fijados desde un principio han sido alcanzados, hemos diseñado una aplicación multiplataforma capaz de gestionar el apagado remoto de los laboratorios de la EPSC, siempre y cuando todas las máquinas formen parte de una misma red, sino sería necesario hacer uso de dispositivos tipo gateways (pasarelas). A su vez, nuestra aplicación es capaz de registrar en una base de datos la actividad de los equipos remotos, con lo cual, se puede llevar un control de su utilización, pudiendo así, planificar estrategias para minimizar el consumo eléctrico. Hemos conseguido enmarcar nuestro proyecto tratando de sensibilizar al lector con fines puramente ambientales, dejando de banda la comodidad que supone el hecho de no tener que encontrarnos insitu en los laboratorios para apagar las máquinas que hubieran quedado encendidas; e incluso pasando a ser un proceso automático y desatendido, dado que llegada cierta hora los equipos se apagarían; o incluso siendo el profesor quien decidiera apagar todos los equipos al finalizar la clase desde su ordenador. Puesto que la versión implementada sobre direccionamiento multicast supone una ventaja para el apagado masivo de equipos pero, tiene el inconveniente de las posibles limitaciones de hardware existentes en la topología de la red; Como posible mejora a nuestro proyecto, se podría implementar una base de datos estática con las IP de los equipos que conforman los diferentes laboratorios de la EPSC y a su vez relacionada con la actual base de datos que contiene el estado de los equipos. De esta forma, y a través de una lista de laboratorios, en nuestra aplicación, seleccionar el laboratorio del cual se desea apagar los equipos que estén encendidos. Internamente la aplicación consultaría que IP’s conforman el laboratorio elegido comprobando el estado de dichos equipos (apagados o encendidos, 2ª base de datos relacionada con la primera) y enviando cíclicamente (empleando un bucle), las ordenes de apagado a todos las máquinas de ese laboratorio, sobre protocolo TCP.
36 Gestión Remota de los laboratorios de la EPSC CAPÍTULO 6. BIBLIOGRAFÍA A continuación se detallan todas y cada una de las referencias bibliográficas y url’s utilizadas para elaborar este proyecto. 1. Fundamentos de base de datos 5ª edición, Editorial MC Graw Hill, Madrid 2006, Silberschatz, Korth, Sudarshan. 2. Crear una aplicación con Java y Eclipse http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=270 3. Crear un ejecutable jar con Eclipse http://www.chuidiang.com/chuwiki/index.php?title=Crear_un_proyecto_co n_Eclipse 4. Wake on Lan http://www.configurarequipos.com/doc29.html http://usuariodebian.blogspot.com/2007/12/wake-on-lan-encendido- remoto.html 5. Modelo aplicación cliente-servidor http://neo.lcc.uma.es/evirtual/cdd/tutorial/aplicacion/cliente-servidor.html 6. Conocer el sistema operativo con java http://lineadecodigo.com/2009/02/18/conocer-el-sistema-operativo-con- java/ 7. Multicast http://jungla.dit.upm.es/~jmseyas/linux/mcast.como/Multicast-Como- 6.html http://es.wikipedia.org/wiki/IP_Multicast 8. Comandos para apagar Linux http://gnu-linux-fsloizp.blogspot.com/2009/05/shutdown-sleep-apagado- programado-en.html 9. El puente JDBC-ODBC http://www.mygnet.net/articulos/java/el_puente_jdbcodbc_ejemplo_de_c onexion_entre_java_y_access.191 http://www.slideshare.net/javi2401/java-y-bases-de-datos-presentation 10. Icono de sistema (System Tray Functionality) http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/sy stemtray/
Bibliografía 37 11. Sobre puertos UDP http://ditec.um.es/laso/docs/tut-tcpip/3376c211.html 12. Sobre puertos TCP http://www.configurarequipos.com/doc972.html 13. Sockets TCP y UDP http://www.it.uniovi.es/docencia/GestionGijon/redes/Redes-Practica1- 4.pdf 14. La clase thread http://www.arrakis.es/~abelp/ApuntesJava/Threads.htm 15. Aplicación práctica de thread http://www.reloco.com.ar/prog/java/threads.html 16. Jtable http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTable.html 17. Software de desarrollo, (Eclipse) http://www.eclipse.org/ 18. Java EE 5 SDK http://www.sun.com/ http://www.sun.com/software/learnabout/java/ 19. Investigación ambiental de la UPC http://www.upc.es/mediambient/recerca/recercaambiental.html http://www.upc.es/mediambient/recerca/6energia.html 20. Plan UPC Sostenible 2015 http://www.upc.edu/sostenible2015 21. Plan ambiental del Campus del Baix Llobregat http://www.upc.es/mediambient/recerca/lreal1.html http://www.upc.es/mediambient/recerca/docs/PLA2000.pdf 22. RFC 3171 http://www.faqs.org/ftp/rfc/pdf/rfc3171.txt.pdf
ANEXOS TÍTULO DEL TFC: Gestión remota de los laboratorios de la EPSC TITULACIÓN: Ingeniería Técnica de Telecomunicación, especialidad Sistemas de Telecomunicación AUTOR: Juan Ballestero Cano DIRECTORA: Dolors Royo Vallés FECHA: 11 de noviembre de 2009
Anexos 41 CAPÍTULO 7. Anexos 7.1 Versión TCP/IP 7.1.1 Código aplicación Remota (“Aplicación Servidor”) import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.text.SimpleDateFormat; import java.util.*; class Hora extends Thread { // habilita el apagado del pc programado por hora, ejecutando paralelamente un hilo String temp; Servidor programado; boolean tic = true; public Hora(Servidor aplicacion) { programado = aplicacion; } public void run() { while( tic == true) { try { Date hora = new Date(); SimpleDateFormat formatoHora = new SimpleDateFormat("HH:mm"); temp = formatoHora.format(hora); if(temp.equals("21:00")) { if(programado.OS.equals("Linux")) { programado.exec("shutdown -h 3"); // apagado en 3 minutos } else { programado.exec("shutdown -s -t 180"); // apagado en 3 minutos } programado.activarWINServidor(true); programado.on = false; if(programado.conexion_bdd_ok == true) { programado.ejecutar_Srv_Aviso(); } tic = false; // si a la hora programada, un usuario cancela el apagado el thread se cancela
48 Gestión Remota de los laboratorios de la EPSC //******************************************************************** ** // FIN # CÓDIGO PARA AVISAR QUE EL PC SE HA ENCENDIDO O APAGADO #FIN //******************************************************************** ** public static void main( String args[] ) { Servidor aplicacion; if ( args.length == 0 ) aplicacion = new Servidor( "127.0.0.1" ); else aplicacion = new Servidor ( args[ 0 ] ); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); aplicacion.ejecutar_Srv_Aviso(); } } // fin de la clase Servidor 7.1.2 Código aplicación Servidor Central (“Aplicación Cliente”) import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class Cliente extends JFrame { private static final long serialVersionUID = 1L; private ObjectOutputStream salida; private String servidor; private Socket cliente; private JButton apagar = new JButton("Apagar"); private JButton reiniciar = new JButton("Reiniciar"); private boolean temp1 = false; private boolean temp2 = false; private JTextField campoIntroducirIP = new JTextField(); private JButton consulta = new JButton("Consulta"); private JLabel fondo; private ConsultaBDD Tabla; public Cliente( String host ) { super( "Cliente" ); servidor = host; // establecer el servidor al que se va a conectar este cliente final Container ventana = getContentPane(); setSize( 500, 85 ); setVisible(true);
Anexos 49 setLayout(null); setLocationRelativeTo(null); setResizable(false); ImageIcon imagen = new ImageIcon("fondo.gif"); fondo = new JLabel(imagen); ventana.add(fondo); fondo.setBounds(374, 0 , 120, 60); ventana.add(campoIntroducirIP); campoIntroducirIP.setEditable( false ); campoIntroducirIP.setToolTipText("Introduce una dirección IP valida y pulsa el botón Apagar o Reiniciar"); campoIntroducirIP.setBounds(0, 0, 375, 20); campoIntroducirIP.setText("Introduce una dirección IP valida"); campoIntroducirIP.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evento ) { servidor = evento.getActionCommand(); } } ); campoIntroducirIP.addMouseListener( new MouseListener() { @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub if(campoIntroducirIP.isEditable()) { campoIntroducirIP.setText(""); } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } } ); ventana.add(apagar); apagar.setBounds(0, 20, 125, 40);
50 Gestión Remota de los laboratorios de la EPSC apagar.setToolTipText("APAGAR PC REMOTO"); apagar.setEnabled(false); apagar.addMouseListener( new MouseListener() { @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub if (apagar.isEnabled()) { temp1= true; servidor = campoIntroducirIP.getText(); ejecutarCliente(); campoIntroducirIP.setText("Introduce una dirección IP valida"); } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } } ); // FIN Escuchar evento boton apagar ventana.add(reiniciar); reiniciar.setToolTipText("Reiniciar PC REMOTO"); reiniciar.setEnabled(false); reiniciar.setBounds(125, 20, 125, 40); reiniciar.addMouseListener( new MouseListener() { @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub if(reiniciar.isEnabled()) { temp2=true; servidor = campoIntroducirIP.getText(); ejecutarCliente();
Anexos 51 campoIntroducirIP.setText("Introduce una dirección IP valida"); } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } } ); // FIN Escuchar evento boton reiniciar ventana.add(consulta); consulta.setToolTipText("Realiza una Consulta a la Base de Datos"); consulta.setEnabled(true); consulta.setBounds(250, 20, 125, 40); consulta.addMouseListener( new MouseListener() { /** * @param e */ @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub try { // crear objeto TableModel para los resultados de la consulta Tabla = new ConsultaBDD(); JTable tablaResultados = new JTable(Tabla); JScrollPane panel = new JScrollPane(tablaResultados); apagar.setEnabled(true); reiniciar.setEnabled(true); campoIntroducirIP.setEditable( true ); setResizable(true); setSize(500, 380); setResizable(false); setLocationRelativeTo(null);
52 Gestión Remota de los laboratorios de la EPSC ventana.add(panel); panel.setBounds(0, 60, 495, 290); } // fin de bloque try // atrapar la excepción ClassNotFoundException lanzada por el // objeto ModeloTablaResultados si no se encuentra el controlador de la base de datos catch ( ClassNotFoundException claseNoEncontrada ) { JOptionPane.showMessageDialog( null, "No se encontro el controlador de la base de datos", "No se encontro el controlador", JOptionPane.ERROR_MESSAGE ); } catch ( SQLException excepcionSQL ) { JOptionPane.showMessageDialog( null, excepcionSQL.getMessage(), "Error en la base de datos", JOptionPane.ERROR_MESSAGE ); // asegurar que la conexión a la base de datos esté cerrada Tabla.Cerrar_Conexion_BD(); } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } } ); // FIN Escuchar evento boton reiniciar } // fin del constructor de Cliente // conectarse al servidor private void ejecutarCliente() { try { conectarAServidor(); obtenerDatos(); if ( temp1 == true) { enviarDatos("APAGAR"); }
Anexos 53 if( temp2 == true) { enviarDatos("REBOOT"); } } // el servidor cerró la conexión catch ( EOFException excepcionEOF ) { JOptionPane.showMessageDialog( null, excepcionEOF.getMessage(), "El PC remoto close connection", JOptionPane.ERROR_MESSAGE ); System.err.println( "El cliente termino la conexión" ); } // procesar los problemas que pueden ocurrir al comunicarse con el servidor catch ( IOException excepcionES ) { JOptionPane.showMessageDialog( null, excepcionES.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE ); } finally { cerrarConexion(); } } // fin del método ejecutarCliente // conectarse al servidor private void conectarAServidor() throws IOException { // crear Socket para realizar la conexión con el servidor try { cliente = new Socket( InetAddress.getByName( servidor ), 1234 ); } catch (IOException excepcionES) { JOptionPane.showMessageDialog( null, excepcionES.getMessage(), "No se pudo establecer conexión con el pc remoto", JOptionPane.ERROR_MESSAGE ); } } private void obtenerDatos() throws IOException { // establecer flujo de salida para los objetos salida = new ObjectOutputStream( cliente.getOutputStream() ); salida.flush(); // vacíar búfer de salida para enviar información } // cerrar flujos y socket private void cerrarConexion() { try { salida.close(); cliente.close(); temp1 = temp2 = false; } catch( IOException excepcionES ) {
54 Gestión Remota de los laboratorios de la EPSC JOptionPane.showMessageDialog( null, excepcionES.getMessage(), "No se puedo cerrar la conexión con el pc reomoto", JOptionPane.ERROR_MESSAGE ); excepcionES.printStackTrace(); } } // enviar mensaje al servidor private void enviarDatos( String mensaje ) { // enviar objeto al servidor try { salida.writeObject( mensaje ); salida.flush(); } catch ( IOException excepcionES ) { JOptionPane.showMessageDialog( null, excepcionES.getMessage(), "No se puedo enviar el mensaje de apagado/reiniciado", JOptionPane.ERROR_MESSAGE ); } } public static void main( String args[] ) { Cliente aplicacion; if ( args.length == 0 ) aplicacion = new Cliente( "127.0.0.1" ); else aplicacion = new Cliente( args[ 0 ] ); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // fin de la clase Cliente 7.1.3 Código consulta a la Base de datos Este clase forma parte de la “aplicación cliente” o Aplicación del Servidor Central, detallada en el capitulo anterior. import java.sql.*; import javax.swing.table.*; // Las filas y columnas del objeto ResultSet se cuentan desde 1 y las filas // y columnas del objeto JTable se cuentan desde 0. Al procesar filas // o columnas del objeto ResultSet para usarlas en un objeto JTable, es // necesario sumar 1 al número de fila o columnas para manipular la // columna apropiada del objeto ResultSet (es decir, la columna 0 del objeto JTable // es la columna 1 del objeto ResultSet y la fila 0 del objeto JTable es la fila 1 del objeto ResultSet). public class ConsultaBDD extends AbstractTableModel { /** * */ private static final long serialVersionUID = 1L;
Anexos 55 private String user = "juanito"; private String pass = "juan"; private String driver = "PDRV"; private String url = "jdbc:odbc:"; private Connection conectar; private Statement stmt; private ResultSet resultados; private ResultSetMetaData metaDatos; private int numeroDeFilas; // mantener el registro del estado de la conexión a la base de datos private boolean conectadoALaBaseDeDatos = false; // inicializar conjuntoResultados y obtener su objeto de meta datos; // determinar el número de filas public ConsultaBDD() throws SQLException, ClassNotFoundException { // cargar clase de controlador de base de datos Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); // conectarse a la base de datos url = url + driver; conectar = DriverManager.getConnection( url,user,pass ); // crear objeto Statement para consultar la base de datos stmt = conectar.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY ); // actualizar estado de conexión a la base de datos conectadoALaBaseDeDatos = true; // establecer consulta Consultar_PC_BD(); } // obtener la clase que representa al tipo de columna @SuppressWarnings("unchecked") public Class getColumnClass( int columna ) throws IllegalStateException { // asegurar que la conexión a la base de datos esté disponible if ( !conectadoALaBaseDeDatos ) { throw new IllegalStateException( "No hay conexion a la base de datos" ); } // determinar la clase de Java de columna try { String nombreClase = metaDatos.getColumnClassName( columna + 1 ); // devolver objeto Class que representa a nombreClase return Class.forName( nombreClase ); } // atrapar excepciones SQLException y ClassNotFoundException
56 Gestión Remota de los laboratorios de la EPSC catch ( Exception excepcion ) { excepcion.printStackTrace(); } // si ocurren problemas arriba, suponer que es tipo Object return Object.class; } // obtener el número de columnas en el objeto ResultSet public int getColumnCount() throws IllegalStateException { // asegurar que la conexión a la base de datos esté disponible if ( !conectadoALaBaseDeDatos ) { throw new IllegalStateException( "No hay conexion a la base de datos" ); } // determinar el número de columnas try { return metaDatos.getColumnCount(); } // atrapar excepciones SQLException e imprimir mensaje de error catch ( SQLException excepcionSQL ) { excepcionSQL.printStackTrace(); } // si ocurren problemas arriba, devolver 0 para el número de columnas return 0; } // obtener el nombre de una columna específica en el objeto ResultSet public String getColumnName( int columna ) throws IllegalStateException { // asegurar que la conexión a la base de datos esté disponible if ( !conectadoALaBaseDeDatos ) { throw new IllegalStateException( "No hay conexion a la base de datos" ); } // determinar el nombre de la columna try { return metaDatos.getColumnName( columna + 1 ); } // atrapar excepciones SQLException e imprimir mensaje de error catch ( SQLException excepcionSQL ) { excepcionSQL.printStackTrace(); } // si hay problemas, devolver cadena vacía para el nombre de la columna
Anexos 57 return ""; } // devolver el número de filas en el objeto ResultSet public int getRowCount() throws IllegalStateException { // asegurar que la conexión a la base de datos esté disponible if ( !conectadoALaBaseDeDatos ) { throw new IllegalStateException( "No hay conexion a la base de datos" ); } return numeroDeFilas; } // obtener el valor en una fila y columna específicas public Object getValueAt( int fila, int columna ) throws IllegalStateException { // asegurar que la conexión a la base de datos esté disponible if ( !conectadoALaBaseDeDatos ) { throw new IllegalStateException( "No hay conexion a la base de datos" ); } // obtener un valor en una fila y columna específicas del objeto ResultSet try { resultados.absolute( fila + 1 ); return resultados.getObject( columna + 1 ); } // atrapar excepciones SQLExceptions e imprimir mensaje de error catch ( SQLException excepcionSQL ) { excepcionSQL.printStackTrace(); } // si hay problemas, devolver objeto cadena vacía return ""; } public void Consultar_PC_BD()throws SQLException, IllegalStateException { // asegurar que la conexión a la base de datos esté disponible if ( !conectadoALaBaseDeDatos ) { throw new IllegalStateException( "No hay conexion a la base de datos" ); } // especificar consulta resultados = stmt.executeQuery("SELECT Nombre_Equipo,IP_Equipo,Estado,Fecha,Hora_ON FROM registro_actividad WHERE Estado LIKE 'ENCENDIDO'"); // obtener meta datos para el objeto ResultSet metaDatos = resultados.getMetaData();
64 Gestión Remota de los laboratorios de la EPSC 7.2 Versión Multicast 7.2.1 Código aplicación Servidor Central (“Servidor Multicast”) import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Servidor_Multicast extends JFrame { private static final long serialVersionUID = 1L; private MulticastSocket servidor; private int puerto = 2000; private String grupo; private int ttl = 2; private DatagramPacket paquete; private byte[] buffer = new byte[1024]; private JButton apagar = new JButton("Apagar"); private JButton reiniciar = new JButton("Reiniciar"); private boolean temp1 = false; private boolean temp2 = false; public Servidor_Multicast ( String host ) { super( "Servidor" ); grupo = host; // establecer el servidor al que se va a conectar este cliente Container ventana = getContentPane(); setSize( 280, 90 ); setVisible(true); setResizable(false); ventana.add("North", apagar); apagar.setToolTipText("APAGAR PC REMOTO"); apagar.setEnabled(true); apagar.addMouseListener( new MouseListener() { @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub temp1= true; try { ejecutarServidor(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }
Anexos 65 @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } } ); // FIN Escuchar evento boton apagar ventana.add("South", reiniciar); reiniciar.setToolTipText("Reiniciar PC REMOTO"); reiniciar.setEnabled(true); reiniciar.addMouseListener( new MouseListener() { @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub temp2=true; try { ejecutarServidor(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseReleased(MouseEvent e) { }
66 Gestión Remota de los laboratorios de la EPSC } ); // FIN Escuchar evento boton reiniciar } // fin del constructor de Cliente private void ejecutarServidor() throws IOException { servidor = new MulticastSocket(); try { if ( temp1 == true) { enviarDatos("APAGAR"); } if( temp2 == true) { enviarDatos("REBOOT"); } } finally { cerrarConexion(); } } // fin del método ejecutarCliente // enviar mensaje apagar / reiniciar @SuppressWarnings("deprecation") private void enviarDatos( String mensaje ) throws IOException { try { buffer = mensaje.getBytes(); paquete = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(grupo), puerto); servidor.send(paquete, (byte) ttl); } catch ( IOException excepcionES ) { } } private void cerrarConexion() { servidor.close(); temp1 = temp2 = false; } public static void main( String args[] ) { Servidor_Multicast aplicacion; if ( args.length == 0 ) aplicacion = new Servidor_Multicast( "225.1.2.3" ); else aplicacion = new Servidor_Multicast( args[ 0 ] ); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); } } // fin de la clase Servidor
Anexos 67 7.2.2 Código aplicación Remota (“Cliente Recibe Info Multicast”) import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.text.SimpleDateFormat; import java.util.*; class Hora extends Thread { // habilita el apagado del pc programado por hora, ejecutando paralelamente un hilo String temp; Cliente_Recibe_info_Multicast programado; boolean tic = true; public Hora(Cliente_Recibe_info_Multicast aplicacion) { programado = aplicacion; } public void run() { while( tic == true) { try { Date hora = new Date(); SimpleDateFormat formatoHora = new SimpleDateFormat("HH:mm"); temp = formatoHora.format(hora); if(temp.equals("21:00")) { if(programado.OS.equals("Linux")) { programado.exec("shutdown -h 3"); // apagado en 3 minutos } else { programado.exec("shutdown -s -t 180"); // apagado en 3 minutos } programado.activarWINCliente(true); tic = false; // si a la hora programada, un usuario cancela el apagado el thread se cancela } sleep(60000); // hace una pausa y así no consume cpu // tiempo expresado en milisegundos, total de tiempo = 1 minuto } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }//FIN DEL run }
68 Gestión Remota de los laboratorios de la EPSC public class Cliente_Recibe_info_Multicast extends JFrame { private static final long serialVersionUID = 1L; Hora hilo; String OS = System.getProperty("os.name"); private JButton cancelar = new JButton("Cancelar Apagar/Reboot Remoto"); private MulticastSocket cliente; private int puerto = 2000; private String grupo; private DatagramPacket paquete; private byte[] buffer = new byte[1024]; //************************************************************** ******** // CÓDIGO DEL CLIENTE QUE ESPERA QUE LE DIGAN APAGATE //************************************************************** ******** public Cliente_Recibe_info_Multicast(String host) { super( "Apagado Remoto" ); grupo = host; Container ventana = getContentPane(); ventana.add("Center", cancelar); cancelar.setToolTipText("CANCELAR APAGAR/REBOOT REMOTO"); cancelar.addMouseListener( new MouseListener() { public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub if(OS.equals("Linux")) { exec("shutdown -c"); } else { exec("shutdown -a"); } activarWINCliente(false); // oculta la ventana y se sigue ejecutanto el servidor } public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub
Anexos 69 } } ); // FIN Escuchar evento boton cancelar setSize( 300, 80 ); setVisible( false ); // la ventana de servidor se inicia oculta setResizable(false); hilo = new Hora(this); hilo.start(); } // fin del constructor de Servidor public void ejecutarCliente() { try { // crear un objeto MulticastSocket cliente = new MulticastSocket(puerto); while ( true ) { try { esperarConexion(); obtenerDatos(); procesarConexion(); } // procesar excepción EOFException cuando el cliente cierre la conexión catch ( EOFException excepcionEOF ) { System.err.println( "El servidor terminó la conexión" ); } finally { cerrarConexion(); } } // fin while } // fin del try catch ( IOException excepcionES ) { excepcionES.printStackTrace(); } } // fin del método ejecutarServidor private void esperarConexion() throws IOException { cliente.joinGroup(InetAddress.getByName(grupo)); } // obtener flujos para recibir datos private void obtenerDatos() throws IOException { // establecer flujo de entrada para los objetos paquete = new DatagramPacket(buffer, buffer.length); cliente.receive(paquete); } // procesar la conexión private void procesarConexion() throws IOException { String mensaje = ""; do {
70 Gestión Remota de los laboratorios de la EPSC mensaje = new String(paquete.getData(),0,paquete.getLength()); if(mensaje.equals("APAGAR")) { if(OS.equals("Linux")) { exec("shutdown -h 3"); // apagado en 3 minutos } else { exec("shutdown -s -t 180"); } mensaje = ("TERMINAR"); activarWINCliente(true); } else if(mensaje.equals("REBOOT")) { if(OS.equals("Linux")) { exec("shutdown -r 3"); // reinicio en 3 minutos } else { exec("shutdown -r -t 180"); } mensaje = ("TERMINAR"); activarWINCliente(true); } } while ( !mensaje.equals( "TERMINAR" ) ); } // fin procesarConexion // habilita el metodo para ejecutar cmd public void exec (String cmd) { try { Runtime.getRuntime().exec(cmd); } catch(IOException e) { System.out.println("FALLO AL EJECUTAR"); } } // fin ejecutar aplicación private void cerrarConexion() { try { cliente.leaveGroup(InetAddress.getByName(grupo)); } catch( IOException excepcionES ) { excepcionES.printStackTrace(); } } public void activarWINCliente (final boolean boleano ) { SwingUtilities.invokeLater( new Runnable() { public void run() // HACE VISIBLE VENTANA SERVIDOR
Anexos 71 { setVisible(boleano); } } ); } //******************************************************************** ** // FIN # CÓDIGO DEL CLIENTE QUE ESPERA QUE LE DIGAN APAGATE #FIN //******************************************************************** ** public static void main( String args[] ) { Cliente_Recibe_info_Multicast aplicacion; if ( args.length == 0 ) aplicacion = new Cliente_Recibe_info_Multicast( "225.1.2.3" ); else aplicacion = new Cliente_Recibe_info_Multicast ( args[ 0 ] ); aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); aplicacion.ejecutarCliente(); } }