Monthly Archives: June 2011

Alfresco Team… por fin Alfresco para PYMES

Ayer salió la versión de Alfresco Team, es la versión 3.5 pero esta vez adaptada a PYMES. Con un precio más que reducido para 10 usuarios (o bien 5 en la versión Trial) es la nueva apuesta de Alfresco Software para entrar en las pequeñas y medianas empresas. Por cierto, se puede bajar e instalar o contratar su servicio “en la nube”.

He probado la versión para Windows 64bits en un Windows 7 y la instalación ha ido perfectamente, el arranque (mediante servicio de Windows) se ha creado de forma satisfactoria y ha instalado un PostgreSQL, si, en lugar de MySQL… 🙂

La documentación podemos encontrarla en http://docs.alfresco.com/3.5/index.jsp y su página web oficial es http://team.alfresco.com/

La versión “Free” como digo, tiene la limitación de 5 usuarios como máximo y 500 documentos. Para una limitadísima oficina vamos, pero parece un buen comienzo 😉

Ahora, seguramente nuestra ficticia aseguradora FEGOR podrá desarrollar todo su pontencial sin invertir demasiado y sin tener una versión sin soporte como era la Community.

¿Replica la información de sesión Alfresco ECM en clúster?

Una de las críticas que más recibe Alfresco es que este no clona/replica las sesiones y variables asociadas, como por ejemplo la variable alf_ticket, por lo que en aplicaciones que llaman a nodos de un clúster de Alfresco se produce un error de autenticación.


Pero ¿es esto cierto?… bueno, creo que en parte si pero en parte no y por eso he realizado unas pruebas.

Una solución realizada hasta ahora era la de configurar en el balanceador lo que se llaman sesiones “sticky” que usan una variable de sesión como JSESSIONID para dirigir todas las peticiones de esa sesión al mismo nodo. De esta forma, al ser siempre el mismo nodo quien recibe las peticiones y tener la información del ticket de validación correcta no hay problemas.

Esta solución es válida para aplicaciones que usan sesiones, pero ¿que ocurre si una aplicación no las usa?, como el balanceador no sabe a donde dirigirlo porque no tiene esta información puede dirigirlo siempre al mismo nodo, lo que sería un mal menor, o redirigir a uno u otro nodo indistintamente, lo que provoca el error.

Bien, vamos a comprobar que Alfresco ECM versión 3.3.4 si clona al menos la información del ticket de autenticación para que cuando se entra en cualquier nodo usando un ticket de validación válido, Alfresco permite la entrada.

Lo primero es configurar correctamente el cluster de Alfresco ECM. En mi caso esta es la información de alfresco-global.properties:

alfresco.cluster.name=alfprucluster
alfresco.jgroups.defaultProtocol=TCP
alfresco.tcp.initial_hosts=alfpru1[7800],alfpru2[7800]

Además de renombrar el fichero ehcache-custom.xml.sample.cluster como ehcache-custom.xml

Creamos el fichero para probar el acceso entre los nodos usando la variable alf_ticket y sin usarla (o usando si quieremos una ficticia no válida)

Fichero: prueba_auth_cluster.sh

#!/bin/bash

ALF_USER=admin
ALF_PASSWD=admin
ALF_NODE1=alfpru1:8080
ALF_NODE2=alfpru2:8080
ALF_SEARCH_TERM=readme.ftl
ALF_ROOT=Company%20Home

echo “AUTENTICACION Y RECOGIDA DEL TICKET EN EL PRIMER NODO.”
ALF_TICKET=`curl “http://${ALF_NODE1}/alfresco/service/api/login?u=${ALF_USER}&pw=${ALF_PASSWD}” | grep TICKET_ | sed ‘s:::g’ | sed ‘s:::g’ | tr -d ‘r’`

echo “BUSCAR EN EL PRIMER NODO USANDO EL TICKET DE AUTENTICACION DEL PRIMER NODO.”
curl “http://${ALF_NODE1}/alfresco/service/api/search/keyword.text?q=${ALF_SEARCH_TERM}&p=${ALF_ROOT}&c=1&l=es&alf_ticket=${ALF_TICKET}”

echo “BUSCAR EN EL SEGUNDO NODO USANDO EL TICKET DE AUTENTICACION DEL PRIMER NODO.”
curl “http://${ALF_NODE2}/alfresco/service/api/search/keyword.text?q=${ALF_SEARCH_TERM}&p=${ALF_ROOT}&c=1&l=es&alf_ticket=${ALF_TICKET}”

echo “BUSCAR EN EL SEGUNDO NODO SIN USAR EL TICKET DE AUTENTICACION DEL PRIMER NODO.”
curl “http://${ALF_NODE2}/alfresco/service/api/search/keyword.text?q=${ALF_SEARCH_TERM}&p=${ALF_ROOT}&c=1&l=es”

Una vez configurado todo y arrancados ambos nodos de Alfresco, ejecutamos el script.

La salida en mi caso ha sido la siguiente:

./prueba_auth_cluster.sh
AUTENTICACION Y RECOGIDA DEL TICKET EN EL PRIMER NODO.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   106    0   106    0     0     10      0 –:–:–  0:00:10 –:–:–    31
BUSCAR EN EL PRIMER NODO USANDO EL TICKET DE AUTENTICACION DEL PRIMER NODO.
readme.ftl
BUSCAR EN EL SEGUNDO NODO USANDO EL TICKET DE AUTENTICACION DEL PRIMER NODO.
readme.ftl
BUSCAR EN EL SEGUNDO NODO SIN USAR EL TICKET DE AUTENTICACION DEL PRIMER NODO.
Apache Tomcat/6.0.18 – Informe de Error

Estado HTTP 401 –


type Informe de estado

mensaje

descripci�n Este requerimiento requiere autenticaci�n HTTP ().


Apache Tomcat/6.0.18

Que demuestra efectivamente que con el ticket obtenido en la autenticación del primer nodo, nos sirve para usarlo con el segundo. Además se realiza otra llamada sin usar el ticket para afirmar esta prueba ya que de esta forma sí debe salir un error.

Ahora vamos a eliminar el clúster, de forma que no se comuniquen los nodos entre sí y no pasen la información. Para ello quitamos las líneas de configuración del clúster de alfresco-global.properties y volvemos a ejecutar el script, el resultado, obviamente será el siguiente:

./prueba_auth_cluster.sh

AUTENTICACION Y RECOGIDA DEL TICKET EN EL PRIMER NODO.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   106    0   106    0     0    182      0 –:–:– –:–:– –:–:–     0
BUSCAR EN EL PRIMER NODO USANDO EL TICKET DE AUTENTICACION DEL PRIMER NODO.
readme.ftl
BUSCAR EN EL SEGUNDO NODO USANDO EL TICKET DE AUTENTICACION DEL PRIMER NODO.
Apache Tomcat/6.0.18 – Informe de Error

Estado HTTP 401 –


type Informe de estado

mensaje

descripci�n Este requerimiento requiere autenticaci�n HTTP ().


Apache Tomcat/6.0.18

BUSCAR EN EL SEGUNDO NODO SIN USAR EL TICKET DE AUTENTICACION DEL PRIMER NODO.
Apache Tomcat/6.0.18 – Informe de Error

Estado HTTP 401 –


type Informe de estado

mensaje

descripci�n Este requerimiento requiere autenticaci�n HTTP ().


Apache Tomcat/6.0.18

Por tanto, como puede observarse Alfresco ECM sí funciona correctamente como un clúster. Hay que indicar también que sigue siendo necesario (a mi entender) el uso de las Sticky Sessions para controlar mejor el tráfico a través del balanceador.

También se ha probado a recoger el ticket del primer nodo, parar este nodo y acceder con el resultado del ticket al segundo funcionando correctamente también.

Pero ¿que pasa entonces con las interfaces web?, bien, tanto el Explorer como Share, así como todas las interfaces que se desarrollen deberán controlar al menos el uso de la variable alf_ticket para que ninguno de los nodos reciba un ticket de validación erróneo o no lo reciba ya que de esta forma volverá a solicitar el inicio de sesión. Esto no es un problema del clúster en sí, si no de las interfaces de usuario y como he podido comprobar, en este caso ambas fallan cuando no tienen activadas las Sticky Sessions porque al parecer no pasan entre las peticiones (GET y POST) la variable alf_ticket. Según Alfresco, en la versión 3.4.3 esto estará solucionado.

NOTA: He usado el WebScript de búsqueda y que realiza una salida en texto de mi post http://www.fegor.com/2011/05/calculando-metricas-en-alfresco.html al que he declarado como autenticado mediante usuario user”.

Alfresco, WebDAV y WebSphere

WebDAV (Web-based Distributed Authoring and Versioning) es un protocolo que implementa Alfresco para poder conectar unidades y/o recursos compartidos y poder subir, modificar y borrar documentos de una forma sencilla.

Este protocolo además es bastante simple y se basa en comunicaciones vía HTTP y HTTPS con lo que es además muy sencillo de configurar entre balanceadores y firewalls. No obstante presenta algunos problemas cuando se conecta a través de Windows.

Uno de ellos es la codificación, Windows usa generalmente la ISO-8859-15 (en España) y Alfresco usa generalmente UTF-8 a nivel de Java y sobre todo si está instalado en máquinas Linux. Este problema de codificación cambia caracteres con tildes, eñes, etc. por lo que hay que prestar atención a la configuración y establecer todo al mismo sistema de codificación para evitar sorpresas.

Otro problema que me he encontrado en un cliente ha sido la conexión directamente con el servidor desde las estaciones de trabajo tanto Windows XP como Windows 7.

Realizando pruebas con un Apache 2.2 y mod_proxy_balancer hacia dos máquinas virtuales con Alfresco 3.3.4 no he tenido problemas siempre y cuando se sigan las indicaciones de los siguientes enlaces:

http://wiki.alfresco.com/wiki/File_Server_Configuration
http://wiki.alfresco.com/wiki/Client_WebDAV
http://support.microsoft.com/kb/841215
http://support.microsoft.com/kb/912152
http://www.webdavsystem.com/server/documentation/authentication/basic_auth_vista

Básicamente es actualizar el software del cliente WebDAV así como activar la autenticación básica tanto en plano como por SSL usando el registro de Windows.

Ejecutar regedit.exe

En Windows XP, crear un valor DWORD en HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesWebClientParameters llamado UseBasicAuth con el valor a 1.

En Windows 7, crear un valor DWORD en HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesWebClientParameters llamado BasicAuthLevel con el valor a 2.

Una vez realizados estos cambios solo hay que reiniciar el servicio cliente de WebDAV, reiniciando la máquina o parando e iniciando el servicio como:

NET STOP webclient
NET START webclient

Hasta aquí todo correcto, en las máquinas virtuales de laboratorio todo fue correctamente, pero en el cliente seguía habiendo problemas cuando se intentaba conectar con Windows XP, no así con Windows 7, ¿cual era la diferencia básica?

En el cliente, los accesos se realizan hacia un balanceador hardware que a su vez dirige las peticiones a sendos IBM HTTP Servers que no son más que un Apache modificado y estos se conectaban a los nodos de Alfresco en clúster (estos están en WAS o IBM WebSphere Application Server).

Para el balanceo de los servidores IBM HTTP Server se usa un plugin propio. Este se configura a través de un fichero llamado plugin-cfg.xml

En el siguiente enlace hay una descripción de los parámetros y valores posibles: http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/rwsv_plugincfg.html

En su configuración, el parámetro AcceptAllContent está desactivado y su misión es la de si permite que los usuarios puedan incluir o no el contenido en las peticiones POST, PUT, GET, y HEAD cuando la cabecera de petición incluye una cabecera de longitud del contenido o de codificación de la transferencia.

Se puede especificar True para leer todas las peticiones o False en la que se espera sólo el contenido y sólo para las peticiones POST y PUT.

Poniendo este valor a True todo se ha solucionado y ahora los Windows XP (SP1, SP2 y SP3) pueden conectarse sin ningún problema.

Agradezco la ayuda aportada a la solución de este problema a Roberto Herrero Guindal, experto en WebSphere del departamento de sistemas del cliente que ha tenido este problema.