1. Introducción
Antes de empezar la creación de plugin es importante que hayas leído las siguientes entradas:
2. Plugins n4d
El desarrollo de módulos n4d es bastante sencillo, y consiste principalmente en:
- Ddefinir la clase y los métodos que queremos implementar.
- Indicar al sistema n4d cómo publicar estos métodos de cara a exterior.
La mejor manera de ver esto es através de un pequeño ejemplo que veremos a continuación.
La estructura de un plugin consta de dos ficheros, uno de configuración (/etc/n4d/conf.d) y otro de implementación de la clase (/usr/share/n4d/).
Dentro de la carpeta /usr/share/n4d tenemos diferentes carpetas en función del lenguaje de programación que usemos para hacer el plugin:
- python-plugins: escritos en python
- perl-plugins: escritos en perl
- binary-plugins: escritos en bash
3. Creación de un plugin chat de aula
Nuestro plugin, que vamos a nombrar como N4dChat, implentará tres métodos, y dispondrá de un atributo donde guardar los mensajes:
- ClaseN4dChat
- Atributo mensaje: lista de mensajes.
- Método SendMessage(ip, usuario, mensaje): Cogerá la ip de quién lo envia, el nombre de usuario y el mensaje.
- Método getMessages(inicio): Devolverá todos los mensajes enviados a par del mensaje marcado como "Inicio".
- Método saveChat(archivo): guardará todos los mensajes en el /tmp del servidor.
Los métodos sendMessage y getMEssage son accesibles para todo el mundo y savehat será solo accesible para administradores y profesores.
Para implementar esto crearemos un fichero /etc/n4d/conf.d/N4dChat amb el siguiente contenido:
[SETUP] type=python path=N4dChat.py class=N4dChat [METHODS] (ip)sendMessage=anonymous getMessages=anonymous saveChat=adm,admins,teachers
Podemos ver que tenemos dos secciones en el archivo:
- SETUP: que es donde se configura el plugin.
- type=python : definimos el lenguaje de programación del plugin.
- path=N4dChat.py Nombre del fichero donde se implementan los métodos
- class=N4dChat Nombre de la clase
- METHODS: donde se indican los métodos que se hacen publicos en la clase.
- (ip)sendMessage=anonymous : la ip delante indica que la ip de la máquina se envía como primer parámetro
- getMessages=anonymous
- saveChat=adm,admins,teachers
Vamos a explicar el código paso por paso. Has de tener en cuenta que no puedes cortar y pegar directamente este código ya que python hace uso de los tabuladores.
Importamos las librerías os y json. Os para acceder al sistema y json para poder crear archivos json.
import os import json
Definimos la clase N4dChat y definimos el constructor. En el constructor iniciamos un vector:
class N4dChat: def __init__(self): self.Messages=[] pass
Definimos el método sendMessage(self, ip, username, message)
def sendMessage(self, ip, username, message): try: msg={"ip":ip, "username": username, "message":message} self.Messages.append(msg) except Exception as e: print "except "+str(e) return 1
Definimos el método getMessage(self, startMsg), donde le pasamos desde que mensaje queremos que empiece a leer:
def getMessages(self,startMsg): try: return(self.Messages[int(startMsg):]); except Exception as e: print "except "+str(e) return 1 return 0
Definimos el método saveChat(self, filename) donde indicamos el nombre del archivo que queremos que salve
def saveChat(self, filename): try: with open("/tmp/"+filename, 'w') as outfile: json.dump(self.Messages, outfile) except Exception as e: print "except "+str(e) return 1 return 0
Podemos bajar el archivo para usarlo de aquí:
4. Uso y testeo de plugins
Una vez tengamos nuestro plugin hecho, si queremos testearlo debemos reiniciar el servicio n4d, para ello debemos hacer:
sudo service n4d restart
Es importante abrir otra terminal y controlar el log de n4d:
sudo tail -f /var/log/n4d/n4d-server
Si nos fijamos en el log, en algún momento debe salirnos:
[N4dChat] /usr/share/n4d/python-plugins/N4dChat.py ... OK
Si hay algún problema deberemos revisar el código para asegurarnos que todo es correcto.
5. Pruebas
Finalmente hemos de probar nuestro plugin. Si todo ha ido bien para testearlo usaremos n4d-client.
n4d-client -c N4dChat -m sendMessage -a "" lliurex "Hola a tots"
n4d-client -c N4dChat -m getMessages -a 0 [{'username': 'lliurex', 'ip': '127.0.0.1', 'message': 'Hola a tots'}, {'username': 'lliurex', 'ip': '127.0.0.1', 'message': 'Fent proves'}]
n4d-client -c N4dChat -m saveChat -u lliurex -p lliurex -a chat.txt cat /tmp/chat.txt [{"username": "lliurex", "ip": "127.0.0.1", "message": "Hola a tots"}, {"username": "lliurex", "ip": "127.0.0.1", "message": "Fent proves"}]