martes, 26 de febrero de 2013

BOSH con prosody


Un servidor BOSH, es aquel servidor que da la posibilidad de tener jabber atravez de http. De he ahí que antes se le llamo http-bind. La cuestión es tener jabber a través de consultas HTTP, dando la posibilidad de usar jabber con aplicaciones web o simplemente para clientes que están detrás de proxys muy restrictivos en el quinto infierno.

Prosody, permite configurar con mucha facilidad esta maravilla del mundo moderno. Lo primero es abrir el fichero de configuración que ya todos conocemos y en la sesión de módulos habilitaremos un módulo llamado "mod_bosh". Si todo esto te sonó en sueco, dirígete a las entradas anteriores donde explico cual es el fichero de configuración y que forma tiene.

También tendremos que agregar un parámetro con los detalles de nuestro servidor bosh. En teoría la cosa es tan fácil como:

bosh_ports = { "http-bind" }

Pero eso haría que el servidor bosh escuche en el 5280 y dijimos que tenemos un servidor bosh para los usuarios que radican detrás de un servidor proxy restrictivo, por ejemplo, el proxy de una escuela o de alguna corporación de mala muerte.

En dicho lugar solo están abiertos los puertos 443 para SSL y 80 para HTTP, por tanto, nuestro servidor BOSH puede y tendrá que adaptarse a las complejas circunstancias de nuestros pobres usuarios.

bosh_ports = {
              {
                 port = 80;
                 path = "http-bind";
              },
              {
                 port = 443;
                 path = "http-bind";
                 ssl = {
                          key = "bosh.key";
                          certificate = "bosh.crt";
                       }
              }
           }


Sí! ya se. Es un reguero tremendo de parentesis y cuando copies con Vim o con cooledit se formará tremendo desorden. Suerte!

Para los usuarios de nginx, les daré las mieles antes de que larguen el pelo tratando de lograr el proxy inverso. La configuración sería más o menos así.

location /http-bind/ {
   proxy_pass  http://localhost:80/http-bind/;
   proxy_buffering off;
   tcp_nodelay on;
}

Muy importante que /http-bind/ este entre dos "/" tanto al principio como al final, si no, no pincha.

lunes, 25 de febrero de 2013

servidor MUC con procody


"más de lo mismo" sería un buen encabezamiento para este post. Hablábamos en el post anterior de un servidor jabber bueniiiiisimo. Lo cierto es que si fuera tan bueno, medio mundo lo usara, pero hay que reconocer que tiene su encanto.

En el post anterior, quedamos en que le habilitaríamos un un servidor de conferencias que trae incorporado y miren que facilito es esto:

echo 'Component "conference.tudominio.cu" "muc"' >> /etc/prosody/prosody.cfg.lua

Ahora solo falta crear un puntero DNS que apunte a conference.tudominio.cu

Para prosody todo estos servicios adicionales son "componentes". Como buenos ejemplos, tenemos un sock5, una pasarela de transferencias y en especial, el servidor BOSH, ese que permite jabber por http. Gracias a eso ponemos las jugosas interfaces web como JWM. En la próxima entrada veremos como
habilitar el servidor BOSH de prosody.

Nota para los imbéciles: no olvide reiniciar prosody

roster compartido en prosody


En el post anterior hablamos sobre un servidor de jabber con prosody y hablamos sobre sus características expandibles. Como servidor Muc, BOSH y roster compartido. Empezemos por la que más me gusta.

El mal llamado roster compartido, es en realidad un grupo en el que varios JID ya están declarados y no han de ser añadidos. De esta forma, un nuevo usuarios se incorpora y estará en la lista, además, tendrá a todos los usuarios en la suya. Evita tener que agregar usuario por usuario. Para crear este grupo especial, debemos tener habilitado un módulo llamado "groups", si no sabe como hacer esto, diríjase al post anterior.

Una vez habilitado, escribiremos su parámetro de configuración fuera de la sesión donde declaramos los módulos. El parámetro se llama groups_file y sería más o menos así.

echo 'groups_file = "/etc/prosody/sharedgroups.txt"' >> /etc/prosody/prosody.cfg.lua

Pero tenemos un fichero nuevo, un tal sharedgroups.txt. Dicho fichero no existe aun así que lo crearemos. Ahí declararemos un grupo llamada "Usuarios" y le pondremos los usuarios deseados. Los grupos se declaran poniendo el [Nombre] entre corchetes. Puede poner todo los grupos que quiera. Debajo del grupo pondremos la JID, podemos agregarle un nombre real con un "="

echo '[Usuarios]'
echo 'admin@dominio.cu'
echo 'fulano@dominio.cu'
echo 'contabilidad@dominio.cu=Hilda Maria
echo 'chicho@gmail.com'
echo 'pepe@jabber.org'

Con eso creamos un grupo llamado Usuarios. El roster de esos tres usuarios tendrá a lo mismos autorizados; listos para hacer click e iniciar la charla. Además, tendrá otros dos extras.

Pero sería desesperante tener que escribir en un fichero cada vez que se crea un usaurio. Mejor sería algo que mantenga esa lista de manera automática. Por eso, cree un fichero que al ser corrido, recoge todos los
usuarios del sistema y recrea el fichero.

Para esto, vamos a necesitas un módulo extra:

curl http://prosody.im/files/mod_listusers.lua > /usr/share/lua/5.1/prosody/modules/mod_listusers.lua

Ojo con la versión y la ruta. Bajamos un módulo especial que NO se usará dentro del servidor. ¿Se recuerdan que prosodyctl hacia mas cosas de las que dice hacer? Una vez bajado el módulo corremos:

prosodyctl restart
prosodyctl mod_listusers

¡Y sorpresa! una lista con todos los usaurios de nuestro sistema. ¿Qué podemos hacer con ella? Mire:

root@donor:~# cat /usr/local/bin/update_prosody_roster.sh
#!/bin/bash
echo '[Usuarios]' > /etc/prosody/sharedgroups.txt
prosodyctl mod_listusers >> /etc/prosody/sharedgroups.txt
killall -9 lua
/etc/init.d/prosody start

De esta forma, cuando un usuario se agregue o cuando lo agreguemos manualmente, solo tenemos que correr "update_prosody_roster.sh" y para tener todos los usaurios en el roster masivo. Si tienes el módulo
"watchregistrations" te enterarás cada vez que un usuario se registre y podrías correr el script. De otra forma, si los agregas tu a mano, corres el script despues de agreagarlos, o modifica el escript para mandarle el usuario como parámetro y que este ejecute el add de prosodyctl.

En el próximo post, veremos como configurar un servidor MUC para conferencias...

servidor jabber con prosody


Lua, es uno de los tantos lenguajes interpretados que hay. Echo por los Brasileños; aunque lo de ellos definitivamente es la samba y el futboll. Lo digo porque ese fue uno de los primeros lenguajes que estuve manoseando y No creo que halla un buen motivo para escribir algo con él.

¡Pero Prosody, demuestra que me equivoco!

La robusteza, simplicidad y el rendimiento de este servidor quizás sean superiores a la de ejabberd (que está escrito en Erlang, un lenguaje aún más exótico que Lua). Por otra parte, su todo en uno, lo hace más versátil que otros cuantos. No tiene nada que envidiarle al cochino OpenFire y toda su parafernaria de Java.

Prosody cuenta de manera incorporada con servidor MUC (sala de charla), pasarelas hacia servicios, logger de error, loger normal, logger de debug, servidor BOSH, discovery, mensaje masivo, MOTD y todo lo que necesita un completo servidor jabber. Incluso un servidor http y una interfaz de telnet. No piense usted que todo eso es obligado e incluido por defecto.

En su estado natural, prosody solo viene con lo básico. Ampliarlo, es solo cuestión de modificar la configuración. No piense en una extraña interfaz web como la de ejabber, hablamos de un fichero de configuración ".lua" con todo comentado.  No necesitamos saber Lua para configurarlo porque hay mas
comentarios que código en dicho fichero. La exoticidad de Lua radica en que un comentario es "--" en vez de "#"

Prosody tiene un bonito esquema modular. Los módulos del llamado tipo "core", son lo básico del jabber: iq, precense, etc... No son funciones del servidor, son módulos, módulos base que incluso pueden ser deshabilitados. De forma que el servidor es un núcleo monolítico, compuesto por varios módulos. Ampliarlo, es solo cuestión de quitar comentarios y las cosas más específicas, como un roster compartido, es solo  uestión de insertarle un módulo y parametrisarlo; no hay compilar nada.

Comenzamos. En debian todo es muy fácil:

aptitude install prosody

Esto dará lugar un fichero de configuracion en: /etc/prosody/prosody.cfg.lua

De ahí modificaremos lo que necesitamos. Primero, poner la JID del admin, eso lo haremos aunque nuestro dominio no halla sido declarado.

admins = { 'tu_usaurio@tudominio.cu' }

Ahora vamos a la sesión modules_enabled. Todo bien comentadito. Yo lo habilito todo menos el servidor http y el telnet, como que no me da buena espina.

Si habilitamos el módulo "motd" nuestro servidor contará con un MOTD, pero debemos especificarlo. De esta forma cada módulo es una función que puede o no llevar parámetros de configuración. Para argumentar la configuración de motd, escribimos FUERA de las sesión de módulos.

motd_text = 'este es el motd de mi server'

Pero "motd_text" no estaba escrito en ninguna parte. Para ver si un módulo tiene o no configuración, sus detalles, que hace y hasta un ejemplo, podemos verlo en la lista de módulos.

http://prosody.im/doc/modules

Pero volvamos a la configuración. La siguiente linea de interés es la que permite el registro de usuarios.

allow_registration = true;

OJO! se requiere un ";" al final de la configuración (razón por la cual abandoné Lua). Si no quieres que los usuarios se registren déjalo en false. Puedes usar la aplicación de control para crear usuarios. Ejecuta prosodyctl sin parámetros y veras una pantalla aprueba de imbéciles que te dice como crear los usuarios y otras opciones interesantes. Lo bueno que tiene esa aplicación es que hace más cosas de la que dice.

Lo siguiente es el SSL, no es bueno desabilitarlo porque muchos cliente jabbers traen por definición usar ssl. Mejor seguir a las que dice:

c2s_require_encryption = false
s2s_require_encryption = false

Poniéndolas en false, el servidor usara lo mismo SSL que plana.

Pero aún no hemos declarado el dominio. Resulta que como te dije todo es modular. Los dominios son VirtualHost. Al igual que en apache, incluso el dominio por defecto, es un virtual host. Podemos declarar varios dominios y dejarlos deshabilitados.

VirtualHost "tudominio.cu"

Ya tenemos un dominio, podríamos tener más con solo agregarlos pero con eso ya tenemos un servidor con lo indispensable. Veamos en el próximo post, como es el caso de un servidor con sala de conferencias y con roster compartido, dos características que no faltan en servidor jabber corporativo.

viernes, 8 de febrero de 2013

dovecot chrueco

Ahora la han cogido de gracia en dovecot, poner los mailbox en un lugar extraño. Cunado haces un upgrade de sistema, el despingue es de alcurnia. Para los enchapados a la antigua, así ponemos los mailboxes en /var/mail/$USERNAME

En el fichero /etc/dovecot/dovecot.conf localizamos la parte esta:


# See </usr/share/doc/dovecot-common/wiki/Variables.txt>\
# Some examples:
#
#   mail_location = maildir:~/Maildir                     
#   mail_location = mbox:~/mail:INBOX=/var/mail/%u
#   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
#
# </usr/share/doc/dovecot-common/wiki/MailLocation.txt>
#
mail_location = mbox:~/mail:INBOX=/var/mail/%u

Cambiamos el parámetro mail_location por lo señalado en rojo.