[IRC-DEV] OlimpoDistributedAPI: primeras pruebas

Jesus Cea Avion jcea at argo.es
Fri Sep 13 18:24:06 CEST 2002


Estoy ultimando la librería "olimpodapi". De hecho ya se pueden escribir
clientes arbitrariamente complejos, gestionar la conexión por parte de
los mismos y controlar automáticamente cosas como los "ping timeout",
conexiones, cortes de conexión, etc.

La librería define una serie de baterias de test y ejemplos, con el
objetivo de que sirvan como base para los módulos que hagais.

Por ejemplo, un módulo muy básico con el que estoy haciendo pruebas es
trivial, en Python:

>>>>>

class DemoClientOlimpoDistributedAPI(ClientOlimpoDistributedAPI) :
      def m_privmsg(self,comando) :
        assert(len(comando)==3)
        return ["PRIVMSG %s :Hola, usuario. Me has escrito '%s'. Tu
identificador de sesion conmigo es '%s'" %(comando[1],comando[2]
,comando[1]),"CSESSION closed %s " %comando[1]]

<<<<<

Esta clase "hereda" de "ClientOlimpoDistributedAPI", lo que supone que
ya se están gestionando apropiadamente los comandos "BYE", "PING" y
"CHALLENGE", de forma transparente. En la clase nueva definimos la
función "m_privmsg", que será la que se ejecute cuando llegue un comando
"privmsg" al bot.

También he definido una clase "ConexionCliente", que acepta como
parámetros para su constructor, un socket y una clase de bot. Dicha
clase gestiona el socket y lo comunica con la clase bot. También
controla automaticamente cosas como los "ping timeout". Es decir, si no
hay actividad en la conexión durante X segundos, el cliente envia un
"PING". Si sigue sin haber actividad durante otros X segundos (debería
haber un "PONG"), corta la conexión y levanta una excepción.

Veamos algunas pruebas.

Lo primero es pasar la batería de tests automáticas, para poder
comprobar que no haya ningún error garrafal:

>>>>>
# python olimpodapi.py

*** Comprobando 'OlimpoDistributedAPI':
Cierre del canal de entrada ... ok
Fragmentacion de lineas en entrada ... ok
Gestion de un comando desconocido ... ok
PING ... ok
'Bye' ... ok

*** Comprobando 'ClientOlimpoDistributedAPI':
Cierre del canal de entrada ... ok
Fragmentacion de lineas en entrada ... ok
Gestion de un comando desconocido ... ok
PING ... ok
'Challenge' con mecanismos desconocidos ... ok
'Challenge' con MD5 ... ok
'Challenge' con SHA-1 ... ok
'Bye' ... ok

*** Comprobando 'ServerOlimpoDistributedAPI':
Cierre del canal de entrada ... ok
Fragmentacion de lineas en entrada ... ok
Gestion de un comando desconocido ... ok
PING ... ok
'Challenge-Result' con mecanismos desconocidos ... ok
'Challenge-Result' con resultado incorrecto ... ok
'Challenge-Result' con MD5 ... ok
'Challenge-Result' con SHA-1 ... ok
'Version' ... ok
'Bye' ... ok

*** Comprobando 'BothOlimpoDistributedAPI':
Comunicacion mutua Cliente<->Servidor ... >>> CHALLENGE HMAC-SHA1
HMAC-MD5 :abc9f3c3dc80ee889ed610981c0d6edef45ceacc
<<< CHALLENGE-RESULT HMAC-SHA1 0 ElNick
:e11ee9ed3021dd6b5c1acc2618e80dce4671ba39
<<*<< version 123
>>> VERSION 1
<<*<< completo
>>*>> completo
ok

----------------------------------------------------------------------
Ran 24 tests in 0.439s

OK
#
<<<<<

Parece que hasta aquí todo va bien.

Para hacer las pruebas de conexión, uso la utilidad "nc". Esta utilidad
permite, entre otras cosas, abrir un socket en recepción y esperar una
conexión en él. Es decir, permite simular un servidor.

En primer lugar, en una consola, abro un socket en recepción, para
simular un servidor "a mano":

nc -l -p 6776

En segundo lugar, en otra consola, lanzo el python y escribo los
siguientes comandos:

>>> import olimpodapi
>>> a=olimpodapi.DemoConnectionClientOlimpoDistributedAPI()

Ahora ya nos hemos conectado. En la consola del "nc" escribo un "reto":

CHALLENGE HMAC-MD5 :prueba_de_reto

En la consola Python forzamos una iteración del socket:

>>> a.procesa(10)

El número es el tiempo de "timeout" hasta que "olimpodapi" nos devuelva
el control. En este caso, procesamos comandos de forma continua hasta
que pasen 10 segundos. Cuando pasan esos 10 segundos y nos devuelve el
control, volvemos a ejecutar el comando para procesar otros 10 segundos,
hasta que el bot termine, porqu elo cortemos, porque falle o porque se
cierre el enlace.

Ahora en la consola del "nc" vemos la respuesta del bot:

CHALLENGE-RESULT HMAC-MD5 0 MiNick :69be42cf3128e8fb87fa5e0135f65860

Perfecto. Veamos ahora qué pasa si hacemos un ping al bot:

ping :hola

El bot nos responde inmediatamente con:

PONG :hola

Mandemos ahora al bot un comando

privmsg 000000 :?hay alguien ahi???

Y el bot nos responde con:

PRIVMSG 000000 :Hola, usuario. Me has escrito '?hay alguien ahi???'. Tu
identificador de sesion conmigo es '000000'
CSESSION closed 000000 

Estupendo.

Veamos ahora si dejamos un rato la conexión sin actividad. Al cabo de
unos segundos, el bot nos manda:

PING :timeout

Si no respondemos con un "PONG", al cabo de unos segundos el bot nos
desconectará. En este caso respondemos, para poder hacer más pruebas...

pong :timeout

Por último, el servidor quiere desconectar al cliente, y le envía un
"BYE".

BYE :Por feo!!

Y en la consola de python se levanta una excepción:

>>> a.procesa(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "olimpodapi.py", line 44, in procesa
    raise self.olimpodapi.bye
BYE Por feo!!
>>> 

Si en vez de salir con un "BYE", el servidor simplemente cierra la
conexión "a saco", la excepción es:

>>> a.procesa(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "olimpodapi.py", line 39, in procesa
    raise "Conexion Cerrada"
Conexion Cerrada
>>>

Si el problema es que no podemos conseguir conectar con el servidor:

>>> a=olimpodapi.DemoConnectionClientOlimpoDistributedAPI()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "olimpodapi.py", line 437, in __init__
    if st not in (EINPROGRESS, EALREADY, EWOULDBLOCK): raise "Error al
intentar conectar"
Error al intentar conectar

Si lo que ocurre es un "ping timeout", aparece como:

>>> a.procesa(10)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "olimpodapi.py", line 53, in procesa
    raise "PING timeout"
PING timeout
>>>

En la librería cliente falta definir mejor todo el tema de excepciones.
Es decir, que en vez de levantar excepciones con cadenas, usar objetos
para poder clasificarlos, etc. Espero tenerlo listo para la semana
próxima.

En principio, esta librería será GPL.

La parte compleja es la de servidor, ya que tiene que interactuar con
Olimpo y el resto de la red, tendrá que ser multitarea, manejar bases de
datos de bots, controlables por los OPER de la red y, sobre todo,
gestionar un centenar de bots de forma simultanea...
 
-- 
Jesus Cea Avion                         _/_/      _/_/_/        _/_/_/
jcea at argo.es http://www.argo.es/~jcea/ _/_/    _/_/  _/_/    _/_/  _/_/
                                      _/_/    _/_/          _/_/_/_/_/
PGP Key Available at KeyServ   _/_/  _/_/    _/_/          _/_/  _/_/
"Things are not so easy"      _/_/  _/_/    _/_/  _/_/    _/_/  _/_/
"My name is Dump, Core Dump"   _/_/_/        _/_/_/      _/_/  _/_/
"El amor es poner tu felicidad en la felicidad de otro" - Leibniz




More information about the IRC-Dev mailing list