Estructura per a servidors de serveis a xarxes IRC AUTOR: Rubén Lozano Díaz DIRECTOR: Carlos Molina Clemente Adreça electrònica: [email protected] Resum: El present projecte s’encarrega de construir una estructura sòlida que permetria que un servidor, principalment sobre xarxes IRC, reculli i serveixi peticions d’usuaris registrats a una base de dades. Tres son les unitats principals que entren en joc en aquesta infraestructura: usuaris, servidor i base de dades. Als usuaris els anomenarem serveis, aquests serveis podran conectar-se a aquest servidor per a que executi les peticions que faran. Aquestes peticions seran validades i nomes els serveis que tinguin els permisos adients podran executar les peticions que es demanin. El servidor no només constarà de processament de rutines sinó que també podrà estar a l’escolta de donats esdeveniments de xarxa als que un usuari mai podrà tenir accés per si mateix. Aquesta escolta serà realitzada per un patró de disseny observer amb una connexió remota asíncrona per xml-rpc, el mateix tipus de connexió que realitzen els serveis al servidor però al sentit oposat. La base de dades associada al servidor serveix per guardar les dades de validació dels serveis així com els seus permisos. A la base de dades també estarà creada la estructura bàsica de dades d’una xarxa IRC per poder guardar la informació que es desitgi. El projecte no només es centra a aquests aspectes tècnics sinó que té com a pilar central la compatibilitat per poder conectar-se des de qualsevol plataforma i sota qualsevol llenguatge fent servir un estàndard de connexions per a rutines remotes. També intenta aproximar l’ús de codi obert; l’única part de software privatiu del projecte la aporta el servidor Oracle, tot i que gràcies a hibernate i a la JDBC de Java es possible canviar el tipus de base de dades modificant un número de paràmetres mínim. Proyecto fin de carrera Rubén Lozano Díaz Resumen: El presente proyecto se encarga de construir una estructura sólida para permitir que un servidor, principalmente sobre redes IRC, recoja y sirva peticiones de usuarios registrados en una base de datos. Tres son las unidades principales que entran en acción en esta infraestructura: usuarios, servidor y base de datos. Los usuarios serán llamados servicios, estos servicios podrán conectarse a este servidor para que ejecute las peticiones que realizan. Estas peticiones serán validadas y solo los servicios que tengan los permisos oportunos podrán ejecutar las rutinas que pidan. El servidor no solo constará de procesamiento de rutinas sino que también podrá estar a la escucha de ciertos eventos de red a los que un usuario nunca podrá tener acceso por si mismo. Esta escucha está realizada por un patrón de diseño observer con conexión remota asíncrona por xml-rpc, el mismo tipo de conexión que realizan los servicios al servidor pero en el sentido contrario. La base de datos asociada al servidor sirve para guardar los datos de validación de los servicios así como sus permisos. En la base de datos también estará creada la estructura básica de datos de una red IRC para poder guardar la información que se desee. El proyecto no solo se centra en estos aspectos técnicos sino que tiene como pilar central la compatibilidad para poder conectarse desde cualquier plataforma y bajo cualquier lenguaje mediante un estándar en conexiones de procedimientos remotos. También intenta hacer hincapié en el uso del código abierto; la única parte de software privativo del proyecto la aporta el servidor Oracle, y de todas formas gracias a hibernate y a la JDBC de Java es posible cambiar el tipo de base de datos modificando un número de parámetros mínimo. Abstract: This project is responsible for building a solid structure to allow a server, especially on IRC networks, pick and serve user requests in a database. There are three main units that come into action in the infrastructure: user, server and database. Users will be called services, these services can connect to this server to run applications that services want to perform. These petitions will be validated so only those services which have the appropriate permissions can execute the requested procedures. The server does not just consist of processing procedures, but may also be listening to certain network events to which a user can never gain access for himself. An observer design pattern is implemented in this project for asynchronous remote connection with xml-rpc, the same type of connection being made by services to the server, but in the opposite direction. The associated database server used to store the data validation services as well as their permissions. At database is also created the basic structure of an IRC network data to save the information anyone wants. The project not only focuses on these points but is compatible to connect from any platform and in any language through standard remote connection procedures. It also seeks to emphasize the use of open source though Oracle is privative software. Anyway using hibernate and JDBC Java we can change the database by modifying a minimum number of parameters. Titulació: Enginyera Tècnica en Informàtica de Gestió Data Presentació: Juny de 2009. 2 Proyecto fin de carrera Rubén Lozano Díaz Índice 1. Introducción .................................................................................................... 4 1.1 Internet Relay Chat ................................................................................... 4 1.1.1 Definición ........................................................................................... 4 1.1.2 Servidores .......................................................................................... 7 1.1.3 Redes ................................................................................................. 9 1.1.4 Clientes ............................................................................................ 11 1.1.5 Servicios ........................................................................................... 12 1.1.6 Origen e historia ............................................................................... 13 1.2 Persistencia ............................................................................................ 14 1.2.1 ORACLE .......................................................................................... 15 1.2.2 Hibernate.......................................................................................... 17 1.3 Protocolos de comunicación ................................................................... 19 1.3.1 HTTP ................................................................................................ 20 1.3.2 XML-RPC ......................................................................................... 21 2. Motivación y objetivos del proyecto .............................................................. 23 2.1 Objetivos ................................................................................................. 23 2.2 Motivación ............................................................................................... 24 3. Especificaciones........................................................................................... 26 3.1 Persistencia ............................................................................................ 27 3.2 Comunicación con Redes IRC ................................................................ 29 3.3 Comunicación con servicios .................................................................... 29 4. Diseño e implementación ............................................................................. 30 4.1 Base de datos ......................................................................................... 31 4.2 Modelo de clases .................................................................................... 36 5. Desarrollo ..................................................................................................... 46 5.1 Croquis temporal ..................................................................................... 46 5.2 Servicios de ejemplo ............................................................................... 47 6. Herramientas ................................................................................................ 48 7. Software Libre .............................................................................................. 55 7.1 Introducción al software libre .................................................................. 55 7.2 Importancia del software libre en este proyecto ...................................... 56 8. Conclusiones ................................................................................................ 57 9. Bibliografía ................................................................................................... 58 3 Proyecto fin de carrera Rubén Lozano Díaz 1. Introducción 1.1 Internet Relay Chat 1.1.1 Definición IRC (Internet Relay Chat) es un protocolo de comunicación, bajo TCP/IP, en tiempo real basado en texto, que permite debates en grupo o entre dos personas y que está clasificado dentro de los servicios de comunicación en tiempo real. Se diferencia de la mensajería instantánea en que los usuarios no deben acceder a establecer la comunicación de antemano, de tal forma que todos los usuarios que se encuentran en un canal pueden comunicarse entre sí, aunque no hayan tenido ningún contacto anterior. Las conversaciones se desarrollan en los llamados canales de IRC, grupos de usuarios que hablan sobre un tema en común, designados por nombres que habitualmente comienzan con el carácter # o & (este último sólo es utilizado en canales locales del servidor). Es un sistema de charlas ampliamente utilizado por personas de todo el mundo. Los usuarios del IRC utilizan una aplicación cliente para conectarse con un servidor, en el que funciona una aplicación IRCd (IRC Daemon o servidor de IRC) que gestiona los canales y las conversaciones. Desde el punto de vista de un cliente, se pueden observar, en gran mayoría tres cosas: los usuarios1, los canales2 y los servidores3. Los usuarios, bajo un nick u apodo, se conectarán a un servidor concreto y una vez autenticados en el sistema tendrán acceso a salas de charla (canales) donde, junto con otros 1 Personas que podrán interactuar con otros usuarios en una red IRC. 2 Espacio virtual donde cierto numero de usuarios podrán recibir los mensajes que los demás usuarios del canal envíen a éste. 3 También llamado HUB, los servidores son las unidades indivisibles de las que están formadas las redes IRC enviando, procesando y recibiendo información tanto de usuarios como de otros servidores para formar una red IRC. 4 Proyecto fin de carrera Rubén Lozano Díaz usuarios, podrán charlar de temas en común, usarlo de sitio de reunión, organización de eventos, ciberjuegos y todo lo que pueda dar de sí la comunicación textual. Si se desea, se puede mantener conversaciones privadas con ciertos usuarios de tal manera que nadie más puede intervenir de ninguna manera en esa conversación. Figura 1 Estructura Clientes – Red IRC Dentro de cada canal se juegan varios tipos de roles, usualmente: • El Operador: Denotado con una “@” delante del nick, es el usuario o grupo de usuarios que tiene administración total sobre ese canal en concreto, pudiendo nombrar operadores, “ayudantes”, echar a cualquier usuario, banear (impedir durante cierto tiempo la entrada al canal) a 5 Proyecto fin de carrera Rubén Lozano Díaz usuarios, y editar las características del canal (contraseña, limite de usuarios, edición del Topic o tema de conversación… etc). • El “Ayudante”: Denotado con un “+” delante del nick, suele ser el encargado de recordar las normas del canal y encauzar los temas de conversación por el camino correcto. No tiene más poder que ser en cierta manera el “ojito derecho” de los operadores. Hay una característica de los canales que un Operador puede modificar para que en un canal únicamente puedan escribir Operadores y Ayudantes, prohibiendo así el derecho de escritura al siguiente grupo, los Usuarios. • El Usuario: No tienen símbolos especiales, solo les acompaña su nick, aportan ideas, temas y conversaciones a los canales y son el grueso de los canales, esto no quiere decir que los operadores y los ayudantes tengan cosas que decir en las conversaciones al mismo nivel que cualquier usuario. 6 Proyecto fin de carrera Rubén Lozano Díaz 1.1.2 Servidores En informática, un servidor es un tipo de software que realiza ciertas tareas en nombre de los usuarios. El término servidor ahora también se utiliza para referirse al ordenador físico en el cual funciona ese software, una máquina cuyo propósito es proveer datos de modo que otras máquinas puedan utilizar esos datos. En nuestro caso hablaremos de los servidores que provee datos de conexiones de usuarios a otros usuarios, canales.. etc. Los servidores están a la escucha de conexiones entrantes tanto de Clientes como de otros Servidores. Usaremos servidores que entiendan el protocolo P10 de comunicación de IRC. Las conexiones de otros servidores vendrán por el puerto de comunicaciones 4400 produciéndose así un NetJoin4. En cambio, las conexiones con clientes vendrán por el puerto 6667. Las conexiones por servidor requieren de una contraseña, cosa que una conexión con cliente no. Los servidores tienen administradores llamados IRC Operator 5 . Un IRC Operator podrá realizar Kills 6 sobre los servidores en referencia a nicks o a máscaras de red (X@Y donde X es el host/ip del cliente e Y es el ISP). Un Kill en un servidor se denomina K-Line e impedirá la entrada de ese nick o host durante un tiempo determinado o indefinido especificado en el comando lanzado por el IRC Operator. Por otro lado, un kill en una red IRC se denomina G-Line que es un K-Line en todos los servidores de una red IRC. Algo importante y necesario que pueden hacer los servidores es la propagación de comandos en una Red IRC para informar a los otros servidores de las acciones de cliente que se producen en el servidor o para informar sobre eventos y acciones de servidor. La gran mayoria de propagaciones solo se producen entre servidores y solo una minoria localizada se producirá entre servidor y usuario. 4 Proceso de intercambio de información entre dos redes IRC al conectar entre ellas dos servidores. 5 Administrador de una red IRC en la que tiene el control total y absoluto. 6 Proceso por el cual se restringe el acceso a un usuario sobre un servidor en concreto. 7 Proyecto fin de carrera Rubén Lozano Díaz Dentro de los tipos de servidores, y el protocolo IRC, la forma de enviarse mensajes varía de unos servidores a otros apareciendo de por medio los protocolos de servidor. Muchos servidores cuelgan del uso de un protocolo común con implementaciones, características, y especificaciones diferentes así como servidores con características similares pueden tener un protocolo de comunicación diferente. Todos los servidores que comparten el mismo protocolo de mensajes pueden estar conectados entre ellos aunque hayan estado programados por diferentes personas, en entornos diferentes y bajo lenguajes que no tengan nada que ver gracias a la simpleza de recibir y enviar cadenas de texto. 8 Proyecto fin de carrera Rubén Lozano Díaz 1.1.3 Redes Una red IRC esta formada por como mínimo un servidor. Los servidores tienen un máximo de clientes conectados y de canales, todo determinado por cada servidor y configurado por cada IRC Operator para un funcionamiento óptimo. El punto fuerte de IRC es la parte distribuida. Dos usuarios en dos servidores diferentes pueden compartir tema de conversación en un canal determinado y compartir todo lo que nos ofrece una red IRC. Los puntos delicados de los servidores son los puntos críticos: 1. NetJoin: Cuando un servidor conecta con cualquier otro servidor ya conectado a una red lo que está haciendo es una propagación del comando de la conexión de tal manera que todos los servidores de la red, en ese instante, le mandarán un flujo de datos con los canales, los usuarios, los modos/configuración de cada canal, los bans producidos, nicks y demás información de cada servidor de tal manera que cada servidor se cuida de las transacciones de sus clientes y sus canales, teniendo en cuenta toda la información recibida. De esta manera en base a dos redes IRC independientes se produce una tercera, que está formada por las dos anteriores. 2. NetSplit: Literalmente “separación de la red” ocurre cuando un servidor se cae o es desconectado de la red llevándose con él todos los usuarios que tenia conectados. De hecho no es una carga transaccional tan grande como un netJoin, solo que es inesperado y no suele pasar, únicamente por razones de mantenimiento o de inestabilidad de la red a la que está conectado el servidor. 9 Proyecto fin de carrera Rubén Lozano Díaz Figura 2 NetSplit en una red IRC 3. Bottleneck: En un determinado momento muchísimos usuarios lanzaran peticiones a un único servidor produciendo un relentizamiento notable de éste siendo pura casualidad, o mal intencionado (Ataque Distributed Denial Of Service), peticiones masivas a un servidor con el objetivo de producir problemas en servir peticiones de usuarios no mal intencionados. 10 Proyecto fin de carrera Rubén Lozano Díaz 1.1.4 Clientes Un cliente, sin referirse al cliente como el usuario que está conectado en una red, sino como el sistema que permite una conexión es de lo que hablaremos en esta sección. Un cliente se conecta a un servidor por el puerto de comunicaciones 6667 y el servidor introducirá este usuario en la red de la que forme parte. A un cliente solo le llegará información que pida, o la propagación de los usuarios que se unen o salen de los canales de la red IRC y los cambios de estado de estos usuarios en los canales. En ningún caso recibirán propagaciones de comandos de servidor como NetJoins, autentificaciones de usuario, de servidor, etc. La figura del IRC Operator no es otra que un cliente identificado como tal con una contraseña. En este caso sí que el IRC Operator puede recibir información privilegiada por los servidores, pero no por recepción de comandos propagados sino por el envío de la información de la red al IRC Operator a través de un servidor. Se produce la misma situación cuando un IRC Operator quiere propagar un comando a la red; debe enviarlo primero a un servidor y éste propagará el comando por él. Uno de los clientes más usados es mIRC para Windows, muchos de los clientes de Windows son modificaciones de mIRC. 11 Proyecto fin de carrera Rubén Lozano Díaz 1.1.5 Servicios Desde el punto de vista de un servidor, un cliente recibe y envía comandos; si este usuario es de carne y hueso o es un software le es totalmente indiferente. Tendremos servicios del servidor y/o servicios de los usuarios conectados a la red haciendo tareas diversas. Un administrador de un servidor puede querer registrar canales para que la existencia de estos sea indefinida y esté ligado a uno o varios usuarios que serán los Operadores del canal. Esto no viene por defecto con la mayoria de servidores de IRC por lo que un IRC Operator puede hacer un Bot para que escriba en una base de datos los canales y autentifique la creación, y validación de estos. Esto es solo un ejemplo de Servicio enfocado al servidor, pero también podemos tener servicios que monitorizan los usuarios de la red, o servicios que hacen de administradores de la propia red. Tambien puedes tener servicios en canales específicos que en base a lo que los usuarios hablan en un canal registre un log de mensajes, o incluso gracias a inteligencia artificial, un servicios que registren componentes semánticos y pueda darte respuestas concretas a preguntas independientemente del lenguaje (Monty Bot). 12 Proyecto fin de carrera Rubén Lozano Díaz 1.1.6 Origen e historia En los años 80 Jaiko Oikarinen trabajaba en el Departamento de Ciencia del Procesamiento de la Información de la Universidad de Oulu. Como no tenía mucho trabajo, empezó a desarrollar un programa de comunicaciones que haría que las populares BBS (Bulletin Board System) fueran más usables. Los BBS eran sistemas a los que te conectabas mediante Terminal para leer noticias, descargar software, datos, etc. que estaban bastante “de moda”. El propósito era permitir que allí hubiera discusiones y grupos del estilo de las News de USENET (Users Network, sistema global de discusión en Internet), además de discusiones en tiempo real y otras cosas relacionadas con la BBS. Un sencillo programa llamado MUT (Multiuser Talk) ya existía en las BBS, el problema era que no funcionaba debidamente, y a raíz de que Jyrki Kuoppala había implementado el programa rmsg para enviar mensajes a gente en otras máquinas pese a que no tenia implementado el concepto de canal (aunque lo soportaba), se acabó implementando IRC para las BBS. IRC vió la luz en Agosto de 1988, y más tarde cuando IRC empezó a tener ocasionalmente más de 10 usuarios, Jarkko pidió a unos amigos suyos al sur de Finlandia que pusieran en funcionamiento algunos servidores en la universidad de Helsinki y en la de Tampere. Markku Jarvinen mejoró el cliente de IRC por lo que pronto, la idea de añadir funciones a la BBS se vio que no era buena idea, por lo que ésta fue abandonada y solo permaneció IRC. Como punto interesante, IRC se hizo popular cuando fue utilizado en el intento de golpe de estado en la Unión Soviética de 1991 para informar a través de un periodo de censura en los medios. Fue utilizado de similar manera por los Kuwaitíes durante la Invasión a Irak. 13 Proyecto fin de carrera Rubén Lozano Díaz 1.2 Persistencia Se entiende por persistencia como la acción de preservar la información de un objeto de forma permanente (guardar), pero a su vez también se refiere a poder recuperar la información del mismo (leer) para que pueda ser nuevamente utilizada. En el caso de persistencia de objetos la información que persiste en la mayoría de los casos son los valores que contienen los atributos en ese momento, no necesariamente la funcionalidad que proveen sus métodos. Nota: La persistencia no es ni una capacidad ni una propiedad de la POO, no tiene nada que ver con el paradigma en sí, solo es el mecanismo que se usa para persistir información de un determinado tipo (como puede ser serializar, guardar los datos en una tabla, en un archivo plano, etc). Desde la óptica de la persistencia, se podrían clasificar los objetos en: • Transitorios: Cuyo tiempo de vida depende directamente del ámbito del proceso que los instanció. • Persistentes: Cuyo estado es almacenado en un medio secundario para su posterior reconstrucción y utilización, por lo que su tiempo de vida es independiente del proceso que los instanció. La persistencia permite al programador almacenar, transferir y recuperar el estado de los objetos. Para esto existen varias técnicas: • Serialización • Motores de persistencia • Bases de datos orientadas a objetos En el caso que nos ocupa, usaremos una base de datos ORACLE y una herramienta objeto-relacional llamada Hibernate. 14 Proyecto fin de carrera Rubén Lozano Díaz 1.2.1 ORACLE Oracle es un sistema de gestión de base de datos relacional (o RDBMS por el acrónimo en inglés de Relational Data Base Management System), desarrollado por Oracle Corporation. Se considera a Oracle como uno de los sistemas de bases de datos más completos, destacando su: Soporte de transacciones . Estabilidad. Escalabilidad. Soporte multiplataforma. Oracle surge a finales de los 70 bajo el nombre de Relational Software a partir de un estudio sobre SGBD (Sistemas Gestores de Base de Datos) de George Koch. Computer World definió este estudio como uno de los más completos jamás escritos sobre bases de datos. Este artículo incluía una comparativa de productos que erigía a Relational Software como el más completo desde el punto de vista técnico. Esto se debía a que usaba la filosofía de las bases de datos relacionales, algo que por aquella época era todavía desconocido. En la actualidad, Oracle todavía encabeza la lista. La tecnología Oracle se encuentra prácticamente en todas las industrias alrededor del mundo y en las oficinas de 98 de las 100 empresas Fortune 100. Oracle es la primera compañía de software que desarrolla e implementa software para empresas 100 por ciento activado por Internet a través de toda su línea de productos: base de datos, aplicaciones comerciales y herramientas de desarrollo de aplicaciones y soporte de decisiones. Oracle es el proveedor mundial líder de software para administración de información, y la segunda empresa de software. 15 Proyecto fin de carrera Rubén Lozano Díaz Oracle a partir de la versión 10g Release 2, cuenta con 5 ediciones: Oracle Database Enterprise Edition(EE). Oracle Database Standard Edition (SE). Oracle Database Standard Edition One (SE1). Oracle Database Express Edition (XE). Oracle Database Personal Edition (PE). La única edición gratuita es la Express Edition, que es compatible con las demás ediciones de Oracle Database 10gR2 y Oracle Database 11g. La que usaremos en este proyecto será Oracle Database Express Edition (XE). Figura 3 Estructura Oracle DB 16 Proyecto fin de carrera Rubén Lozano Díaz 1.2.2 Hibernate Hibernate es una herramienta de Mapeo objeto-relacional para la plataforma Java (y disponible también para .Net con el nombre de NHibernate) que facilita el mapeo de atributos entre una base de datos relacional tradicional y el modelo de objetos de una aplicación, mediante archivos declarativos (XML) que permiten establecer relaciones a nivel de objetos. Hibernate es software libre, distribuido bajo los términos de la licencia GNU LGPL. La característica primaria de Hibernate es mapear clases de Java sobre tablas de bases de datos (y de tipos de datos de Java a tipos de datos de SQL). También proporciona ayuda para consulta y obtención de datos. Hibernate genera las llamadas de SQL y le quita al desarrollador la tarea de tratar la llamada y la conversión a los objetos a los que desea convertir, dejando la aplicación portable a todas las bases de datos SQL, a cambio de solo un pequeño pico en rendimiento. Figura 4 Esquema arquitectura de hibernate 17 Proyecto fin de carrera Rubén Lozano Díaz Como todas las herramientas de su tipo, Hibernate busca solucionar el problema de la diferencia entre los dos modelos de datos coexistentes en una aplicación: el usado en la memoria de la computadora (orientación a objetos) y el usado en las bases de datos (modelo relacional). Para lograr esto permite al desarrollador detallar cómo es su modelo de datos, qué relaciones existen y qué forma tienen. Con esta información Hibernate le permite a la aplicación manipular los datos de la base operando sobre objetos, con todas las características de la POO. Hibernate convertirá los datos entre los tipos utilizados por Java y los definidos por SQL. Hibernate genera las sentencias SQL y libera al desarrollador del manejo manual de los datos que resultan de la ejecución de dichas sentencias, manteniendo la portabilidad entre todos los motores de bases de datos con un ligero incremento en el tiempo de ejecución. Hibernate está diseñado para ser flexible en cuanto al esquema de tablas utilizado, para poder adaptarse a su uso sobre una base de datos ya existente. También tiene la funcionalidad de crear la base de datos a partir de la información disponible. Hibernate ofrece también un lenguaje de consulta de datos llamado HQL (Hibernate Query Language), al mismo tiempo que una API para construir las consultas programáticamente (conocida como "criteria"). Hibernate para Java puede ser utilizado en aplicaciones Java independientes o en aplicaciones Java EE, mediante el componente Hibernate Annotations que implementa el estándar JPA, que es parte de esta plataforma. 18 Proyecto fin de carrera Rubén Lozano Díaz 1.3 Protocolos de comunicación Los protocolos son reglas de comunicación que permiten el flujo de información entre computadoras distintas que manejan lenguajes distintos, por ejemplo, dos computadores conectados en la misma red pero con protocolos diferentes no podrían comunicarse jamás, para ello, es necesario que ambas "hablen" el mismo idioma, por tal sentido, el protocolo TCP/IP fue creado para las comunicaciones en Internet, para que cualquier computador se conecte a Internet, es necesario que tenga instalado este protocolo de comunicación. Los protocolos implantados en sistemas de comunicación con un amplio impacto, suelen convertirse en estándares, debido a que la comunicación e intercambio de información (datos) es un factor fundamental en numerosos sistemas, y para asegurar tal comunicación se vuelve necesario copiar el diseño y funcionamiento a partir del ejemplo pre-existente. Esto ocurre tanto de manera informal como deliberada. Existen consorcios empresariales, que tienen como propósito precisamente el de proponer recomendaciones de estándares que se deben respetar para asegurar la interoperabilidad de los productos (p.e. W3C). 19 Proyecto fin de carrera Rubén Lozano Díaz 1.3.1 HTTP El protocolo de transferencia de hipertexto (HTTP, HyperText Transfer Protocol) es el protocolo usado en cada transacción de la Web (WWW). HTTP fue desarrollado por el consorcio W3C y la IETF, colaboración que culminó en 1999 con la publicación de una serie de RFC, siendo el más importante de ellos el RFC 2616, que especifica la versión 1.1. HTTP define la sintaxis y la semántica que utilizan los elementos software de la arquitectura web (clientes, servidores, proxies) para comunicarse. Es un protocolo orientado a transacciones y sigue el esquema petición-respuesta entre un cliente y un servidor. Al cliente que efectúa la petición (un navegador o un spider) se lo conoce como "user agent" (agente del usuario). A la información transmitida se la llama recurso y se la identifica mediante un URL. Los recursos pueden ser archivos, el resultado de la ejecución de un programa, una consulta a una base de datos, la traducción automática de un documento, etc. HTTP es un protocolo sin estado, es decir, que no guarda ninguna información sobre conexiones anteriores. El desarrollo de aplicaciones web necesita frecuentemente mantener estado. Para esto se usan las cookies, que es información que un servidor puede almacenar en el sistema cliente. Esto le permite a las aplicaciones web instituir la noción de "sesión", y también permite rastrear usuarios ya que las cookies pueden guardarse en el cliente por tiempo indeterminado. 20 Proyecto fin de carrera Rubén Lozano Díaz 1.3.2 XML-RPC XML-RPC es un protocolo de llamada usa XML(Extensible Markup Language) para a procedimiento codificar los remoto que datos y HTTP(HyperText Transfer Protocol) como protocolo de transmisión de mensajes. Es un protocolo muy simple ya que sólo define unos cuantos tipos de datos y comandos útiles, además de una descripción completa de corta extensión. La simplicidad del XML-RPC está en contraste con la mayoría de protocolos RPC que tiene una documentación extensa y requiere considerable soporte de software para su uso. Fue creado por Dave Winer de la empresa UserLand Software en asociación con Microsoft en el año 1998. Al considerar Microsoft que era muy simple decidió añadirle funcionalidades, tras las cuales, después de varias etapas de desarrollo, el estándar dejó de ser sencillo y se convirtió en lo que es actualmente conocido como SOAP. Una diferencia fundamental es que en los procedimientos en SOAP los parámetros tienen nombre y no interesan su orden, no siendo así en XML-RPC. Figura 5 Modelo XML-RPC 21 Proyecto fin de carrera Rubén Lozano Díaz Según la especificación de XML-RPC, los principales tipos de datos son: • Array: Arreglo de valores, sin almacenar llaves. • Base64: Datos binarios codificados en base 64. • Boolean: Valor lógico (0 o 1). • Date/Time: Día y hora. • Double: Número de coma flotante de doble precisión • Integer: Número entero. • String: String (cadena) de caracteres. • Struct: Arreglo de valores, almacenando llaves. • Nil: Valor nulo. El echo de escoger este sistema es por la gran variedad de implementaciones que existen, y en el caso de que no existiera para un lenguaje/plataforma determinados, al haber un número pequeño de tipos de datos se podría implementar con un coste temporal relativamente bajo. 22 Proyecto fin de carrera Rubén Lozano Díaz 2. Motivación y objetivos del proyecto 2.1 Objetivos Se pretende implementar un servidor que sirva para procesar cualquier tipo de servicio asociado a una red de servidores de IRC mediante un protocolo que abstraiga la comunicación cliente-servidor a un punto donde de igual el lenguaje en el que estés programando. La modificación, agregación o supresión de servicios deberá ser de una manera fácil y rápida. Esta implementación deberá poder almacenar datos referentes a la red IRC a la que el servidor esté conectado. También deberá dar una arquitectura de soporte para implementaciones de protocolos de red IRC. Se tendrá en cuenta la seguridad de las conexiones de servicios asignando privilegios a ciertos usuarios. Estos privilegios pasan por la ejecución de rutinas concretas en el servicio y de llamadas concretas a la base de datos, de tal manera que un servicio que no tenga el privilegio de hacer inserciones no podrá insertar datos en las tablas concretas donde no tenga privilegios. 23 Proyecto fin de carrera Rubén Lozano Díaz 2.2 Motivación Al escoger XML-RPC hemos optado por sencillez y por resultados. Está más que probado como un estándar fiable, estructurado y estable que proporciona resultados. Al proporcionar servicios a través de XML-RPC podemos asegurar una comunicación multiplataforma y multilenguaje. En este caso el servidor está hecho bajo tecnología Java pero al usar XML-RPC como protocolo de intercambio de información nos da igual qué haya al otro lado porque lo que nos envían es información que podemos entender en cualquier lenguaje y plataforma. Esto surge del hecho de que se necesitan lenguajes concretos para conseguir información de redes IRC y de sus servicios asociados como el lenguaje C, y en el caso de que no quisieras usar este lenguaje, te tienes que hacer tú mismo las rutinas de parseo de datos y de comunicación llegando incluso a crearte tu propio servidor. Por otro lado tenemos la facilidad de programación, con el Framework enviamos ordenes sencillas y esperamos identificadores sencillos con los que poder trabajar de inmediato, en cambio, de otra manera se debería implementar un protocolo de información dependiendo de cada servidor al que quieres conectar. 24 Proyecto fin de carrera Rubén Lozano Díaz El hecho de proporcionar una herramienta flexible, fácil de usar y versátil supone una mejora muy grande para el mundo en los servicios a IRC: -Flexible: El Framework está totalmente modularizado por lo que soporta no solo nuevos protocolos de IRC modificando muy poco código sino que también soporta nuevos módulos de servicios. -Fácil de usar: Únicamente debemos lanzar funciones de código a través de XML-RPC con los parámetros indicados en las especificaciones para poder obtener resultados. -Versátil: XML-RPC es un estándar en el que esta basadas muchas otras herramientas. A un nivel básico también podríamos usar estas herramientas complejas para lanzar acciones sobre el Framework. Enfocándolo por otro sitio, al ser un estándar es un protocolo muy enseñado y en cuanto a llamadas a procedimientos remotos, esto es la base. 25 Proyecto fin de carrera Rubén Lozano Díaz 3. Especificaciones A grosso modo se pueden diferenciar tres grandes módulos en la Estructura: Servicios: Se encargará de recibir conexiones externas. Proporcionará datos o ejecutará las acciones que los servicios externos hayan pedido tanto sobre el modulo IRC como la persistencia. También podrá enviar información que reciba del bloque IRC sin necesidad de que le sea pedida cada vez. Persistencia: Se encargará de almacenar los datos que han de mantenerse persistentes del modulo de servicios y del de IRC. IRC: Se encargará de llevar las conexiones a redes IRC y de informar a los servicios que le pidan información. Figura 6 Mapa módulos 26 Proyecto fin de carrera Rubén Lozano Díaz 3.1 Persistencia Es el modulo que se encargará de guardar indefinidamente la información que le sea transferida, y será el que ha de devolver los datos que le sean requeridos. Diferenciaremos dos tipos de grandes bloques que deben ser persistentes: Datos IRC: Cuando le sea requerido, se deben poder guardar los siguientes datos: Usuarios: Será la cuenta de uso sobre la red IRC. Tendrá asociado una contraseña, los nicks que tenga registrados, e-mail, estado de cuenta, y roles asociados. Nicks: Varios nicks estarán asociados a un Usuario registrado. Guardará la fecha de último uso, la fecha de creación y el estado. Roles: Un rol determinado que pueda tener cierto Usuario en la red IRC asociada. Privilegios: Estarán asociados a Roles de tal manera que un Usuario tendrá ciertos privilegios indirectamente definidos por los Roles que tiene definidos, o podremos relacionar ciertos privilegios directamente a un Usuario. Canales: Cierto usuario podría registrar un canal en la red IRC en el que constará como fundador y para el que será Operador en el momento que se valide, además de guardar toda la información relacionada con el canal en el instante de ser guardada. Mensajes: Se guardarán mensajes entre usuarios como correspondencia entre ellos. Bans: Se podrán guardar los bans que tenga un canal. G-lines: Se podrán guardar los G-lines que tenga una red. 27 Proyecto fin de carrera Rubén Lozano Díaz Datos Servicios: Servicios querrán conectarse al framework, pero no todos los servicios tendrán el nivel de acceso máximo para ejecutar cualquier petición sobre los módulos. Por este motivo se mantendrá persistente un registro de servicios identificados por usuario y contraseña que tendrán asociados unos privilegios. Estos privilegios serán los que les permitan hacer ciertas acciones. Este módulo tendrá dos capas: Base de datos: La capa de la persistencia en sí con una base de datos que no tiene por qué estar en la misma máquina del Framework. A la que solo será accesible la capa de los Data Access Object. Data Access Object: No accederemos a la base de datos directamente, sino que usaremos Hibernate. Nos proporcionará la información de la base de datos sin tener que abandonar el paradigma orientado a objetos. 28 Proyecto fin de carrera Rubén Lozano Díaz 3.2 Comunicación con Redes IRC Es el módulo que conectará a redes IRC gracias a una interfaz que permitirá conexiones con redes que usen cualquier tipo de protocolo de transferencia de datos entre servidores. Deberá guardar los objetos de la red en memoria para poder responder a las peticiones de los servicios con la mayor brevedad posible, ya sean operaciones de persistencia, como de petición de datos de la red. Las operaciones de persistencia que impliquen objetos en memoria del módulo de IRC, deberán hacerse a través de este. También deberá soportar un sistema de registro a ciertos comandos para poder informar a los servicios que lo requieran sobre cambios en la red en el subconjunto especificado. 3.3 Comunicación con servicios Es el modulo que permitirá ejecutar lo que les servicios le pidan y devolverá los datos que le sean requeridos siempre y cuando cumplan con los privilegios suficientes como para poder ejecutar/solicitar lo que el servicio necesite. El administrador del framework será la única interfaz que podrá añadir o quitar cuentas de servicio y de asignarles los respectivos privilegios. Será el módulo principal porque a partir de las conexiones con los servicios se llamarán a funcionalidades de los otros módulos. Existe cierta independencia entre el modulo de persistencia y el modulo de IRC pero estos dos tienen dependencia total sobre el modulo de Servicios. 29 Proyecto fin de carrera Rubén Lozano Díaz 4. Diseño e implementación Después de una fase de análisis y recogida de requerimientos se decidió separar el diseño en tres fases: Base de datos: Se necesitaba la creación y conectividad con una base de datos para poder guardar cualquier tipo de dato relacionado con una red IRC además de proporcionar una capa de abstracción entre la base de datos y el código. Se procedió con un diseño Entidad-Relación que posteriormente fue implementado mediante SQL sobre una Oracle Database Express Edition. La siguiente capa por debajo de la orientación a objetos se implementó con Hibernate, que gracias a sus herramientas de ingeniería inversa solo hacía falta tener creada la base de datos para la autogeneración de todo lo necesario. Paquete IRC: Se necesitaba una estructura con la que solo hiciera falta la programación del código concreto a ejecutar para eventos de servidor, y el código del protocolo de IRC concreto para llamar a estos eventos. Gracias la arquitectura del Jibble PircBot solo se tuvo que tener en cuenta los eventos de servidor, ya que la estructura de PircBot está orientada al cliente y no al servidor. A partir de aquí, se necesitaba una implementación concreta con la que poder hacer pruebas. IRC Hispano es un protocolo de IRC muy fiable y cada vez más usado, se decidió usar éste para las pruebas por lo que la siguiente fase era la implementación de este protocolo usando la estructura. Paquete XML-RPC: En principio este módulo debía ser fácil y rápido de programar, solo queríamos estar a la escucha de conexiones entrantes validarlas, y devolver un resultado, además también estaba la utilidad de estar a la escucha de comandos concretos. No fue tan fácil y rápido porque la implementación de xml-rpc para Java no ofrecía la posibilidad de validar usuario, contraseña y obtener al mismo tiempo los datos de la conexión y el nombre del método que se quería ejecutar. Se tuvo que modificar el núcleo de este módulo que al ser código abierto no hubo problema alguno en leer, estudiar y modificar. 30 Proyecto fin de carrera Rubén Lozano Díaz 4.1 Base de datos Estas tres tablas son muy importantes y sirven para almacenar los datos de validación de cada servicio y poder relacionarlos con los privilegios que tienen. Podemos observar que los privilegios sobre los servicios son acumulativos y podremos tener tantos privilegios asignados a un servicio como queramos, no obstante con guardar estos datos no basta. Es posible que algún servicio quiera tener persistencia de algún objeto de la red IRC en nuestra estructura y por lo tanto se lo debemos dar de una manera controlada y accesible para los otros servicios que quieran verlo. Esta sería la parte “publica” de los datos, no obstante, los servicios que tengan los suficientes privilegios podrían crearse sus propias tablas privadas en la base de datos a través de SQL. De esta manera, para obtener el modelo Entidad-Relación de las tablas, debemos mirar al apartado de persistencia de las especificaciones. IRC está orientado a usuarios, y todo 31 Proyecto fin de carrera Rubén Lozano Díaz Figura 7 Diagrama de las tablas de la base de datos 32 Proyecto fin de carrera Rubén Lozano Díaz Para que la estructura pueda trabajar sin perder la orientación a objetos con las tablas públicas, se ha usado Hibernate y sus herramientas de ingeniería inversa para dar transparencia a las operaciones con la base de datos. Figura 8 Fichero de configuración Configurando un fichero de configuración, añadiendo el driver para JDBC al directorio del proyecto solo queda añadir cómo relacionaremos las tablas con objetos. Figura 9 Parte de la configuración de las herramientas de ingeniería inversa 33 Proyecto fin de carrera Rubén Lozano Díaz Una vez configurado el entorno hibernate ejecutaremos la herramienta de ingeniería inversa y nos generará los beans y los ficheros de mapeo. Figura 10 Ficheros generados por hibernate Excepto algunas clases que ya teníamos en el paquete beans podemos observar que hibernate nos ha creado todos los objetos de la base de datos, y sus correspondientes mappings. 34 Proyecto fin de carrera Rubén Lozano Díaz El siguiente paso para tener la parte de la base de datos terminada es la creación de los DAO (Data Access Object) para cada tipo de objeto que permitirá la escrituras, lecturas, borrados y consultas sobre nuestros datos. El framework trabaja sobre un DAO Base que implementa escritura, borrado, modificado y consulta por id básico. Figura 11 Estructura del DAO Base 35 Proyecto fin de carrera Rubén Lozano Díaz 4.2 Modelo de clases El proyecto no es excesivamente complejo, pero por su extensión, por la cantidad de clases y métodos, un diagrama de clases convencional no es una opción posible para mostrar el trabajo por lo que debemos recurrir a este diagrama de paquetes donde mostramos la información y clases clave. Figura 12 Diagrama de paquetes 36 Proyecto fin de carrera Rubén Lozano Díaz Paquete beans Observamos lo que hemos visto con anterioridad; tenemos las clases autogeneradas que se utilizarán como datos a guardar o recuperar de la base de datos. En estas implementaciones hemos ubicado otras clases en beans “especiales” que nos sirven para tener un estado actualizado en tiempo real en memoria. Como tener un control exhaustivo de toda la información de cada Nick es un coste de memoria que no es necesario, se ha definido otra clase vean para representar un Nick con información obligatoria. Además, a la hora de programar la prueba se ha tenido que diseñar una estructura que resida en memoria que lleve actualizado en tiempo real la relación entre usuarios – canales de tal manera que las consultas del estado de la red nos devuelvan resultados con coste constante, como por ejemplo en qué canales está ubicado un nick concreto. Figura 13 Diseño datos en memoria Cabe decir que este diseño puede ser diferente para cada implementación pero se presenta como base para poder ser utilizado. 37 Proyecto fin de carrera Rubén Lozano Díaz Paquete DAO En este paquete se llevaran a cabo todas las transacciones con la base de datos. El proyecto cuando necesita acceder a la base de datos para cualquier cosa, tiene que pasar por los DAO, de otra manera no podrá conectarse a la base de datos. En la clase BaseDAO tenemos los métodos básicos que todos los demás DAO también tienen por herencia, no obstante es posible crear métodos específicos a los DAO dependiendo de necesidades especiales como consultas especiales, o procesos batch necesarios. Figura 14 Codigo del metodo "isAutorized" 38 Proyecto fin de carrera Rubén Lozano Díaz Como método especial tenemos “isAutorized” en BotDAO. A este método se le llama desde el núcleo del package xmlrpc como veremos más adelante y devuelve un valor booleano que indica si el servicio está autorizado o no. Este método primero se encarga de comprobar que el usuario y contraseña coincide con la almacenada en la base de datos que gracias a hibernate se nos presenta como un conjunto de métodos encadenados que nos devuelven un resultado. Inmediatamente después comprobará que este servicio que se ha conectado, tiene permisos para hacer lo que quiere hacer. En caso de que el servicio no pueda ejecutarlo, devolverá un mensaje de error, por el contrario devolverá lo que la rutina deba devolver. Podemos observar en la segunda mitad del código de este método la forma de registrar observers, se hace así porque se necesita la información de conexión para devolver los datos a los que se han registrado. 39 Proyecto fin de carrera Rubén Lozano Díaz Paquete Net En este paquete tenemos todo lo relacionado con las redes IRC. Tenemos como pilar fundamental la clase abstracta VirtualNode. Ésta clase nos proporciona una arquitectura para el intercambio de mensajes entre servidores/clientes o servidores/servidores en redes IRC siendo esta parte, y la parte de los objetos en memoria en tiempo real las partes más importantes en el tratamiento de información. Figura 15 Declaración métodos abstractos de la arquitectura que presenta VirtualNode 40 Proyecto fin de carrera Rubén Lozano Díaz Para poder implementar un protocolo de red IRC solo tendremos que hacer que nuestra clase herede de VirtualNode. Nuestra clase solo tendrá que conectar al dominio/ip deseado mediante el método “connect” y a partir de aquí en el método “handleLine” recibiremos las líneas de texto que va recibiendo nuestro servidor por parte de clientes/servidores de IRC, así que tendremos que parsear el texto para convertirlo en los comandos que queramos y usemos los tokens disponibles notificando a los observers que estén registrados. Toda la capa baja de envío/recepción de datos ya está cubierta por la arquitectura de VirtualNode y nosotros solo tenemos que ocuparnos de la capa alta del parseado de texto. Estos notify se verán sujetos al método “sendStrings” de la interfície NetListener que se verá implementada dentro del paquete xmlrpc por la clase BotClient. 41 Proyecto fin de carrera Rubén Lozano Díaz Paquete XMLRPC Este paquete es el que proporcionará el nombre de “servidor” a nuestra estructura ya que la clase principal FwkServerServices será la que se encargue de lanzar el servidor que escuchará las peticiones que le sean enviadas a través de un puerto dado. Esta clase también se encarga de mapear los métodos que pueden ser ejecutados (previa validación) por los servicios. Según se vayan ampliando los servicios se añadirán en “getMappings” las rutinas nuevas que se quieran añadir. Figura 16 Método que inserta mapeos de rutinas Si nos fijamos podemos observar que realmente la conexión con un servidor IRC no es más que un modulo añadido en “getMappings” en la primera línea. Un servicio debe ser el que le diga al servidor a qué red de IRC conectarse a través de un HUB. Además la base de datos es otro modulo más y de la misma 42 Proyecto fin de carrera Rubén Lozano Díaz manera que hemos añadido estos módulos se podrían añadir infinidad de módulos que completaran los servicios que pueda ofrecer esta estructura. La parte que se ha tenido que cambiar, no ha sido un cambio muy grande, ni han sido muchas líneas de código, lo complejo de este cambio ha sido buscar qué modificar para no comprometer la funcionalidad del modulo, sin excesivas líneas de código. Figura 17 Modificaciones en modulo xmlrpc Solo se ha cambiado la cabecera del método mostrado en la figura anterior y la condición donde se evalúa si el servicio está autorizado. Se ha escogido este punto porque la clase que llama al método “execute” reúne las condiciones y los datos necesarios para la finalidad y funcionalidad de esta estructura, poder reunir en un mismo sitio usuario, contraseña, nombre de rutina, parámetros de llamada a la rutina, dirección de red y puerto. El usuario y la contraseña son vitales para una validación así como la dirección de red por tal de diferenciar 43 Proyecto fin de carrera Rubén Lozano Díaz entre servicios que están a la escucha de comandos para poder lanzar la conexión en sentido contrario usando el puerto que también se pasa en la cabecera y el nombre y los parámetros. El registro de escucha de parámetros se hace así porque por las vías normales no se puede obtener la dirección de red del cliente, por lo que no podríamos lanzar la conexión saliente. La parte del registro de eventos por parte de servicios se realiza en este paquete. Parece raro porque el objeto observers figura en el paquete “Net” no obstante quien puede obtener las direcciones de red es el paquete “xmlrpc” y siendo éste el módulo principal y los módulos de IRC y base de datos módulos secundarios, no es extraño ver que se procede de esta manera. 44 Proyecto fin de carrera Rubén Lozano Díaz Figura 18 Lanzamiento de eventos a servicios Especial mención al método de la figura superior, “client” es un objeto del mismo tipo que crean los servicios para conectarse con nuestro servidor. Ejecutamos una llamada asíncrona para no bloquear el modulo servidor de llamadas de la red IRC. Llamaremos al servicio que nos pidió el registro al evento que estamos lanzando a la dirección que obtuvimos en la conexión, a través del puerto especificado 45 Proyecto fin de carrera Rubén Lozano Díaz 5. Desarrollo 5.1 Croquis temporal Éste es el croquis temporal programado inicialmente para el proyecto. Cabe decir que se ha cumplido bastante bien, quitando un poco de tiempo a la implementación de las operaciones de IRC y añadiéndole tiempo a las operaciones de XML-RPC por la dificultad añadida de haber tenido que modificar el núcleo del paquete que estábamos utilizando para la capa de red de XML-RPC. Semanas Diseño BD Creacion BD Modelo de datos Hibernate Diseño operaciones server IRC Diseño estructura datos IRC Implementación operaciones IRC Diseño operaciones XML-RPC Implementación metodos XML-RPC Diseño Bots ejemplo Implementacion Bots Ejemplo TestCases y resolucion errores 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Figura 19 Croquis temporal 46 Proyecto fin de carrera Rubén Lozano Díaz 5.2 Servicios de ejemplo Se han programado 3 tipos de servicios para los ejemplos: • Servicio de monitorización visual: Este es un servicio que está a la escucha de todos los usuarios de la red IRC y de los canales donde están ubicados. La gracia está en que un servicio conectado directamente a la red no puede ver la actividad de cada usuario en cada canal, pero a través de nuestro servicio sí. • Servicio de administración de Nicks: Servicio que estará conectado al servidor de IRC y al servidor de servicios simultáneamente de tal manera que los usuarios de IRC podrán pedirle acciones concretas que el servicio solo podrá ejecutar a partir del servidor de servicios. • Servicio de monitorización en lenguaje C: Servicio programado en C para demostrar la compatibilidad con otros lenguajes a parte de Java que irá mostrando por pantalla todas las acciones que el servidor realiza. 47 Proyecto fin de carrera Rubén Lozano Díaz 6. Herramientas • Hibernate Reverse Engineering Tools Herramienta integrada dentro del paquete Hibernate Tools, que permite la generación de archivos de configuración, Beans, Mappings y todos los archivos necesarios para poder centrarse en el uso de Hibernate en vez de centrarse en la configuración a partir de una base de datos. Esto nos ahorra el trabajo de varios días, incluso semanas, y nos proporciona unas clases y unos archivos de mapeo y configuración estables, compactos y consolidados con el entorno que estamos trabajando. Más información: https://www.hibernate.org/255.html • Log 4 Java Log4j es una biblioteca open source desarrollada en Java por la Apache Software Foundation que permite a los desarrolladores de software elegir la salida y el nivel de granularidad de los mensajes o “logs” a tiempo de ejecución y no a tiempo de compilación como es comúnmente realizado. La configuración de salida y granularidad de los mensajes es realizada a tiempo de ejecución mediante el uso de archivos de configuración externos. Log4J ha sido implementado en otros lenguajes como: C, C++, C#, Perl, Python, Ruby y Eiffel. Más información: http://logging.apache.org/log4j/1.2/index.html 48 Proyecto fin de carrera • Rubén Lozano Díaz JUnit JUnit es un conjunto de bibliotecas creadas por Erich Gamma y Kent Beck que son utilizadas en programación para hacer pruebas unitarias de aplicaciones Java. JUnit es un conjunto de clases (framework) que permite realizar la ejecución de clases Java de manera controlada, para poder evaluar si el funcionamiento de cada uno de los métodos de la clase se comporta como se espera. Es decir, en función de algún valor de entrada se evalúa el valor de retorno esperado; si la clase cumple con la especificación, entonces JUnit devolverá que el método de la clase pasó exitosamente la prueba; en caso de que el valor esperado sea diferente al que regresó el método durante la ejecución, JUnit devolverá un fallo en el método correspondiente. JUnit es también un medio de controlar las pruebas de regresión, necesarias cuando una parte del código ha sido modificado y se desea ver que el nuevo código cumple con los requerimientos anteriores y que no se ha alterado su funcionalidad después de la nueva modificación. El propio framework incluye formas de ver los resultados (runners) que pueden ser en modo texto, gráfico (AWT o Swing) o como tarea en Ant. En la actualidad las herramientas de desarrollo como NetBeans y Eclipse cuentan con plug-ins que permiten que la generación de las plantillas necesarias para la creación de las pruebas de una clase Java se realice de manera automática, facilitando al programador enfocarse en la prueba y el resultado esperado, y dejando a la herramienta la creación de las clases que permiten coordinar las pruebas. Más información: http://www.junit.org/ 49 Proyecto fin de carrera • Rubén Lozano Díaz WSXML-RPC implementación de Apache XML-RPC es un protocolo de llamada a procedimiento remoto que usa XML para codificar los datos y HTTP como protocolo de transmisión de mensajes. Es un protocolo muy simple ya que sólo define unos cuantos tipos de datos y comandos útiles, además de una descripción completa de corta extensión. La simplicidad del XML-RPC está en contraste con la mayoría de protocolos RPC que tiene una documentación extensa y requiere considerable soporte de software para su uso. Más información: http://ws.apache.org/xmlrpc/ • Oracle DB Express edition 10g Versión gratuita de la plataforma de base de datos que hemos visto en el apartado 1.2.1 en base a OracleDB 10g release 2 compatible con 11g. Más información: http://www.oracle.com/technology/products/database/xe/index.html • SQL Developer Oracle SQL Developer es una herramienta grafica para el desarrollo de bases de datos gratuita y con soporte total por parte de Oracle. Con SQL Developer, se puede navegar entre los objetos de la base de datos, ejecutar sentencias y scripts de SQL y editar y debujar sentencias PL/SQL. Más información: http://www.oracle.com/technology/products/database/sql_developer/index.html 50 Proyecto fin de carrera • Rubén Lozano Díaz Servidor IRC Hispano P10 Implementación del protocolo de IRC P10 de Undernet . Más información: http://ircuhispano.wordpress.com/ • Cliente IRC mIRC mIRC el cliente IRC más extendido para plataformas Microsoft Windows. Su autor es Khaled Mardam-Bey, es software con licencia shareware y su periodo de evaluación es de 30 días (la última versión es de 45 días). Pasado el periodo de evaluación para poder seguir utilizando el programa hay que pagar una licencia de $20 USD válida para cualquier nueva versión de mIRC. Si no se paga la licencia el programa en realidad no se inhabilita, simplemente hay que esperar un corto tiempo cada vez que se ejecuta para poder utilizarlo. Más información: http://www.mirces.com/ • Jibble PircBot PircBot es un framework de java para escribir bots de IRC de una forma rápida y sencilla. Incluye una arquitectura dirigida a eventos para manejar los propios eventos de IRC, protección de Flood, soporte para continuar DCC, soporte ident y mucho más. El formato comprensible del archivo de logs es perfecto para usarlo con PISG para generar estadísticas de canal. La documentación entera está incluida y su página contiene una guía paso por paso para hacer tu primero IRC bot. Se conoce que el framework lo usan tanto la marina como la fuerza aerea de Estados Unidos así como la CIA (sin confirmar) y varias agencias de seguridad nacional. También se sabe que el cliente de bittorrent Azureus también lo usa. Más información: http://www.jibble.org/pircbot.php 51 Proyecto fin de carrera • Rubén Lozano Díaz Eclipse Ganymede En su versión 3.4 Eclipse es denominado Eclipse Ganymede. Es un entorno de desarrollo integrado de código abierto multiplataforma para desarrollar lo que el proyecto llama "Aplicaciones de Cliente Enriquecido", opuesto a las aplicaciones "Cliente-liviano" basadas en navegadores. Esta plataforma, típicamente ha sido usada para desarrollar entornos de desarrollo integrados (del inglés IDE), como el IDE de Java llamado Java Development Toolkit (JDT) y el compilador (ECJ) que se entrega como parte de Eclipse (y que son usados también para desarrollar el mismo Eclipse). Sin embargo, también se puede usar para otros tipos de aplicaciones cliente, como BitTorrent Azureus. Eclipse fue desarrollado originalmente por IBM como el sucesor de su familia de herramientas para VisualAge. Eclipse es ahora desarrollado por la Fundación Eclipse, una organización independiente sin ánimo de lucro que fomenta una comunidad de código abierto y un conjunto de productos complementarios, capacidades y servicios. Más información: http://www.eclipse.org/ 52 Proyecto fin de carrera • Rubén Lozano Díaz Subversion Subversion es un software de sistema de control de versiones diseñado específicamente para reemplazar al popular CVS, el cual posee varias deficiencias. Es software libre bajo una licencia de tipo Apache/BSD y se le conoce también como svn por ser ese el nombre de la herramienta de línea de comandos. Una característica importante de Subversion es que, a diferencia de CVS, los archivos versionados no tienen cada uno un número de revisión independiente. En cambio, todo el repositorio tiene un único número de versión que identifica un estado común de todos los archivos del repositorio en cierto punto del tiempo. Más información: http://subversion.tigris.org/ • SubClipse SubClipse es un plugin que usa el software Subversion para integrar todo el sistema de control de versiones en el entorno de desarrollo Eclipse haciendo más compacto e intuitivo el uso de esta herramienta Más información: http://subclipse.tigris.org/ 53 Proyecto fin de carrera • Rubén Lozano Díaz JDK Java SE 6 La plataforma Java es el nombre de un entorno o plataforma de computación originaria de Sun Microsystems, capaz de ejecutar aplicaciones desarrolladas usando el Lenguaje de programación Java u otros lenguajes que compilen a bytecode y un conjunto de herramientas de desarrollo. En este caso, la plataforma no es un hardware específico o un sistema operativo, sino más bien una máquina virtual encargada de la ejecución de aplicaciones, y un conjunto de librerías estándar que ofrecen funcionalidad común. La plataforma es así llamada la Plataforma Java (antes conocida como Plataforma Java 2), e incluye: • Plataforma Java, Edición Estándar (Java Platform, Standard Edition), o Java SE (antes J2SE) • Plataforma Java, Edición Empresa (Java Platform, Enterprise Edition), o Java EE (antes J2EE) • Plataforma Java, Edición Micro (Java Platform, Micro Edition), o Java ME (antes J2ME) Desde 2006, la versión actual de la Plataforma Java Standard Edition se le conoce como Java SE 6 como versión externa, y 1.6 como versión interna. Sin embargo, se prefiere el término versión 6. Una visión general de la multitud de tecnologías que componen la Plataforma Java puede encontrarse en la página de documentación del JDK. JDK(Java Development Kit) se diferencia del JRE(Java Runtime Environment) en la cantidad de paquetes extra que se le proporcionan al desarrollador para facilitarle el trabajo. Más información: http://java.sun.com/javase/6/docs/ 54 Proyecto fin de carrera Rubén Lozano Díaz 7. Software Libre 7.1 Introducción al software libre Software libre (en inglés free software) es la denominación del software que brinda libertad a los usuarios sobre su producto adquirido y por tanto, una vez obtenido, puede ser usado, copiado, estudiado, modificado y redistribuido libremente. Según la Free Software Foundation, el software libre se refiere a la libertad de los usuarios para ejecutar, copiar, distribuir, estudiar, cambiar y mejorar el software; de modo más preciso, se refiere a cuatro libertades de los usuarios del software: la libertad de usar el programa, con cualquier propósito; de estudiar el funcionamiento del programa, y adaptarlo a las necesidades; de distribuir copias, con lo que puede ayudar a otros; de mejorar el programa y hacer públicas las mejoras, de modo que toda la comunidad se beneficie (para la segunda y última libertad mencionadas, el acceso al código fuente es un requisito previo). El software libre suele estar disponible gratuitamente, o al precio de coste de la distribución a través de otros medios; sin embargo no es obligatorio que sea así, por ende no hay que asociar software libre a "software gratuito" (denominado usualmente freeware), ya que, conservando su carácter de libre, puede ser distribuido comercialmente ("software comercial"). Análogamente, el "software gratis" o "gratuito" incluye en algunas ocasiones el código fuente; no obstante, este tipo de software no es libre en el mismo sentido que el software libre, a menos que se garanticen los derechos de modificación y redistribución de dichas versiones modificadas del programa. Tampoco debe confundirse software libre con "software de dominio público". Éste último es aquél que no requiere de licencia, pues sus derechos de explotación son para toda la humanidad, porque pertenece a todos por igual. Cualquiera puede hacer uso de él, siempre con fines legales y consignando su autoría original. Este software sería aquél cuyo autor lo dona a la humanidad o cuyos derechos de autor han expirado, tras un plazo contado desde la muerte 55 Proyecto fin de carrera Rubén Lozano Díaz de éste, habitualmente 70 años. Si un autor condiciona su uso bajo una licencia, por muy débil que sea, ya no es dominio público. 7.2 Importancia del software libre en este proyecto De todas las herramientas usadas en este proyecto, las únicas que son software privativo son los productos de Oracle, que aunque gratuitos, no son libres. De hecho, es posible la descarga del código fuente de todas las otras herramientas. El software libre ha entrado en escena en varios momentos de los cuales la parte mas usual ha sido la libertad de uso sin restricciones de todas las herramientas. No obstante debemos prestar atención a dos usos extraordinarios de las herramientas Jibble PircBot y WSXML-RPC: • Jibble PircBot: Esta herramienta se ha usado para programar los Bots de ejemplo y para testear el Framework. La parte extraordinaria ha sido al usar esta herramienta indirectamente; la arquitectura orientada a eventos de PircBot es extremadamente útil y versátil a la hora de lanzar operaciones. Los eventos de servidor son fundamentalmente lo mismo que los eventos de usuario que usa PircBot por lo que hemos usado la misma arquitectura que esta herramienta. También nos ha facilitado la implementación de la estructura de mensajes remotos de observación. • WSXML-RPC: El uso ordinario de esta herramienta nos era insuficiente. Esta herramienta puede ejecutar métodos en maquinas remotas con validaciones de usuario. A nosotros no nos ha bastado con ello porque para lanzar conexiones de envío de datos de observación sobre el cliente que lo ha solicitado, necesitábamos conocer la dirección de red del cliente y esta implementación no nos proporcionaba este servicio. Se ha tenido que reescribir el núcleo de esta herramienta de tal manera que para la petición de ejecución de un método validado por un usuario y contraseña, se pudiera conocer la dirección de red que estaba solicitando este servicio. 56 Proyecto fin de carrera Rubén Lozano Díaz 8. Conclusiones Actualmente la arquitectura de comunicación con IRC está acabada, así como la estructura de mensajería remota. Se ha implementado mediante la arquitectura de comunicación con IRC el protocolo P10 para servidores IRCHispano por lo que las pruebas se realizarán con este tipo de servidor. En el futuro este Framework puede ser mejorado de muchísimas maneras; añadiendo más modularidad, aumentando la seguridad del cifrado de las contraseñas, el cifrado del transporte de datos, optimizando aun más la arquitectura básica, convirtiendo el proyecto en un servidor de servicios distribuido… etc. Hay muchas posibilidades y aquí se ha hecho la base y unos ejemplos pequeños que demuestran la funcionalidad y potencia que puede llegar a desarrollar este proyecto. En cuanto a nivel personal, he elegido esta idea para complementar mis estudios. Al ser un estudiante de informática de gestión apenas he tocado redes, ni protocolos de red, ni transporte de datos y esta ha sido una manera más que satisfactoria para introducirme en este fascinante mundo además de todo lo expresado en las motivaciones. También me ha dado la oportunidad de modificar y introducirme de lleno en el código de proyectos de código abierto, he aprendido muchísimo y estas son las cosas que aunque te expliquen en clase o de forma teórica, hasta que no te peleas con ellas las aprendes pero no las asimilas. 57 Proyecto fin de carrera Rubén Lozano Díaz 9. Bibliografía Información general: http://es.wikipedia.org Historia IRC: http://sindominio.net/quique/Traducciones/historia_irc.html Oracle: http://www.oracle.com Hibernate: http://www.hibernate.org 58