h1

[pBot] Historia / Mecanismo anti-flood

8 \08UTC marzo \08UTC 2007

Llevo bastante tiempo trabajando en un robot de IRC, pBot. No sé con exactitud cuánto, pero la entrada más vieja que leo en el ChangeLog es del dos de julio de 2005. Los que ya sepáis de que va este robot os podéis comer el cacho que viene a continuación.

A modo de anécdota: El nombre de pBot ya me vino dado antes de comenzar a programarlo, y tuve que esperar un par de meses a que me lo aclarasen: Puto Bot.

Surgió un día por que un individuo que conocí en el IRC, un tal m|RC, me animó a programar un robot para nosequé cosa de uptime. No fue de mis primeras experiencias con robots de este tipo ni mucho menos. Desarrollé Chocobot cuando debía tener 14 años (un robot en Visual Basic que enviaba chistes a una amiga, insultos a otra persona que no voy a mencionar además de generar spam), luego desarrollé Zero00 (otro robot más de spam en VB) y ZIB (otro más, pero éste hacía spam en forma de invites, estaba en C y funcionaba sobre Linux). Vale, no es un pasado muy fiable, pero de aquella no tenía más intereses que los propios de un adolescente de mi edad.

El desarrollo inicial de pBot fue muy rápido debido a que carlos- (otro individuo que se apuntó al proyecto) me hizo una bonita interfaz de configuración en ncurses y a que gracias a los robots anteriores tenía muchas funciones preparadas. Apenas tuve que almacenarlas todas en lo que denominé pCore: El corazón del pBot. Luego, sólo tenía que compilar la interfaz de configuración junto con el propio robot y fuera.

Los primeros intentos fueron un éxito, pero todavía era muy básico. De todas maneras, su diseño inicial era muy flexible: Los nicks en el canal eran manejados a traves de listas enlazadas, y los comandos del IRC pueden ser capturados por unos manejadores denominados SLOTs (ranuras). Esta cosa tan simple me abría las puertas a muchas cosas.

Este robot tenía que ser diferente a los demás, tenía que ser un proyecto serio. Y por primera vez contemplé la posibilidad de analizar los colores de mIRC: Me costó lo suyo, pero después de muchos errores y violaciones de segmento conseguí algo medianamente estable que fui mejorando con el tiempo. Creé la función mirc_colors dedicada a este menester dentro del módulo mirc_colors.ppo, que acabaría siendo estándar de facto a muchísimas funciones del robot, así que acabé generalizando las funciones de estado y trasladé esta función al pCore.

Casi un mes después ya había un montón de plug-ins, y acabé liberando pbot 0.2. Las funcionalidades se multiplicaban, y las necesidades de analizar el tráfico procedente del servidor me hicieron añadir mecanismos para el registro. Paralelamente, se crearon funciones anti-spam, un plugin para mostrar la canción en curso de XMMS, más bugfixies, más comandos del servidor manejados, más limpiezas…

Entonces llego a #Ayuda-Informaticos. El robot comienza a ponerse serio. Las necesidades de los usuarios me llevan a programar un plugin de FAQ (donde me encuentro con el problema del excess-flood). Me dan privilegios con el rollo este del Docking Station, aparecen nuevos problemas y nuevas soluciones. Vamos ya por pbot 0.4

Y ahora la atención se centra de nuevo en el pCore. Era necesario flexibilizar más y más la interfaz interna, hacer el robot mucho más controlable desde fuera y mucho más útil, y así se crea la tubería de control remoto (un fifo en ~/.pbot por el cual se envían comandos al servidor desde fuera). También se añade la posibilidad de estar en varios canales, cosa que se ampliaría al soporte multicanal. Se crean más funciones propias como pfork() (wrapper de fork()), se crea una interfaz con la que usar comandos desde el IRC de una manera más coherente (los módulos ya no tienen por qué capturar el slot de PRIVMSG y analizar el texto, con registrar el comando basta), se crea la capacidad de controlar al bot como si éste fuese un bouncer (usando un cliente que se conectase a él, y hablando desde él directamente), se crea un sistema de scripting tipo BASIC… todo esto amparado en un mecanismo para intercomunicar procesos mediante colas de mensajes.

La creación del “Chat en línea” (inline chatting) hace que el robot se pueda controlar desde él mismo. Tuve que echar mano de un truco por el cual se podían sustituir stdout y stderr por otros punteros. El proyecto comienza a crecer en tamaño y en utilidades… pero me quedo sólo: carlos- se había dedicado de pleno a la web y yo estaba muy vago para redactar una ayuda de desarrollo de cara al programador de módulos.

pBot seguirá creciendo y creciendo con la innovación del nick completion (completado de nick), las teclas de función (capacidad de asignar a F1-F12 diversos comandos de IRC) y la descarga automática de módulos fallidos. Entonces entro en una etapa triste de mi vida, tanto emocional como informática: Acabaría diseñando un lenguaje de programación que pretendía acoplar a pBot para sustituir el viejo sistema de scripting, llamado Yail. Al principio conseguiría muchas cosas, pero al ver que los problemas de inestabilidad y corrupción de la memoria no se podían arreglar, retomé pBot casi un año más tarde.

Y aquí es cuando entra la nueva temporada de pBot, con la intención de pulirse y pulirse hasta volverse una alternativa factible para el administrador de canales. Para que nos hagamos una idea de las reformas que llevé a cabo aquel noviembre de 2006, recurriré al ChangeLog:

2006-11-21 Gonzalo Carracedo
* Después de este período de oscurantismo ocupado por un proyecto sin futuro, retomo pBot, arreglando los siguientes fallos y añadiendo las siguientes características:
– Arreglado un bug relacionado con el subsistema de comandos estándar, por el cual no se terminaban las cadenas.
– Eliminado el pBasic por estar mal programado y dar más problemas de los que solucionaba
– Mejorado la BBDD de quotes, haciéndola binaria y por ende más rápida
– Añadido el comando !mp3 al plugin de XMMS
– Añadidos comandos como !conf y otros de administración de plugins
– Añadido !exec
– Añadido un soporte anti-flood experimental que hay que mejorar
– Arreglados unos cuantos fallos de presentación. IRC_COLORS con IRC_BOLD no funciona. Estoy pensando en eliminar estas macros.
– Añadido plugin chandetect, para detectar si un usuario entrante está en algún canal conflictivo
– Añadida la posibilidad de descargar módulos desde el IRC
– Añadida la posibilidad de que el robot actúe en varios canales (SwapCoreInfoChannel)
– Añadido un directorio en estas fuentes con una configuración básica, para evitar usar el pconfig.sh

Sencillamente, pBot ya distaba mucho de lo que intentaba ser en un principio. Ahora interesaba que el robot fuese cada vez más “homogéneo”, por decirlo de alguna manera, a la hora de usarlo por los demás. Las interfaces se generalizan más y más, se reorganiza el arranque, se rediseñan plugins (como el de RSS), se agilizan los alias, se reimplementa el pBasic (ahora ya no da tanto asco), se generalizan los permisos de los comandos (ya no hay que andar comprobando quién llama al comando en cuestión), se crea un plugin de control de Amarok, se reorganiza aquel intento fracasado de imitar al MacAdmin: P-Admin ahora ya no da tanta pena…

Hasta hoy, que ya tengo liberada la versión 0.70. Hoy me siento orgulloso de anunciar una cosa que tanto intenté hacer y que gracias a la ayuda indirecta de un francés (lol) pude llevar a cabo:

EL MECANISMO ANTI-FLOOD: La cola de comandos supervisada

Para desarrollar este mecanismo, he partido de un documento de un francés llamado Hugo Haas. En realidad no lo he implementado tal y como él lo expone, pero por ahí van los tiros:

Partimos de que no todos los comandos le “cuestan lo mismo” al servidor. Así definimos unos “precios” y unas “penalizaciones”. Por ejemplo, WHO cuesta tres puntos más que otro comando cualquiera, KICK dos puntos más, etc, etc…

Entonces estos comandos se van añadiendo a la cola con su precio. Cuando se envían, se incrementa un contador interno en función del precio del comando enviado. A su vez, este precio es decrementado en uno cada segundo que pasa.

Si mientras se envía la cola al servidor se supera el llamado”precio máximo” (que según las recomendaciones de Hugo he establecido a 10), entonces se deja de enviar dicha cola y se espera a que el contador tome valores inferiores a diez. Así llas grandes cantidades de datos enviadas ralentizarán al robot, pero al menos nunca llegarán a tumbarlo.

¿Y que pasa si la cola está llena de comandos y hay un PONG pendiente?

No hay problema: PONG y QUIT son comandos inmediatos, que se envían al servidor sin pasar por la cola. Un mecanismo que puede parecer peligroso, pero ayuda a mantener al robot despierto y reduce las posibilidades de fallo.

Voy a intentar pulir al robot mucho más, y aunque ahora no tengo ganas de subir ficheros a ninguna parte, ya os iré comentando a los interesados dónde bajarlo a medida que libere nuevas versiones del mismo.

Saludos

4 comentarios

  1. Yo me sé de uno que va a ser un tester efusivo del pBot en la XGN.


  2. Lo siento, no sé muy bien dónde meter mi comentario, osea que aquí va:

    “La razón necesita de la imaginación y de las ilusiones que ella misma destruye; lo verdadero de lo falso”. Es una cita de un poeta llamado Leopardi recogida por Vattimo. Y continúa éste último: “..esto sería la exposición de una complementariedad profunda que se enraíza en la necesidad para el intelecto de hacer sensibles los conceptos en la intuición”. Ésa es una forma de razón. Hay otra, que no excluye a ésta, a la que le tengo afecto: la “ciudadela” de Marco Aurelio, libre, orgullosa de sí y humilde al mismo tiempo, una especie de consuelo ante lo irremediable y el devenir.
    Otra cosa sobre la razón: No perder de vista los monstruos que puede engendrar. Goya, Marx, Freud, Nietzsche de una forma u otra lo vieron. También los poetas malditos, ( y no me refiero a esas modas que imitan a imitadores, sino a los auténticos, Blake, Bataille, Lautreamont, Rimbaud..), y el arte de principios del XX. Y lo más triste y feo sobre la razón: cuando ésta se ve reducida al imperativo económico (razón – ciencia – tecnología – desarrollo económico – instrumentalización de la razón), esto denuncia la Escuela de Frankfurt.
    Pero si la razón está alerta ante esos peligros y esas desviaciones, y asume el elemento irracional o de locura que también la configura, es la mejor forma de fundamentar cualquier sistema o vida. Ésa es mi opinión.
    Y si tuviera que elegir una forma de razón me quedo con la mía, la de Baruch Spinoza, que es la razón de la expansión y el crecimiento, desde la alegría. Camino no siempre recto y muchas veces cuesta arriba, eso también es cierto.
    Ya me harás un esquema de “tu razón” cuando tengas tiempo y menos exámenes.

    Saludos.

    Por cierto, David parece saber captar imágenes. Me gustó el video. Parece una excursión con menos sombras.
    Suerte para la semana que viene.


  3. Coñe, Bato, te ha firmado Herm… Spinoza!

    Desde luego, tu blog va ganando en prestigio… Aunque eso que dice no hace sino más que confirmar mi teoría de la gilipollez humana, viendo al ser humano como una persona a la que le da miedo la libertad, que si no está bajo el dogma de la religión, lo estará bajo el dogma de la razón…

    Y precisamente esto último es mucho más peligroso; porque si estás bajo el dogma de la religión simplemente te limitas a aceptar ideas preconcebidas sin darle más vueltas; pero teniendo confianza ciega en la razón las consecuencias son mucho peores, porque seamos francos… muchas veces pensar sólo sirve para tener malas ideas, y al final los que más piensan son los que a priori viven más atormentados. Confiar ciegamente en la razón es confiar en una naturaleza “no tan mala” de los seres humanos, y esto no es así. Gilipollas somos todos.

    Es tremendamente difícil encontrar personas que tengan un equilibrio entre su parte racional y su parte “irracional”, por llamarlo de algún modo… demasiado díficil. Y los que existen, viven inmersos en un sistema dominado por los gilipollas racionales y los gilipollas irracionales; que siempre serán mayoría.

    Para que luego digan de las democracias.


  4. […] esta herramienta en su Blog. Se trata de una aplicación sencilla cuando comencé a desarrollar pBot, concretamente esa pequeña función encargada de convertir colores de mIRC a colores de consola. […]



Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: