Plugins base disponibles en CMSysBot

CMSysBot permite la incorporación de nuevas funcionalidades (plugins) de forma dinámica.

Por defecto, el bot incorpora los siguientes plugins base:

  • Wake computers: permite encender equipos de forma de remota mediante la tecnología Wake on Lan (WoL).
  • Update computers: permite ejecutar una serie de comandos para actualizar los paquetes software instalados en los equipos.
  • Shutdown computer: permite apagar los equipos.
  • Remove package: permite eliminar un software del equipo.
  • Install package: permite instalar un software en el equipo.

Estos plugins se encuentran disponibles en la carpeta plugins del proyecto

El código de estos plugins está desarrollado en bash. En este ejemplo podemos ver el código del plugin Wake computers (encender equipos).

#!/bin/bash

# CMSysBot: {
# "root": "False",
# "source": "bridge",
# "arguments": ["$MACS_LIST"]
# }

MACS_LIST="$@"

if [[ $? != 0 ]]; then
  sudo apt-get -y install wakeonlan &>/dev/null
fi

wakeonlan $MACS_LIST

En un post siguiente hablaremos sobre cómo desarrollar tu propio plugin para añadir una nueva funcionalidad al bot.

Anuncios

[Diario de Desarrollo] – Semana 01/04 – 07/04

Esta semana, en el Diario de Desarrollo vamos a hablar un poco del estado del bot, ahora que estamos en plena fase de evaluación del CUSL, y tenemos noticias que anunciar:

¡CMSysBot llega al MVP!

Finalmente, hemos llegado al punto de desarrollo donde hemos alcanzado un “Producto viable mínimo” (MVP). Tenemos una gran parte del desarrollo hecho, y ya hemos podido ir a algunas aulas a probarlo en condiciones reales. De hecho, hemos publicado en nuestro Github una Pre-release, la versión 0.1.0.

En el siguiente tweet hemos publicado un avance del funcionamiento del bot donde hemos encendido los equipos de un aula de informática de forma remota.

Esto no quiere decir que esté todo hecho. A lo largo del desarrollo nos han ido surgiendo más ideas que tenemos pensado implementar (de ellas hablaremos más tarde). Pero si que, finalmente, hemos implementado todas las propuestas que nos planteamos inicialmente antes de comenzar el desarrollo del bot. Lo mínimo que debería tener para que mereciera la pena, vamos.

Echando la vista atrás, ha sido un mes de desarrollo muy intenso. Nos ha complacido mucho ver que al final el proyecto ha cogido buena forma, y que realmente era una idea con potencial. Y sobretodo, también queríamos dar las gracias por la gran acogida que ha tenido el proyecto por parte del resto de la comunidad de Software Libre.

CMSysBot después del CUSL

El CUSL nos ha dado el empujón necesario para comenzar con este proyecto, pero el objetivo final es continuar desarrollándolo hasta llegar a implantarlo en las aulas SIGA de la ULL, y en otras organizaciones que ya han mostrado su interés en implantarlo. De hecho, algunos planes futuros que tenemos son los siguientes:

Revisar código antiguo y refactorizar

Ya en el anterior diario de desarrollo hablamos de lo complicado que era estructurar el código del bot, pero creo que a lo largo del proyecto hemos ido mejorando en esa parte. Además de añadir más características, nos gustaría ir revisando código antiguo para mejorarlo. Además, estamos terminando de finalmente redactar la documentación oficial de CMSysBot, lo que esperamos que sea una gran ayuda para futuros contribuidores al proyecto.

Tests e integración contínua

Nos parece importante que un proyecto grande pueda respaldarse en una buena batería de tests para garantizar su funcionamiento. Por desgracia, la única librería para hacer tests que se integren con python-telegram-bot está desactualizada. Nos gustaría dedicarle tiempo a investigar posibles alternativas para mejorar la calidad de futuras versiones.

¡Hacer CMSysBot compatible con más chatbots!

Estos días, Iván Santos (@SantosIvn) nos ha contactado con una propuesta de colaboración para integrar el bot con Google Assistant. Nos ha parecido una idea muy interesante, y sobre todo, nos ha puesto en el punto de mira el intentar adaptar el proyecto a más chatbots diferentes, haciendo que la librería sea más genérica. Es una tarea a largo plazo, pero nos parece que sería un buen objetivo al que llegar.

¡El desarrollo sigue!

Aún tenemos más sorpresas que iremos anunciando a lo largo de esta semana, pero por ahora… ¡nos vemos en el próximo Diario de Desarrollo!

Recuerda que puedes seguir todo el progreso del proyecto en:

[Diario de Desarrollo] Semana 25/03 – 29/03

Progresos del proyecto

¡Continuamos otra semana más con los Diarios de Desarrollo! Esta semana ha estado cargada de avances en el proyecto, pero si tuviéramos que destacar uno, sería la refactorización casi completa de todo el código.

Francamente, organizar el código de un bot es una tarea compleja. Por su naturaleza, tiene que estar preparado para ejecutarse de forma asíncrona, ya que tiene que poder utilizarse de forma simultánea por diferentes usuarios. Por eso mismo, no podemos recurrir a las estrategias tradicionales de programación estructurada. En su lugar, se utilizan callbacks, funciones que se ejecutan automáticamente en respuesta a las acciones del usuario (como enviar mensajes o interactuar con los menús del bot).

Y aunque no llega al nivel del Callback Hell de Javascript, los archivos crecen muy rápidamente, con decenas de callbacks que se llaman entre ellas para manejar todas las posibles entradas de todos los usuarios… y al final, acabamos con un código que está irremediablemente mezclado

Precisamente, esta semana nos hemos visto a las puertas de esa situación. Poco a poco se nos iba haciendo más complicado añadir nuevas funcionalidades sin producir efectos colaterales, y sobre todo, moverse por el código era muy tosco. Pero aún con todos estos problemas, no nos hemos dado por vencido y finalmente hemos visto la luz al final del túnel: Una adaptación propia del patrón MVC (Modelo-Vista-Controlador) para un bot de Telegram.

Refactorizando CMSysBot

Volviendo a pensar en el diseño del bot, nos vino la idea de intentar implementar el patrón MVC, haciendo la distinción entre los datos del usuario (Modelo), los menús y mensajes del bot (Vista), y las callbacks (Controlador). Y este diseño nos ha dado muy buenos resultados.

Si pusiéramos un ejemplo destacable, sería el módulo menu:

  • Versión antigua, donde todo el código está entremezclado (callbacks y vista)
  • Versión nueva de menu como parte del modulo controller, y un módulo nuevo, view. Ahora, menu solo se encarga de la lógica del bot, como realizar el movimiento entre los menús y manejar la entrada del usuario, y solo tiene que llamar a view para que esta muestre la vista correspondiente en el chat.

Además, en base a estos cambios se ha rediseñado toda la estructura de los archivos, de modo que ahora el bot es su propio paquete de Python, con varios submódulos que se encargan de las tareas más importantes

Gracias a estos cambios, el código no es solo más intuitivo para nosotros, sino que además lo hace más estable y menos propenso a bugs y efectos colaterales, por lo que creemos que ha sido una buena inversión de tiempo.

Nuevas funcionalidades

Y aunque solo hemos hablado de la refactorización del código, ¡también hemos implementado nuevas características al bot!

  • Encender y apagar los ordenadores, mediante wake-on-lan y el comando init 0, respectivamente.
  • Ejecutar comandos de forma remota desde el ordenador puente a cualquier ordenador de la red local, con o sin permisos de root.
  • Mandar a los ordenadores a actualizarse, y dejar el proceso en segundo plano para que el bot no tenga que esperar a que terminen.
  • Nuevo submenú, filtrar ordenadores, que permite mostrar los nombres, ips y macs de todos los equipos registrados en la red local, y añadirlos u excluirlos de las próximas acciones realizadas por el bot.

¡Hasta la próxima semana!

La próxima semana será la última semana de desarrollo antes de que comience la evaluación de los proyectos del XIII Concurso Universitario de Software Libre (CUSL), así que puedes esperar más novedades por nuestra parte. ¡Aún nos quedan muchas cosas por enseñar!

Recuerda que puedes seguir todas las novedades del proyecto en:

¿Cómo instalar tu propio CMSysBot?

CMSysBot (Centralized Management for Systems Administration) es un bot de Telegram desarrollado en el lenguaje de programación Python, y puedes instalar una instancia de este proyecto en tu propia organización.

Lo primero de todo que debes saber, es que tienes que disponer de un servidor, ya sea una máquina virtual o una máquina física, que tenga acceso mediante SSH a los equipos puente de tu organización.

En este servidor, debes de tener instalado al menos el siguiente software requerido para el funcionamiento del bot:

Este software se puede instalar con una simple línea de comandos en un sistema operativo basado en Debian:

sudo apt install -y python3 ssh sshpass git

NOTA: Las pruebas para este bot las hemos realizado en las distribuciones Xubuntu y Ubuntu 18.04 LTS, aunque puede valer cualquier otra distribución GNU/Linux.

Ahora descarga el proyecto desde el repositorio de GitHub donde está alojado el bot:

git clone https://github.com/oddworldng/cmsysbot-telegram.git

Accede a la carpeta del proyecto que has descargado con git:

cd cmsysbot-telegram

Instala el bot y sus dependencias de Python3:

make install

Actualmente, este proyecto depende de las siguientes librerías de Python3:

Por último, debes lanzar (ejecutar) el bot en tu servidor con el comando:

make run

O si deseas lanzarlo en background, puedes utilizar el comando:

make bg

Con estos sencillos pasos ya tienes el bot en ejecución dentro de tu organización, ¡ahora ya sólo falta configurarlo!

[Diario de Desarrollo] Semana 11/03 – 17/03

¡Comienza el desarrollo de CMSysBot!

Esta semana finalmente hemos dado comienzo al desarrollo del código de CMSysBot, realizando las primeras contribuciones al repositorio de Github.

Gran parte del tiempo ha sido invertido en familiarizarnos con la librería utilizada para desarrollar el Bot (python_telegram_bot), además de ir concretando algunas elecciones de diseño necesarias para ir implementándolo.

También, como una parte importante del resultado final del Bot se ve reflejada en el diseño de su interfaz (que hace un uso intensivo de menús para mostrar todas las opciones al usuario), estamos teniendo muy en cuenta el aspecto de UX. Esperamos poder compartir pronto prototipos de la interfaz para hablar mejor de sus funcionalidades y recibir feedback de cara a las próximas iteraciones del proyecto.

Algunas de las funcionalidades implementadas son las siguientes:

  • Menú principal de la aplicación y algunos submenús importantes.
  • Archivo config.json donde centralizar toda la configuración del Bot.
  • Funcionalidad básica para establecer conexión SSH entre el Bot y el ordenador objetivo.
  • Ejecutar comandos en un ordenador ajeno mediante el Bot a través de una conexión SSH, mostrando la salida como un mensaje.

En el siguiente vídeo se puede ver una preview con las nuevas implementaciones:

Si quieres estar atento al progreso del Bot, tienes disponible tanto el repositorio de Github como la cuenta de Twitter.

Equipos puentes de CMSysBot

Si ya sabes cómo es la infraestructura que lleva consigo CMSysBot, y has probado cómo funciona, ¡te estarás preguntando si es cuestión de magia!

No, no es magia, ¡pero a veces lo parece!

El bot está desarrollado de tal forma, que cuando el usuario introduzca la dirección IP de un equipo de la red para que este haga de equipo puente, el servidor (donde está alojado el bot, dentro de tu organización) se conectará mediante el protocolo SSH a este equipo, y es este equipo quien se encargará de enviar todas las peticiones masivas al resto de equipos.

¿Qué es un equipo puente?

Es cualquier equipo dentro de tu organización que tenga la posibilidad de realizar una conexión SSH al resto de equipos de la misma red.

Un ejemplo de equipo puente suele ser, por ejemplo, el equipo del propio administrador de sistemas.

¿Cómo funciona un equipo puente?

Son equipos utilizados como puente entre el bot y el resto de equipos dentro de la organización

¿Por qué se utilizan los equipos puentes?

Existe la posibilidad que sea el propio servidor el que realice estas conexiones SSH directamente a todos los equipos de la organización, pero esto podría suponer un problema de seguridad y existe la posibilidad de que la ejecución de muchas acciones simultáneas, hagan que el servidor se ralentice o se bloquee.

¿Puedo tener más de un ordenador puente?

Sí, ¡tantos como quieras!

En organizaciones grandes, como es el caso de la Universidad de La Laguna donde se está trabajando en implantar este bot para la gestión de aulas, se utiliza un equipo puente por cada aula.

¿Los ordenadores puente necesitan algún software especial?

Estos equipos sólo necesitan tener la opción Wake On Lan (WoL) de la BIOS activada y la herramienta sshpass.

Un equipo se convierte en equipo puente desde el momento que lo seleccionas desde el propio menú del bot.

De esta forma, cualquier equipo puede ejercer como equipo puente.

¿Cómo funciona CMSysBot?

CMSysBot es un proyecto que permite realizar una conexión entre el bot de Telegram y equipos de tu organización para poder administrarlos de forma remota y centralizada.

https://www.appelmo.com/wp-content/uploads/2015/10/Telegram-down-2.jpg

Para poder realizar esta administración de los equipos, es necesario disponer de un servidor Python con el bot instalado y en ejecución.

Este servidor debe tener acceso a las IPs de tu red local para poder realizar una conexión mediante el protocolo SSH (Secure Shell).

Los comandos y solicitudes enviados por los usuarios se envían al software que se ejecuta en nuestro servidor.

El servidor intermediario de Telegram se encarga de todo el cifrado y la comunicación con la API de Telegram.

Ahora podemos abrir una sesión con Telegram en un dispositivo que esté conectado en la misma red y comenzar a utilizar el bot.