Archivo de categoría: Alfresco

Uso del correo electrónico en Alfresco en la vida real – parte 2

Sobre la configuración de Alfresco, primero debemos crear el usuario Jose Grillo para que pueda autenticarse y enviar los emails. Este usuario además debe tener una cuenta de correo electrónico válida para recibir notificaciones, en este caso es josegrillo@fegor.com

No hay que olvidarse de añadirlo al grupo EMAIL_CONTRIBUTORS para tener permisos de enviar correos hacia Alfresco.

Ahora debemos configurar el correo electrónico saliente y entrante. Para la configuración del correo recomiendo la lectura de los siguientes enlaces en los que se explican perfectamente todas las posibilidades:

http://blyx.com/2010/02/08/integracion-de-alfresco-con-el-correo-electronico/

http://wiki.alfresco.com/wiki/Inbound_SMTP_Email_Server_Configuration
http://wiki.alfresco.com/wiki/Outbound_E-mail_Configuration

Vamos a configurar seguidamente el correo saliente de Alfresco para poder realizar notificaciones a los asegurados y peritos. La configuración de correo saliente para GMail a través de Google Apps en Alfresco se realiza en el fichero outboundSMTP.properties del subsistema email, en concreto en la ubicación …/extension/subsystems/email/OutboundSMTP/outbound

Fichero: outboundSMTP.properties

mail.host=smtp.googlemail.commail.port=465
mail.protocol=smtps
mail.username=alfresco@fegor.com
mail.password=alfresco
mail.encoding=UTF-8

mail.from.default=alfresco@fegor.com
mail.smtps.starttls.enable=true
mail.smtps.auth=true

Como se observa, se ha creado también una cuenta llamada alfresco@fegor.com para la autenticación SMTP.

La configuración del correo entrante, para que Alfresco haga de servidor SMTP se realiza en el fichero inboundSMTP.properties en …extension/subsystems/email/InboundSMTP/inbound

Fichero: inboundSMTP.properties

email.inbound.enabled=true email.inbound.unknownUser=anonymous email.server.enabled=true email.server.port=25 email.server.domain=alfresco.fegor.com email.server.connections.max=10 email.server.allowed.senders=.*@fegor.com email.server.blocked.senders=

Ahora debemos configurar en Share un fichero para que nos muestre el campo «alias» en la carpeta a la que asignaremos el aspecto «Atributos de Email». Este fichero se llama share-config-custom.properties y se encuentra en la carpeta web-extension (…/share/classes/alfresco/web-extension). Esto es así porque por defecto, en Afresco Share, no está configurado para que este campo esté visible como pasaba con Alfresco Explorer.

Fichero: share-config-custom.properties


  
     <!–
         Used by the «Change Type» action

         Define valid subtypes using the following example:
           
              
           

         Remember to also add the relevant i18n string(s):
            cm_mysubtype=My SubType
      –>
     
        
           
        
     
    
      <!– forms
      –>
     
        
        
           
              
           
        

        
        
           
                             
           
           
        

        
        
                        
           
        
             
  

Realizadas las configuraciones se arranca Alfresco y continuamos con la configuración desde el propio Alfresco Share.

Uso del correo electrónico en Alfresco en la vida real – parte 1

Vamos a ver un caso de vida real en una PYME usando Alfresco y configurando el correo electrónico tanto de salida como de entrada para gestionar documentos.

El escenario es el siguiente: Imaginamos una pequeña aseguradora llamada FEGOR en la que se dispone de un pequeño servidor de Alfresco y un ADSL. Todos los demás servicios se realizan a través de Google Apps (http://www.google.com/apps/intl/es/group/index.html y pulsar Introducción). Es decir, al menos el correo electrónico. Así mismo, en Hospedaje y Dominios se tiene comprado el dominio fegor.com.

Los peritos podrán enviar correo electrónico con los ficheros necesarios, expediente y fotografías de los siniestros o accidentes que periten. Una vez recibido el correo, Alfresco moverá cada fichero a sus carpetas correspondientes.

Toda la configuración en Alfresco se realizará a través de Alfresco Share.

Configuración de Google Apps: La configuración es muy sencilla, solo hay que seguir los tutoriales y pasos para crear cuentas de correo, sites, etc. En nuestro caso, creamos una cuenta para «Jose Grillo» con el email josegrillo@fegor.com

Una de las particularidades de Google Apps es la de ofrecer la redirección de un dominio que ya hubiésemos comprado en algún ISP tanto para los «sites» o páginas webs, como para blogs (http://blogspot.com) como para el correo electrónico (gmail) lo que hace que podamos usar el dominio para crear cuentas de correo (hasta 50) más profesionales. Para ello hay que modificar los DNS del registrador o ISP (Internet Service Provider) donde está alojado el dominio siempre que no lo compremos directamente a Google. Los datos a poner en el sistema de DNS (cada ISP tiene su propio sistema e interface o panel de control para hacerlo) serán los siguientes:

Introducir los siguientes registros MX con las siguientes prioridades:

ASPMX.L.GOOGLE.COM. 10
ALT1.ASPMX.L.GOOGLE.COM.
20
ALT2.ASPMX.L.GOOGLE.COM. 20

ASPMX2.GOOGLEMAIL.COM. 30

ASPMX3.GOOGLEMAIL.COM. 30
ASPMX4.GOOGLEMAIL.COM. 30

ASPMX5.GOOGLEMAIL.COM. 30

Una vez hecho esto, el correo se puede manejar desde el dominio que tengamos alojado en el ISP de turno. En Hospedaje y Dominios (http://www.hospedajeydominios.com) es muy fácil ya que incluso incluye un enlace que rellena esta información en la gestión de DNS. En la imagen se ve la configuración tanto del correo electrónico como de los «alias» para redireccionar al sitio web, google docs, blog, etc.

Se configura seguidamente (si se quiere solamente, ya que GMail provee de interface web y si está bien configurada con acceso desde el dominio propio, p.e. mail.fegor.com) la cuenta en Thunderbird (http://www.mozillamessaging.com/es-ES/thunderbird/) que es muy fácil teniendo los datos. Podemos ver tutoriales desde el propio Google Apps o incluso en el asistente de «Herramientas->Configuración de las cuentas…->Opciones sobre la cuenta->Añadir cuenta de correo electrónico» que es prácticamente automático introduciendo 3 campos de información: nombre, correo electrónico y contraseña.

download1 download2

Esta es una cuenta normal de GMail a través de Google Apps que nos ofrece un buzón de 7GB. más que suficientes para un uso normal de una pequeña empresa. José Grillo es el perito de la aseguradora que creará un expediente y sacará fotos de los siniestros (accidentes) y las enviará a través de su correo electrónico al sistema de gestión documental.

Una vez realizadas las operaciones sobre Google Apps podremos tener toda la infraestructura necesaria de la empresa en internet excepto el pequeño servidor con Alfresco que principalmente se usa dentro de la oficina y al que necesitaremos abrir hacia fuera el puerto 25 del correo saliente SMTP configurando el NAT (Network Address Translator) de nuestro router o modem ADSL. Para esto podemos informarnos en http://www.adsl4ever.com/

Algo de tuning con grandes cantidades de documentos (II)

Este es el segundo artículo sobre tuning cuando se encuentran muchos documentos dentro del mismo nivel o espacio de trabajo y es continuación del artículo anterior: http://fegor.blogspot.com/2011/03/algo-de-tuning-con-grandes-cantidades.html

Seguimos con la configuración de un sistema con 60 mil documentos (muy pequeños) en el el mismo nivel de espacio de trabajo. Se me olvidó decir que las pruebas se han realizado sobre una máquina virtual en Virtual Box.

Partimos de la última cadena de configuración que usamos en el artículo anterior añadiendo también los parámetros para poder conectar vía JMX con la utilidad jconsole que es la usada para monitorizar los arranques:

export IP_ADDR=»`hostname -i`»
export JAVA_OPTS=»-server»
export JAVA_OPTS=»${JAVA_OPTS} -Xms720m -Xmx720m -Xss128k -XX:NewSize=256m -XX:MaxPermSize=128m»
export JAVA_OPTS=»${JAVA_OPTS} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80″
export JAVA_OPTS=»${JAVA_OPTS} -Dalfresco.home=${ALF_HOME} -Dcom.sun.management.jmxremote»
export JAVA_OPTS=»${JAVA_OPTS} -Djava.rmi.server.hostname=${IP_ADDR}»

Seguidamente se «optimiza» más la propia configuración de Alfresco ECM añadiendo al fichero alfresco-global.properties lo siguiente:

# Desconectar auditorías
audit.enabled=false
audit.useNewConfig=false

# Conexiones máximas a la BD
db.pool.max=275

# Reducción de conexión (8 por defecto)
db.pool.idle=-1

# Tamaño de filas para consultas (10 por defecto)
hibernate.jdbc.fetch_size=150

# Límite de tiempo mínimo para indexar en background
lucene.maxAtomicTransformationTime=0

# Tiempo para el tracking
index.tracking.cronExpression=0/5 * * * * ?

Cortesía de las Alfresco Master Classes y Toni  de la Fuente.

Los resultados han sido los siguientes: (Tiempo de arranque: 565879 ms)

Ahora cambiamos en contentModel.xml en el tipo cm:content la propiedad «atomic» a «false», y remodificamos los parámetros de la JVM y volvermos a probar por última vez…

export JAVA_OPTS=»-server»
export JAVA_OPTS=»${JAVA_OPTS} -Xms720m -Xmx720m -Xss128k -XX:NewSize=128m -XX:MaxPermSize=128m»
export JAVA_OPTS=»${JAVA_OPTS} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=50″
export JAVA_OPTS=»${JAVA_OPTS} -XX:MaxGCPauseMillis=1500 -XX:GCTimeRatio=9″
export JAVA_OPTS=»${JAVA_OPTS} -Dalfresco.home=${ALF_HOME} -Dcom.sun.management.jmxremote»
export JAVA_OPTS=»${JAVA_OPTS} -Djava.rmi.server.hostname=${IP_ADDR}»

El resultado final es: (Tiempo de arranque: 520523 ms)

Bien, Pero ¿que pasa si queremos introducir 150 mil documentos o más por nivel? Para esto antes modificaremos los valores de ehcache-context.xml para que puedan almacenar valores muy elevados así como en el fichero ehcache-transactional.xml subiremos el número de elementos en memoria  (maxElementsInMemory=»150000″) y el parámetro de JVM «-XX:NewSize» lo ajustaremos según las necesidades.

Por ejemplo:

Fichero: ehcache-transactional.xml

[…]

     
        
     
     
        
     
     
         org.alfresco.cache.contentDataTransactionalCache
     
     
         150000
     
  
[…]

     
        
     
     
        
     
     
         org.alfresco.storeAndNodeIdTransactionalCache
     
     
         150000
     
  
[…]

Un script para crear documentos de prueba podría ser:

Fichero: crear_documentos.js
var doc;
for(var i=1; i<150000; i++)
{
    doc = companyhome.createFile(«doc-» + i + «.txt»);
    doc.content = «Texto-» + i + «. Esto es una prueba de creación de documento para comprobar la capacidad de indexación, recuperación, etc. ABCDEFGHYJKLMNÑOPQRSTUVWXYZ0123456789 ABCDEFGHYJKLMNÑOPQRSTUVWXYZ0123456789 «;
    doc.save();
}

El principal problema que nos encontramos aquí es que al crearse objetos dentro de un bucle, estos no son liberados tan rápidamente y pasan a la parte de «CMS Old Gen» de la heap que es la que recibe más carga por lo que habrá que ajustar tanto los tiempos de pasadas del GC como el tamaño de la memoria «a corto plazo» o «New Gen», esto puede establecerse con el parámetro -XX:NewSize.

También hay que tener en cuenta la configuración y optimización de MySQL.

Finalmente, una cadena de arranque para la JVM que es bastante útil en el caso de cargas masivas para plataformas 32 bit (para 64 bit se puede incrementar la heap al doble o al triple) sería:

export IP_ADDR=»`hostname -i`»
export JAVA_OPTS=»-server»
export JAVA_OPTS=»${JAVA_OPTS} -Xms1384m -Xmx1384m -Xss128k -XX:MaxPermSize=128m -XX:NewRatio=2″
export JAVA_OPTS=»${JAVA_OPTS} -XX:+OptimizeStringConcat -XX:+UseLargePages -XX:+UseFastAccessorMethods -XX:+AggressiveOpts -XX:-UseParallelGC»
export JAVA_OPTS=»${JAVA_OPTS} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80″
export JAVA_OPTS=»${JAVA_OPTS} -XX:GCTimeRatio=9″
export JAVA_OPTS=»${JAVA_OPTS} -Dalfresco.home=${ALF_HOME} -Dcom.sun.management.jmxremote»
export JAVA_OPTS=»${JAVA_OPTS} -Djava.rmi.server.hostname=${IP_ADDR}»
export JAVA_OPTS=»${JAVA_OPTS} -Djava.io.tmpdir=${ALF_HOME}/tomcat/temp»

La memoria asignada a la máquina virtual (Virtual Box) es de 1GB. y la de la JVM es más de 1GB. (1385 MB.) por lo que esta hará «swaping» a disco.

En resumen, el tema de optimización de la JVM y Alfresco ECM con cargas masivas de documentos o creación de estos y más en el mismo nivel no es trivial pero siempre se puede «forzar» para que al menos realice el trabajo inicial y posteriormente ir descargando los espacios de trabajo en estructuras de más profundidad para disminuir la carga en memoria de tantas referencias.

Algo de tuning con grandes cantidades de documentos (I)

Cuando se tienen grandes cantidades de documentos a un mismo nivel de espacio de trabajo, del orden de 60000 por ejemplo, a la hora de indexar completamente o de requerir un listado, la JVM hace un uso intensivo de la memoria, sobre todo de la heap y en concreto de la llamada «Old Gen» (o «Tenured Gen», según casos) ya que son bucles donde se crean muchos objetos que tardan en ser liberados.

Las pruebas se han realizado en una máquina virtual con 1GB de RAM con CentOS 5 (i386), JVM 1.6.0_22 y Alfresco Enterprise 3.3.4

Todos los arranques se hacen borrando previamente el directorio «lucene-indexes» y estableciendo en alfresco-global.properties la propiedad «index.recovery.mode=FULL».

La primera prueba es arrancar con los parámetros normales que se suelen poner:

export JAVA_OPTS=»-server»
export JAVA_OPTS=»${JAVA_OPTS} -Xms128m -Xmx512m -XX:MaxPermSize=256m»

El resultado es el siguiente: (Tiempo de arranque: 630614 ms)

Se pueden observar las caídas en las gráficas cuando es lanzado el recolector de basura…

Además, al poner tantos elementos obtenemos avisos de la ehcache al sobrepasar los elementos posibles, bien, usamos la configuración que explico en el artículo http://fegor.blogspot.com/2011/01/avisos-de-alfresco-sobre-saturacion-de.html para evitar estos avisos y poder cargar más en la caché.

Además vamos a mejorar los parámetros de memoria, por un lado comprobamos que la «Perm Gen» está demasiado dimensionada con lo que la vamos a acortar para tener más posibilidades de asignarla a la heap. Además usaremos un menor tamaño de «New Gen» para adaptar mejor el tamaño a la parte «Tenured Gen», y dejaremos el tamaño de heap como está…

export JAVA_OPTS=»-server»
export JAVA_OPTS=»${JAVA_OPTS} -Xms512m -Xmx512m -XX:NewGen=128m -XX:MaxPermSize=128m»

 El resultado mientras se arranca y reindexa, estando al rededor del 70% de reindexación completa es el siguiente: (Tiempo de arranque: 702462 ms)

Como observamos, no se aprecian grandes diferencias con respecto a la primera configuración, simplemente hemos eliminado los avisos de llenado de la ehcache pero ha tardado más en arrancar. Bien, sigamos, ahora vamos a realizar una configuración más «agresiva» usando los siguientes parámetros:

export JAVA_OPTS=»-server»
export JAVA_OPTS=»${JAVA_OPTS} -Xms640m -Xmx640m -Xss128k -XX:NewSize=320m -XX:MaxPermSize=128m»
export JAVA_OPTS=»${JAVA_OPTS} XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80″

Este es el resultado:(Tiempo de arranque: 670572 ms)

Se observa un mejor comportamiento de la memoria, si bien, la parte de «Old Gen» está algo elevada. También se ha recogido la muestra mientras indexaba sobre el 70%.

Por último vamos a retocar un poco los parámetros de la JVM y eliminar la modificación sobre el fichero hibernate-context.xml que se ha seguido en el artículo anterior.

Los parámetros establecidos quedan como:

export JAVA_OPTS=»-server»
export JAVA_OPTS=»${JAVA_OPTS} -Xms720m -Xmx720m -Xss128k -XX:NewSize=256m -XX:MaxPermSize=128m»
export JAVA_OPTS=»${JAVA_OPTS} -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:CMSInitiatingOccupancyFraction=80″

Y el resultado es: (Tiempo de arranque: 568476 ms)

En este último caso, la reindexación y arranque ha tardado menos tiempo si bien la memoria parece que está más aprovechada ya que se observa una mayor carga de instancias y ocupación de esta sin llegar en ningún momento a colapsarse.

Como se observa, existen múltiples configuraciones y aunque a priori parezca que no haya grandes diferencias, en muchas ocasiones puede optimizar el trabajo tanto a la hora de reindexar muchos documentos como de respuesta hacia el interface gráfico.

También se observa que Alfresco ECM cada vez se comporta mejor con grandes cantidades de documentos (obsérvese que se han creado con un tamaño pequeño y tipo texto solamente) dentro del mismo espacio de trabajo.

En la segunda parte se tocarán no solo parámetros de la JVM sino también de Alfresco ECM para acortar estos tiempos de arranque así como mejorar la gestión de la memoria.

Para obtener más información se pueden consultar los siguientes enlaces:

http://wiki.alfresco.com/wiki/JVM_Tuning#Maximum_JVM_Heap_Size_32.2F64bit
http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
http://fegor.blogspot.com/2011/01/avisos-de-alfresco-sobre-saturacion-de.html

Forzar el HOST en JMX (RMI) para Alfresco ECM

En algunas ocasiones necesitamos forzar el HOST para las conexiones JMX vía RMI de Alfresco.

En la configuración (alfresco-shared.properties) encontramos dos propiedades que son las siguientes:

alfresco.rmi.services.port=50500
alfresco.rmi.services.host=localhost

Pero en realidad hacen referencia a la parte de «virtualización» de servidor de Alfresco y no de los servicios que este proporciona. Para ello hay que recurrir a una propiedad en la llamada a la JVM que es java.rmi.server.hostname

En efecto, si necesitamos forzar una IP determinada de «escucha» para conectar alguna consola tipo jconsole, VisualVM, etc. necesitaremos hacer uso de esta variable.

Lo mejor es ponerla en el script de arranque de Alfresco, por ejemplo en Linux, esta sería una forma:

[…]
export IP_ADDR=»`hostname -i`»
export JAVA_OPTS=»-Xms256m -Xmx524m -Xss128k -XX:PermSize=196m -XX:MaxPermSize=196m -server»
export JAVA_OPTS=»${JAVA_OPTS} -Dalfresco.home=${ALF_HOME} -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=${IP_ADDR} -Djava.rmi.server.port=50500″
[…]

Ahora solo queda arrancar y probar que se está listando correctamente el puerto y desde la dirección IP adecuada con:

netstat -putan | grep java

Y el resultado sería algo así:

tcp        0      0 ::ffff:192.168.1.112:50500  :::*                        LISTEN      5560/java          
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      5560/java          
tcp        0      0 :::50501                    :::*                        LISTEN      5560/java          
tcp        0      0 :::50502                    :::*                        LISTEN      5560/java          
tcp        0      0 :::55142                    :::*                        LISTEN      5560/java          
tcp        0      0 :::50503                    :::*                        LISTEN      5560/java          
tcp        0      0 :::50504                    :::*                        LISTEN      5560/java          
tcp        0      0 :::8009                     :::*                        LISTEN      5560/java          
tcp        0      0 :::50505                    :::*                        LISTEN      5560/java          
tcp        0      0 :::50506                    :::*                        LISTEN      5560/java          
tcp        0      0 :::50507                    :::*                        LISTEN      5560/java          
tcp        0      0 :::139                      :::*                        LISTEN      5560/java          
tcp        0      0 :::50508                    :::*                        LISTEN      5560/java          
tcp        0      0 :::53453                    :::*                        LISTEN      5560/java          
tcp        0      0 :::8080                     :::*                        LISTEN      5560/java          
tcp        0      0 :::41715                    :::*                        LISTEN      5560/java          
tcp        0      0 :::38324                    :::*                        LISTEN      5560/java          
tcp        0      0 :::445                      :::*                        LISTEN      5560/java          
tcp        0      0 ::ffff:127.0.0.1:42540      ::ffff:127.0.0.1:3306       ESTABLISHED 5560/java          
tcp        0      0 ::ffff:127.0.0.1:42541      ::ffff:127.0.0.1:3306       ESTABLISHED 5560/java          
tcp        0      0 ::ffff:127.0.0.1:42542      ::ffff:127.0.0.1:3306       ESTABLISHED 5560/java          
tcp        0      0 ::ffff:127.0.0.1:42543      ::ffff:127.0.0.1:3306       ESTABLISHED 5560/java          
tcp        0      0 ::ffff:127.0.0.1:42544      ::ffff:127.0.0.1:3306       ESTABLISHED 5560/java          
tcp        0      0 ::ffff:127.0.0.1:42545      ::ffff:127.0.0.1:3306       ESTABLISHED 5560/java          
tcp        0      0 ::ffff:127.0.0.1:42546      ::ffff:127.0.0.1:3306       ESTABLISHED 5560/java          
tcp        0      0 ::ffff:127.0.0.1:42547      ::ffff:127.0.0.1:3306       ESTABLISHED 5560/java          
tcp        0      0 ::ffff:192.168.1.112:50508  ::ffff:192.168.1.103:53427  ESTABLISHED 5560/java          
tcp        0      0 ::ffff:192.168.1.112:50508  ::ffff:192.168.1.103:53428  ESTABLISHED 5560/java          
udp        0      0 :::137                      :::*                                    5560/java          
udp        0      0 :::7500                     :::*                                    5560/java          
udp        0      0 :::7500                     :::*                                    5560/java

Crear módulos AMP para share (Alfresco)

Mi amigo Toni de la Fuente ha modificado un componente en WebScript (repository) para visualizar todas las consolas de que disponemos en la versión Enterprise de Alfresco: http://blyx.com/2011/03/07/anade-mas-utilidades-de-administracion-en-alfresco-share/ y ha creado un proyecto en google code a partir de este en: http://code.google.com/p/alfresco-useful-admin-links/

Para instalar este WebScript solo hay que copiarlo en la ruta indicada directamente (ver información en su proyecto) o bien, también se puede crear un módulo AMP para que pueda ser instalado dentro del fichero share.war

Bien, eso es lo que vamos a hacer, crearemos un fichero AMP con los ficheros de WebScript para que pueda dejarlo para descarga en su proyecto.

La creación de módulos para «share» de Alfresco es la misma que cuando se crean módulos para el «explorer». Evidentemente cambian las localizaciones, dónde vamos a dejar los ficheros y que en este caso la mayoría de las veces serán archivos relacionados con WebScripts más que clases Java.

Si tenemos el SDK de Alfresco se puede realizar una copia de su «SDK Basic AMP» y a partir de ahí continuar, si no es así se puede crear un proyecto Java en Eclipse y dotarlo de la siguiente estructura:


En build/dist se creará el fichero de módulo, este se generará a partir de un fichero .jar generado, a su vez, a partir de lo que se tenga en el directorio source; así como también de los ficheros que hay en el directorio config.

Dentro del directorio config podemos crear la estructura misma que usa Alfresco (share) para almacenar los componentes y en concreto los de la consola para el administrador; y que está en alfresco/site-webscripts/org/alfresco/components/console

Lo más importante aquí es tener un buen fichero de ant para que pueda ser «compilado» todo correctamente.

Mi fichero ant para esto (build.xml) es el siguiente:

   
   
   

   
   
   
   

   
       
       
       
   

   
       
       
       
   

   
       
   

   
       
       
           
               
               
               
           
       
   

   
       
           
       
   

   
       
           
           
           
           
               
               
               
               
               
           
           
       
   

Una vez que todos los componentes están en su sitio solo hay que ejecutar el archivo build.xml (botón derecho encima del fichero build.xml en Eclipse y elegir «Run as…->Ant Build») y comprobar el resultado.

 ¿Ventajas de tener un módulo?, creo que están claras, mejora la administración y mantenimiento del producto, mayor facilidad para instalación, etc. Por supuesto es lo aconsejado por Alfresco.

¿Desventajas?, pue sí, como con todo, también las hay, la más importante es que copiando los ficheros directamente en el despliegue de la aplicación solo hay que «refrescar» el «inventario» de WebScripts para tenerlos disponibles y en caliente, mientras que de la otra forma aunque no paremos el servidor o la aplicación share, al modificar el .war se autodesplegará produciendo al menos que tengámos que volver a autenticarnos, siempre y cuando no tengamos activado el Single Sign On (SSO)… 😉

Resetear contraseñas

Entrar como root en Linux:

En lilo:
1. Teclear: linux single
2. Cambiar la contraseña con: passwd
En grub:
1. Pulsar E en Grub.
2. Añadir a la línea «kernel…» lo siguiente: init=/bin/sh Single
3. Pulsar B para arrancar.
4. Remontar en lectura/escritura: mount / -o rw,remount

Cambiar password del root de MySQL:
1. Parar MySQL
2. Ejecutar MySQL como: mysqld --skip-grant-tables --user=root &

3. Entrar en la bd mysql: mysql mysql

4. UPDATE user SET Password=PASSWORD('clavenueva') WHERE user='root';
  flush privileges;
  exit; 
5. Arrancar MySQL

Ocultar las «Desktop Actions» en Alfresco

En algunas empresas es necesario quitar las llamadas «desktop actions» o acciones de escritorio que se visualizan en los recursos compartidos cuando se activa el protocolo CIFS. Estas acciones son en algunas ocasiones muy útiles pero en otras, además de producir un mal conteo de ficheros en las carpetas, en muchas otras ocasiones lo único que pueden derivar es en la «contaminación» de las propias acciones por virus ya que son programas ejecutables.

Para eliminar/ocultar estas acciones se puede proceder como sigue:

Copiar el fichero:

${ALF_HOME}/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/fileServers/default/file-servers-context.xml

En:

${ALF_HOME}/tomcat/shared/classes/alfresco/extension/subsystems/fileServers/default/default

Y comentar las siguientes líneas:


—- file-servers-context.xml —-

[…]
  
<!–
  
      __Alfresco.url
  
–>
[…]
<!–
  
     
        
            alfresco/desktop/Alfresco.exe
        
     
  
  
     
        
           
               CheckInOut
           
           
               __CheckInOut.exe
           
        
        
           
               JavaScriptURL
           
           
               __ShowDetails.exe
           
           
               alfresco/desktop/showDetails.js
           
           
               anyFiles
           
           
               copyToTarget
           
        
–>
        
         <!–
           
            Echo __AlfrescoEcho.exe
            <property
            name=»name»> URL
            __AlfrescoURL.exe <bean
            class=»org.alfresco.filesys.repo.desk.CmdLineDesktopAction»>
            CmdLine __AlfrescoCmd.exe
           
            JavaScript
            __AlfrescoScript.exe
            alfresco/desktop/dumpRequest.js
            anyFiles, multiplePaths, allowNoParams
            confirm, copyToTarget
         –>
<!–
     
  
–>
[…]

—- file-servers-context.xml —-

${ALF_HOME} hace referencia al «path» o directorio donde está instalado Alfresco.

Bajar SVN de Alfresco con Subclipse a través de un proxy

En el artículo sobre la compilación de la versión Community de Alfresco bajada desde del SVN oficial:

Hay un caso en el que hay que configurar algo más; cuando estemos en un sitio donde haya un proxy por medio, habrá que configurar el SVN para que pueda salir a través de dicho proxy.

Para configurarlo hay que descomentar las líneas de proxy necesarias así como la autenticación utilizada, en mi caso he usado solamente 3 de dichas líneas. El fichero de configuración se llama «servers» y se encuentra en el perfil del usuario o dentro del directorio Subclipse respectivo.

Por ejemplo, en una máquina Windows XP podríamos encontrarlo en:

C:Documents and SettingsfegorApplication DataSubversion

En una máquina con Linux generalmente estará dentro del «home» del usuario, como:

/home/fegor/.subversion

 

Y las líneas principales para hacerlo funcionar:

http-proxy-exceptions = 127.0.0.1, *.intranet.fegor.com
http-proxy-host = proxyserver.fegor.com
http-proxy-port = 8080

Además, hay que tener en cuenta que es necesario bajarse un cliente de SVN en el caso de windows, como puede ser Slik o TortoiseSVN:

http://www.sliksvn.com/en/download/
http://tortoisesvn.net/downloads.html

Así mismo, subclipse utiliza JavaHL (JNI) por defecto, por tanto, si es una distribución Linux/Ubuntu tendrémos que cargar lal librerías correspondientes, como:

sudo apt-get install libsvn-java

Y poner la referencia (pe. -Djava.library.path=/usr/lib/jni) en eclipse.ini
 
Un ejemplo:
-showsplash
org.eclipse.platform
-framework
plugins/org.eclipse.osgi_3.4.0.v20080605-1900.jar
-vmargs
-Djava.library.path=/usr/lib/jni
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m
-XX:MaxPermSize=256m


		

SSO con Active Directory Kerberos en Win2k3 para Alfresco 3.4 en CentOS 5.5

El escenario propuesto es el siguiente:

Servidor de Alfresco:
Linux: CentOS 5.5 (i686)
Alfresco: 3.4.0 Enterprise
Tomcat: 6.0.29
MySQL: 5.0.77 (i686)
JVM (Sun): 1.6.0_22-b04 (32 bits)

SAMBA: 3.0.33
Nombre de la máquina: alfpru

Servidor PDC (Primario del dominio):
Windows: 2003 Server SP1
Nivel funcional: Windows Server 2003
Active Directory: in2pruebas
Nombre de la máquina: winsrv

Primero hay que preparar el Active Directory para Kerberos, y sobre todo para que funcione la aplicación share de Alfresco.

Si se tiene alguna duda se puede consultar la siguiente dirección: http://wiki.alfresco.com/wiki/Alfresco_Authentication_Subsystems#Kerberos

Se crean en Active Directory dos usuarios:

Nombre: Alfresco HTTP
Usuario: alfrescohttp
Passwd: laquesea

Nombre: Alfresco CIFS
Usuario: alfrescocifs
Passwd: laquesea

En ambos, después de la contraseña, se desmarca la casilla de «El usuario debe cambiar la contraseña en el siguiente inicio de sesión», y se marcan las casillas «La contraseña nunca caduca» y «No pedir la autenticación Kerberos previa». Así mismo, si estuviera marcada, hay que desmarcar la casilla «Usar tipos de cifrado DES para esta cuenta». Estas casillas se encuentran en las propiedades del usuario dentro de «Usuarios y equipos de Active Directory», en la pestaña «Cuenta».

Bien, ahora hay que usar un comando que está dentro del Kit de Recursos de Windows 2003 Server, dentro de «Utilidades de soporte». Este comando se llama ktpass.exe y es el que genera las tablas de claves para poder identificar el servicio.

Aquí es donde me he encontrado problemas, las mayores dificultades para configurar Alfresco con AD-Kerberos está en la generación de estos ficheros, ya que existen varias versiones de la utilidad ktpass.exe. En mi caso tengo dos comandos ktpass.exe, uno del 24/03/2005 y otro del 17/02/2007. Finalmente he creado los ficheros con la última versión.

Los comandos son:

ktpass -princ cifs/alfpru.in2pruebas@IN2PRUEBAS -pass elquesea -mapuser IN2PRUEBASalfrescocifs -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -out c:tempalfrescocifs.keytab

ktpass -princ HTTP/alfpru.in2pruebas@IN2PRUEBAS -pass elquesea -mapuser IN2PRUEBASalfrescohttp -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -out c:tempalfrescohttp.keytab

Luego hay que crearlos como servicios dentro del Active Directory como sigue:
setspn -a cifs/alfpru alfrescocifs
setspn -a cifs/alfpru.in2pruebas alfrescocifs

setspn -a HTTP/alfpru alfrescohttp
setspn -a HTTP/alfpru.in2pruebas alfrescohttp

Y se copian los ficheros (alfrescocifs.keytab y alfrescohttp.keytab) creados en la máquina Linux en, por ejemplo, /etc/alfresco.

Ahora, en la máquina Linux:

Seguidamente vamos a unir la máquina Linux al dominio de Windows 2003 (PDC) ya que si no, sería imposible establecer una «confianza» para realizar la autenticación para que los administradores de Windows tengan constancia de esta máquina, además este proceso también modifica el DNS de Windows 2003 Server para tener acceso vía TCP/IP aunque como bien me ha señalado iblanco no es necesario este paso para realizar simplemente la autenticación con Active Directory Kerberos.

Para ello se usa SAMBA, se instala:

yum install samba

…se configura el fichero /etc/samba/smb.conf como:

[global]
    workgroup = in2pruebas
    server string = Samba Server Version %v
    password server = in2pruebas
    realm = IN2PRUEBAS
    security = ads
    idmap uid = 10000-20000
    idmap gid = 10000-20000
    winbind separator = +
    template shell = /bin/false
    winbind use default domain = false
    winbind offline logon = false
    security = ADS

…se arranca:

service smb start

…se utiliza el comando «net» para unir la máquina al dominio de la seguiente forma:

net ads join –S winsrv.in2pruebas –n alfpru –U Administrador

…y ya se puede parar el servicio de SAMBA:
service smb stop

(Nota: Hay que repasar el fichero /etc/hosts y que las IPs apunten a los host y dominio correspondiente)

Se configura el fichero /etc/krb5.conf como:
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log
[libdefaults]
 default_realm = IN2PRUEBAS
 default_tkt_enctypes = rc4-hmac
 default_tgs_enctypes = rc4-hmac
 dns_lookup_realm = false
 dns_lookup_kdc = true
[realms]
 IN2PRUEBAS = {
  kdc = winsrv.in2pruebas:88
  admin_server = winwrv.in2pruebas
 }
[domain_realm]
 .winsrv.in2pruebas = IN2PRUEBAS
 winsrv.in2pruebas  = IN2PRUEBAS
[appdefaults]
  forward=true
  forwardable=true
  proxiable=true

Dentro de la máquina virtual (JVM de Sun), concretamente en la parte de la JRE y en una ruta parecida a la siguiente: /usr/java/jre/lib/security existen dos ficheros que hay que configurar. El primero es java.login.config y se configurará como sigue:
Alfresco {
    com.sun.security.auth.module.Krb5LoginModule sufficient;
};
AlfrescoCIFS {
    com.sun.security.auth.module.Krb5LoginModule required
    storeKey=true
    useKeyTab=true
    keyTab=»/etc/alfresco/alfrescocifs.keytab»
    principal=»cifs/alfpru.in2pruebas»;
};
AlfrescoHTTP {
    com.sun.security.auth.module.Krb5LoginModule required
    storeKey=true
    useKeyTab=true
    keyTab=»/etc/alfresco/alfrescohttp.keytab»
    principal=»HTTP/alfpru.in2pruebas»;
};
ShareHTTP {
    com.sun.security.auth.module.Krb5LoginModule required
    storeKey=true
    useKeyTab=true
    keyTab=»/etc/alfresco/alfrescohttp.keytab»
    principal=»HTTP/alfpru.in2pruebas»;
};
com.sun.net.ssl.client {
    com.sun.security.auth.module.Krb5LoginModule sufficient;
};
other {
    com.sun.security.auth.module.Krb5LoginModule sufficient;
};

Y el fichero java.security también hay que editarlo para indicarle donde está el fichero de configuración anterior, en la línea siguiente:

login.config.url.1=file:/usr/java/jre/lib/security/java.login.config

Como se observa, en el fichero java.login.config se establecen a su vez los directorios donde se encuentran los ficheros keytab.

Para la instalación de Alfresco se ha utilizado el fichero alfresco-enterprise-3.4.0.zip, se descomprime y se copian los directorios que hay dentro de web-server de forma recursiva dentro del servidor de aplicaciones que ya tengamos instalado.
Por ejemplo:

cd /opt
make alfinst
cd alfinst
unzip /home/fegor/Downloads/alfresco-enterprise-3.4.0.zip
cp -rf webserver/conf /opt/alfresco_340/tomcat
cp -rf webserver/lib /opt/alfresco_340/tomcat
cp -rf webserver/shared /opt/alfresco_340/tomcat
cp -rf webserver/webapps /opt/alfresco_340/tomcat

Se crea la base de datos:

mysql -u root -p

CREATE DATABASE alfresco340;
GRANT ALL ON alfresco340.* to ‘alfresco’@’localhost’ identified by ‘alfresco’;
FLUSH PRIVILEGES;
EXIT

Se realiza la configuración global o general de Alfresco en el fichero alfresco-global.properties:

dir.root=/opt/alfresco_340/repositorio
db.name=alfresco340
db.username=alfresco
db.password=alfresco
db.host=localhost
db.port=3306
db.driver=org.gjt.mm.mysql.Driver
db.url=jdbc:mysql://${db.host}:${db.port}/${db.name}
authentication.chain=kerberos:kerberos

 Lo primero es comentar la línea «authentication.chain» y arrancar la instancia de Alfresco para comprobar su funcionamiento y su despliegue. Una vez desplegado ya podemos usar el subsistema «Authentication» para poder establecer la configuración de Kerberos.

Hay que copiar desde webapps/alfresco/WEB-INF/classes/alfresco/subsystems/Authentication/kerberos a shared/classes/alfresco/extension/subsystems/Authentication/kerberos/, quedando finalmente como: shared/classes/alfresco/extension/subsystems/Authentication/kerberos/kerberos y dentro habrá cuatro ficheros que son:
kerberos-authentication-context.xml
kerberos-authentication.properties
kerberos-filter-context.xml
kerberos-filter.properties

De estos, los ficheros con extensión «properties» son los que hay que configurar como sigue:

El fichero kerberos-authentication.properties:

kerberos.authentication.realm=IN2PRUEBAS
kerberos.authentication.user.configEntryName=Alfresco
kerberos.authentication.defaultAdministratorUserNames=Administrador
kerberos.authentication.cifs.configEntryName=AlfrescoCIFS
kerberos.authentication.cifs.password=laquesea
kerberos.authentication.authenticateCIFS=true

El fichero kerberos-filter.properties:
kerberos.authentication.http.configEntryName=AlfrescoHTTP
kerberos.authentication.http.password=laquesea
kerberos.authentication.sso.enabled=true
kerberos.authentication.browser.ticketLogons=true

Ahora, para tener acceso a CIFS vía Kerberos hay que copiar también la rama webapps/alfresco/WEB-INF/classes/alfresco/subsystems/fileServers/default a shared/classes/alfresco/extension/subsystems/fileServers/default/default (igualmente debe haber dos niveles de directorio llamados default), y se modifica el fichero file-servers.properties como sigue:
filesystem.name=alfpru
filesystem.acl.global.defaultAccessLevel=
cifs.enabled=true
cifs.serverName=alfpru
cifs.domain=in2pruebas
cifs.broadcast=255.255.255.255
cifs.bindto=
cifs.ipv6.enabled=false
cifs.hostannounce=true
cifs.disableNIO=false
cifs.disableNativeCode=false
cifs.sessionTimeout=900
cifs.urlfile.prefix=http://alfpru
cifs.tcpipSMB.port=445
cifs.netBIOSSMB.sessionPort=139
cifs.netBIOSSMB.namePort=137
cifs.netBIOSSMB.datagramPort=138
cifs.WINS.autoDetectEnabled=false
cifs.WINS.primary=1.2.3.4
cifs.WINS.secondary=5.6.7.8


Además recomiendo desconectar tanto FTP como NFS dentro del mismo fichero como:

ftp.enabled=false
nfs.enabled=false

Ya solo queda la configuración de la parte «share», esta se encuentra en: shared/classes/alfresco/extension/web-extension en el fichero share-config-custom.xml.sample, hay que renombrar este fichero como share-config-custom.xml y configurar la sección «KerberosDisabled», eliminando la palabra Disabled y descomentando el bloque que viene a continuación con la condición «Remote». Ambos bloques se configuran como sigue:
  
  
  
     
         <!–
            Password for HTTP service account.
            The account name *must* be built from the HTTP server name, in the format :
               HTTP/@
            (NB this is because the web browser requests an ST for the
            HTTP/ principal in the current realm, so if we’re to decode
            that ST, it has to match.)
         –>
         Poli1970
         <!–
            Kerberos realm and KDC address.
         –>
         IN2PRUEBAS
         <!–
            Service Principal Name to use on the repository tier.
            This must be like: HTTP/host.name@REALM
         –>
         HTTP/alfpru.in2pruebas@IN2PRUEBAS
         <!–
            JAAS login configuration entry name.
         –>
         ShareHTTP
     
  

   <!–
        Overriding endpoints to reference an Alfresco server with external SSO enabled
        NOTE: If utilising a load balancer between web-tier and repository cluster, the «sticky
              sessions» feature of your load balancer must be used.
        NOTE: If alfresco server location is not localhost:8080 then also combine changes from the
              «example port config» section below.
        *Optional* keystore contains SSL client certificate + trusted CAs.
        Used to authenticate share to an external SSO system such as CAS
        Remove the keystore section if not required i.e. for NTLM.
       
        NOTE: For Kerberos SSO rename the «KerberosDisabled» condition above to «Kerberos»
   –>
  
     
        
             alfresco/web-extension/alfresco-system.p12
             pkcs12
             alfresco-system
        
        
        
            alfrescoCookie
            Alfresco Connector
            Connects to an Alfresco instance using cookie-based authentication
            org.springframework.extensions.webscripts.connector.AlfrescoConnector
        
        
        
            alfresco
            Alfresco – user access
            Access to Alfresco Repository WebScripts that require user authentication
            alfrescoCookie
            http://localhost:8080/alfresco/wcs
            user
            true
        
     
  

Una parte importante para poder realizar SSO Kerberos con Alfresco Share, es que hay que darle al usuario alfrescohttp la posibilidad de obtener la delegación de permisos por parte del otro servicio, en este caso, Alfresco (repositorio). Esto se obtiene dentro de Usuarios y equipos de Active Directory, en la rama Users y encima del usuario «Alfresco HTTP» pulsamos botón derecho y propiedades.

Aquí, en la pestaña «Delegación» hay que activar «Confiar en este usuario para la delegación a cualquier servicio (solo Kerberos)».

Si esta pestaña no está visible habrá que «elevar el nivel funcional del dominio…». Esto se consigue en la raíz del dominio (en nuestro caso in2pruebas de «Usuarios y equipos de Active Directory», se pulsa botón derecho del ratón y se selecciona «Elevar el nivel funcional del dominio»). Se encuentra más información en: http://technet.microsoft.com/en-us/library/cc757194%28WS.10%29.aspx

Para poder depurar correctamente, recomiendo usar las siguientes líneas en los ficheros log4j.properties:

log4j.logger.org.alfresco.repo.security=debug
log4j.logger.org.alfresco.web.app.servlet.KerberosAuthenticationFilter=debug
log4j.logger.org.alfresco.web.site.servlet.SSOAuthenticationFilter=debug
log4j.logger.org.alfresco.web.app.servlet.WebScriptsSSOAuthenticationFilter=debug

Al igual, también se puede activar la depuración de Kerberos a nivel de la JVM añadiendo los parámetros a la línea que ya se tenga de JAVA_OPTS como:
export JAVA_OPTS=»${JAVA_OPTS} -Dsun.security.krb5.debug=true -Dsun.security.jgss.debug=true»

Bien, ahora vamos a la parte cliente, el Windows XP que estemos usando, el Linux o el mismo Windows 2003 Server que puede servir para probar al final si todo funciona correctamente desde el navegador Internet Explorer o Firefox.

En el caso de Internet Explorer hay que indicarle en Herramientas->Opciones de Internet->Seguridad->Intranet Local la URL a la que vamos a acceder para que funcione el SSO. En este caso se ha incluido http://alfpru.in2pruebas que es el servidor donde está instalado Alfresco. Además en Herramientas->Opciones de Internet->Seguridad->Nivel Personalizado hay que comprobar que está seleccionada la opción «Inicio de sesión automático sólo en la zona de Intranet» en «Autenticación de Usuario».

Si no tenémos infraestructura suficiente usando DNS para resolución de nombres, podemos usar el fichero hosts de C:WindowsSystem32driversetc e incluir la línea «IP host host.dominio», por ejemplo:
192.168.1.12   alfpru   alfpru.in2pruebas

Para el caso de Firefox, hay que poner en este (en el campo URL) about:config y confirmar que deseamos entrar en la configuración. Buscamos las siguientes opciones y le damos los valores  aquí señalados o los que correspondan según la configuración de dominio del Active Directory:
network.negotiate-auth.delegation-uris = http://alfpru.in2pruebas:8080/share
network.negotiate-auth.trusted-uris = http://alfpru.in2pruebas:8080/alfresco
network.negotiate-auth.using-native-gsslib = false

(Nota: Actualmente en la versión 3.4.0, el SSO en Alfresco no funciona con Firefox en Linux; tampoco Alfresco Share con máquinas JVM de IBM).

Ya solo queda realizar los ajustes que se necesiten, poner los nombres correctos según la configuración de cada uno y probar su funcionamiento. 

Más información de como configurar este escenario en:
http://wiki.alfresco.com/wiki/Alfresco_Authentication_Subsystems#Kerberos
http://www.bdat.com/documentos/samba/html/domain-member.html
http://technet.microsoft.com/en-us/library/cc757194%28WS.10%29.aspx