OpenDJ (LDAP Server) and how to configure with Alfresco for your best demos

OpenDJ is a fork of the former Sun OpenDS. Is a free and Open Source LDAPv3 server. It is not under our Alfresco Supported Platforms umbrella but it works fine for demo porpuses and is very easy to install, configure and maintain. Since OpenDJ is a Java application you can run it in Linux, Mac or “even” Windows ūüėČ

Lets see how how to start with OpenDJ from scratch.

  • Installation and configuration of OpenDJ:

Download the application downloader and launcher here: http://download.forgerock.org/downloads/opendj/20130305020001/install/QuickSetup.jnlp (you may also download the entire package from here http://www.forgerock.org/opendj.html  but I think with QuickSetup is the easier way)

Download this initial LDIF file with demo users and groups for the first population of our new brand LDAP server.

You must have installed Java in your system in order to execute file QuickSetup.jnlp. Then double click to open it. And follow as in the video:

Now lets configure our Alfresco Server (I did all this steps with Alfresco Enterprise 4.1.3 but should be valid for any 4.X version).

  • ¬†Alfresco configuration:

[bash]
# vi tomcat/shared/classes/alfresco-global.properties
[/bash]

Add next line with our new authentication system before the default chain.

[bash]
authentication.chain=ldap1:ldap,alfrescoNtlm1:alfrescoNtlm
[/bash]

Create the needed directory for our new settings:

[bash]
# mkdir -p tomcat/shared/classes/alfresco/extension/subsystems/Authentication/ldap/ldap1
[/bash]

Create your own config file, set as your needs:

[bash]
vi tomcat/shared/classes/alfresco/extension/subsystems/Authentication/ldap/ldap1/ldap-authentication.properties
[/bash]

File:

[bash]
ldap.authentication.active=true
ldap.authentication.allowGuestLogin=false
ldap.authentication.userNameFormat=uid=%s,ou=people,dc=alfresco,dc=com
ldap.authentication.java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
ldap.authentication.java.naming.provider.url=ldap://localhost:1389
ldap.authentication.java.naming.security.authentication=simple
ldap.authentication.escapeCommasInBind=false
ldap.authentication.escapeCommasInUid=false
ldap.authentication.defaultAdministratorUserNames=
ldap.synchronization.active=false
ldap.synchronization.java.naming.security.authentication=simple
ldap.synchronization.java.naming.security.principal=cn\=Directory Manager
ldap.synchronization.java.naming.security.credentials=secret
ldap.synchronization.queryBatchSize=0
ldap.synchronization.attributeBatchSize=0
ldap.synchronization.groupQuery=(objectclass\=groupOfNames)
ldap.synchronization.groupDifferentialQuery=(&(objectclass\=groupOfNames)(!(modifyTimestamp<\={0})))
ldap.synchronization.personQuery=(objectclass\=inetOrgPerson)
ldap.synchronization.personDifferentialQuery=(&(objectclass\=inetOrgPerson)(!(modifyTimestamp<\={0})))
ldap.synchronization.groupSearchBase=ou\=groups,dc\=alfresco,dc\=com
ldap.synchronization.userSearchBase=ou\=people,dc\=alfresco,dc\=com
ldap.synchronization.modifyTimestampAttributeName=modifyTimestamp
ldap.synchronization.timestampFormat=yyyyMMddHHmmss’Z’
ldap.synchronization.userIdAttributeName=uid
ldap.synchronization.userFirstNameAttributeName=givenName
ldap.synchronization.userLastNameAttributeName=sn
ldap.synchronization.userEmailAttributeName=mail
ldap.synchronization.userOrganizationalIdAttributeName=o
ldap.synchronization.defaultHomeFolderProvider=largeHomeFolderProvider
ldap.synchronization.groupIdAttributeName=cn
ldap.synchronization.groupDisplayNameAttributeName=description
ldap.synchronization.groupType=groupOfNames
ldap.synchronization.personType=inetOrgPerson
ldap.synchronization.groupMemberAttributeName=member
ldap.synchronization.enableProgressEstimation=true
ldap.authentication.java.naming.read.timeout=0
[/bash]

To have a full control about what is happening during the LDAP authentication add next lines to your custome log configuration file like next one. If you don’t have a custom log file already you can create it:

[bash]
cp tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties tomcat/shared/classes/alfresco/extension/custom-log4j.properties
[/bash]

Add next options to the file:

[bash]
vi tomcat/shared/classes/alfresco/extension/custom-log4j.properties
[/bash]

Content:

[bash]
# LDAP
log4j.logger.org.alfresco.repo.importer.ImporterJob=debug
log4j.logger.org.alfresco.repo.importer.ExportSourceImporter=debug
log4j.logger.org.alfresco.repo.security.authentication.ldap=debug
[/bash]

Now reboot and try. Also you can do that easily and without reboot using JMX with console

Remember to keep watching your logs:

[bash]
tail -f tomcat/logs/catalina.out
[/bash]

When Alfresco is starting after our changes, you must see something like this:

[bash]
2013-03-07 09:46:26,175¬† INFO¬† [management.subsystems.ChildApplicationContextFactory] [main] Starting ‘Authentication’ subsystem, ID: [Authentication, managed, ldap1]
2013-03-07 09:46:26,212  WARN  [authentication.ldap.LDAPInitialDirContextFactoryImpl] [main] LDAP server supports anonymous bind ldap://localhost:1389
2013-03-07 09:46:26,234  INFO  [authentication.ldap.LDAPInitialDirContextFactoryImpl] [main] LDAP server does not support simple string user ids and invalid credentials at ldap://localhost:1389
2013-03-07 09:46:26,235  INFO  [authentication.ldap.LDAPInitialDirContextFactoryImpl] [main] LDAP server does not fall back to anonymous bind for a simple dn and password at ldap://localhost:1389
2013-03-07 09:46:26,237  INFO  [authentication.ldap.LDAPInitialDirContextFactoryImpl] [main] LDAP server does not fall back to anonymous bind for known principal and invalid credentials at ldap://localhost:1389
2013-03-07 09:46:26,247¬† INFO¬† [management.subsystems.ChildApplicationContextFactory] [main] Startup of ‘Authentication’ subsystem, ID: [Authentication, managed, ldap1] complete
[/bash]

And after your first login:

[bash]
2013-03-07 09:47:34,404  DEBUG [authentication.ldap.LDAPAuthenticationComponentImpl] [http-8080-5] Authenticating user "toni"
2013-03-07 09:47:34,421  DEBUG [authentication.ldap.LDAPAuthenticationComponentImpl] [http-8080-5] Setting the current user to "toni"
2013-03-07 09:47:34,422  DEBUG [authentication.ldap.LDAPAuthenticationComponentImpl] [http-8080-5] User "toni" authenticated successfully
[/bash]

Remember to change your LDAP log debug level before going live, something like INFO could be enough.

Instalación de Alfresco con MySQL en Linux desde la linea de comandos

En este artículo os voy a mostrar el procedimiento para instalar Alfresco Enterprise 4.1.1 o Community en un servidor Linux 64bits usando el instalador (bundle) desde la linea de comandos (si no tenemos interfaz gráfica instalada en nuestro servidor), y como hacerlo con MySQL 5.1 en lugar de Postgresql (que viene por defecto en el instalador). Usaré Alfresco Enterprise 4.1.1 pero todos los comandos son igualmente válidos para Community;

Descargar el instalador de Alfresco (Enterprise o Community):

Enterprise de este enlace: http://www.alfresco.com/products/enterprise/trial

Community de este otro: alfresco-community-4.2.b-installer-linux-x64.bin

También descargamos el driver de conexión JDBC con MySQL de este enlace: http://dev.mysql.com/downloads/connector/j/

Creamos un usuario con el que correr√° el servidor de aplicaciones (Tomcat), por ejemplo, un usuario llamado “alfresco”:

[bash]
# useradd alfresco
[/bash]

Asignamos una contrase√Īa al usuario alfresco:

[bash]
# passwd alfresco
Changing password for user alfresco.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[/bash]

Antes de seguir, comprueba que tienes correctamente configurado el fichero de hosts del servidor (/etc/hosts), algo así:

[bash]
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.22 servidor.dominio.com servidor
[/bash]

Creamos el directorio donde vas a instalar Alfresco y damos permisos al usuario que acabamos de crear (ponle el nombre y versión si quieres), por ejemplo yo usaré:

[bash]
# mkdir /opt/alfresco-enterprise-4.1.1
# chown alfresco.alfresco /opt/alfresco-enterprise-4.1.1
[/bash]

Accedemos con ese usuario o vamos desde root:

[bash]
# su – alfresco
[/bash]

Tras tener el paquete y el conector con mysql descargados, vamos a empezar la instalación:

Si el paquete no estuviese ejecutable puedes hacerlo con el siguiente comando:

[bash]
$ chmod +x alfresco-*-installer-linux-x64.bin
[/bash]

Ejecutamos el instalador y seguimos los pasos como se indica a continuaci√≥n, f√≠jate bien en las opciones que elijo, cambia el nombre de base de datos, usuario y contrase√Īa en tu caso, tambi√©n ojo a los cambios al usar MySQL:

[bash]
$ ./alfresco-enterprise-4.1.1-installer-linux-x64.bin
Language Selection

Please select the installation language
[1] English – English
[2] French РFrançais
[3] Spanish – Espa√Īol
[4] Italian – Italiano
[5] German – Deutsch
[6] Japanese – śó•śú¨Ť™ě
[7] Dutch – Nederlands
[8] Russian – –†—É—Ā—Ā–ļ–ł–Ļ
[9] Simplified Chinese – ÁģÄšĹďšł≠śĖá
Please choose an option [1] : 3
—————————————————————————-
Bienvenido a la instalación de Alfresco Enterprise.

—————————————————————————-
Tipo de instalación

[1] Fácil: instala los servidores con la configuración por defecto
[2] Avanzada: Configura las propiedades de servicio y los puertos de servidor.: También puede elegir componentes opcionales para instalar.
Por favor seleccione una opción [1] : 2

—————————————————————————-
Seleccione los componentes que desea instalar; desmarque aquellos que no desea.

Java [Y/n] :Y

PostgreSQL [Y/n] :n

Alfresco : Y (Cannot be edited)

SharePoint [Y/n] :Y

Web Quick Start [y/N] : N

OpenOffice [Y/n] :Y

¬ŅEs correcta la selecci√≥n que se muestra aqui arriba? [Y/n]: Y

—————————————————————————-
Carpeta de instalación

Por favor, elija una carpeta para instalar Alfresco Enterprise

Seleccionar una carpeta [/home/alfresco/alfresco-4.1.1]: /opt/alfresco-enterprise-4.1.1

—————————————————————————-
Configuración de la base de datos

URL de JDBC: [jdbc:postgresql://localhost/alfresco]: jdbc:mysql://localhost/alfresco?useUnicode=yes&characterEncoding=UTF-8

Controlador JDBC: [org.postgresql.Driver]: org.gjt.mm.mysql.Driver

Nombre de la base de datos: [alfresco]: alfresco

Nombre de usuario: []: alfresco

Contrase√Īa: :
Verificar: :
—————————————————————————-
Configuración de puerto Tomcat

Por favor, introduzca los parámetros de configuración de Tomcat que desea
utilizar.

Dominio de Servidor Web: [127.0.0.1]:

Puerto del servidor Tomcat: [8080]:

Puerto de cierre de Tomcat: [8005]:

Puerto SSL de Tomcat [8443]:

Puerto AJP de Tomcat: [8009]:

—————————————————————————-
Puerto FTP de Alfresco

Por favor, elija un n√ļmero de puerto para usar para el servidor FTP integrado de
Alfresco.

Puerto: [2121]:

—————————————————————————-
Puerto RMI de Alfresco

Por favor, elija un n√ļmero de puerto que utilizar√° Alfresco para ejecutar
comandos remotos.

Puerto: [50500]:

—————————————————————————-
Contrase√Īa de admin

Por favor, especifique una contrase√Īa a utilizar para la cuenta de administrador
de Alfresco.

Contrase√Īa de admin: :
Repita la contrase√Īa: :
—————————————————————————-
Puerto de SharePoint en Alfresco

Por favor, elija un n√ļmero de puerto para el protocolo SharePoint.

Puerto: [7070]:

—————————————————————————-
Puerto de servidor OpenOffice

Por favor, introduzca el puerto en el que el Servidor de OpenOffice va a
escuchar por defecto.

Puerto de servidor OpenOffice [8100]:

—————————————————————————-
El programa está listo para iniciar la instalación de Alfresco Enterprise en su
ordenador.

¬ŅDesea continuar? [Y/n]: Y

—————————————————————————-
Por favor espere mientras se instala Alfresco Enterprise en su ordenador.

Instalando
0% ______________ 50% ______________ 100%
#########################################

—————————————————————————-
El programa terminó la instalación de Alfresco Enterprise en su ordenador.

Ver el archivo Léeme [Y/n]: n

Lanzar Alfresco Enterprise Share [Y/n]: n
[/bash]

Como ves en el asistente, no arrancamos ya que nos quedan algunas tareas por acometer todavía.

Fijate sobre todo en las líneas:
PostgreSQL [Y/n] :n
URL de JDBC: [jdbc:postgresql://localhost/alfresco]: jdbc:mysql://localhost/alfresco?useUnicode=yes&characterEncoding=UTF-8
Controlador JDBC: [org.postgresql.Driver]: org.gjt.mm.mysql.Driver
Nombre de la base de datos: [alfresco]: alfresco
Nombre de usuario: []: alfresco

Cambia mysql://localhost/alfresco por la IP o nombre del servidor MySQL y alfresco por el nombre de la base de datos.

Copia el jar con el conector JDBC de MySQL al siguiente directorio:

[bash]
$ cp mysql-connector-java-5.1.18-bin.jar /opt/alfresco-enterprise-4.1.1/tomcat/lib/
[/bash]

Antes de arrancar el servidor de aplicaciones, en el servidor MySQL, que ya debería estar instalado y levantado, ya sea en local o en un servidor separado hay que crear la base de datos y dar los permisos:

[bash]
# mysql -u root -p
Enter password:

mysql> create database alfresco;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on alfresco.* to [email protected] identified by ‘alfresco’;
Query OK, 0 rows affected (0.00 sec)
[/bash]

Hecho lo anterior podrías proceder a hacer algunos cambios en la configuración, pero también puedes hacerlo una vez levantado el servidor (e ir reiniciando con cada cambio si usas Community o sin necesidad de reiniciar si usas Enterprise y la consola de administración).

Arrancamos el servidor:

[bash]
$ cd /opt/alfresco-enterprise-4.1.1/
$ ./alfresco.sh start
Using CATALINA_BASE: /opt/alfresco-enterprise-4.1.1/tomcat
Using CATALINA_HOME: /opt/alfresco-enterprise-4.1.1/tomcat
Using CATALINA_TMPDIR: /opt/alfresco-enterprise-4.1.1/tomcat/temp
Using JRE_HOME: /opt/alfresco-enterprise-4.1.1/java
Using CLASSPATH: /opt/alfresco-enterprise-4.1.1/tomcat/bin/bootstrap.jar
Using CATALINA_PID: /opt/alfresco-enterprise-4.1.1/tomcat/temp/catalina.pid
/opt/alfresco-enterprise-4.1.1/tomcat/scripts/ctl.sh : tomcat started
[/bash]

Podemos ver los logs con el siguiente comando:

[bash]
$ tail -f tomcat/logs/catalina.out
[/bash]

Deberíamos ver lineas que nos indican que se va poblando la base de datos, también que se crean los índices de SORL.
Recuerda que ver√°s el siguiente error en el log:

[bash]
ERROR [org.alfresco.fileserver] [CIFS Server] [SMB] Server error
[/bash]

Al iniciar con un usuario no root, Alfresco no puede levantar el subsistema CIFS ya que no puede usar un puerto por debajo del 1024. Para resolverlo (aunque deber√°s redireccionar los puertos http://docs.alfresco.com/4.0/topic/com.alfresco.enterprise.doc/tasks/fileserv-CIFS-useracc.html) puedes cambiar la configuraci√≥n de los puertos de CIFS a√Īadiendo los siguientes par√°metros en en el fichero de configuraci√≥n: tomcat/shared/classes/alfresco-global.properties

[bash]
cifs.tcpipSMB.port=1445
cifs.netBIOSSMB.sessionPort=1139
cifs.netBIOSSMB.namePort=1137
cifs.netBIOSSMB.datagramPort=1138
[/bash]

Cuando en el log veas la línea:

[bash]
INFO: Server startup in 104835 ms
[/bash]

Significa que está arrancado y ya puedes acceder a Alfresco Share mediante http://localhost:8080/share o el nombre de servidor que tengas y a Alfresco Explorer con http://localhost:8080/alfresco. Por FTP, recuerda que se usa el puerto 2121 por defecto (si no haces redirección con IPTables). Por Webdav sería con la URL: http://localhost:8080/alfresco/webdav.

¬ŅQuieres prepararte? Aplicaciones empresariales Open Source

¬ŅEst√°s estudiando? ¬ŅNo tienes trabajo y est√°s pensando en mejorar tu formaci√≥n? ¬ŅQuieres preparar tu perfil t√©cnico pero no est√°s seguro por donde van las tendencias? Si eres o quieres ser t√©cnico de sistemas, programador, administrador o arquitecto de sistemas o software y quieres trabajar con Software Libre, he preparado esta lista a modo de resumen y aprovechando que el curso acaba de empezar. Si no reunes las condiciones anteriores igual tambi√©n te resulta interesante e incluso puedes ampliar la lista en los comentarios. (Parece que voy a vender cursos de CCC o algo as√≠, pero nada m√°s lejos de la realidad, es un simple listado :D).
La familia de aplicaciones “Enterprise Open Source” es bastante amplia y abarcan todos los campos que puede necesitar una organizaci√≥n. Si estas empezando en este mundo y eres capaz de dominar algunas de estas aplicaciones o conocerlas en profundidad, creo que tendr√°s m√°s oportunidades en tu proyecci√≥n profesional.
Antes de empezar, quiero dejar claro que este artículo no pretende ser un listado al estilo Infoworld, aunque dichas clasificaciones me parecen de un gran interés, en este caso sólo pretendo reflejar mis aplicaciones favoritas para cada caso y sobre todo, las que creo que están más extendidas.
Me gustar√≠a recomendaros que ech√©is un vistazo a los “Amazon Elastic Compute Cloud” (Amazon EC2), es importante saber c√≥mo funciona, c√≥mo desplegar servidores, sistemas de almacenamiento que soporta, etc. En muchas empresas, se hacen uso de estos servicios, ya sea a trav√©s de Amazon u otros.
Bueno, aquí va la lista:
Muchas de estas aplicaciones las puedes instalar y probar de una forma muy sencilla y en Linux, Mac o Windows gracias a los stacks de Bitnami.
La mayoría de estas aplicaciones están hechas en PHP o en Java, eso te puede dar otra idea, si decides aprender a programar.
Hace un par de semanas, la empresa Stratebi publicó un listado que subraya algunas de las aplicaciones que aquí he indicado. Puedes ver la presentación aquí.
Tras hacer este listado he pensado que posiblemente no haya, o al menos yo no lo conozco, un centro de formaci√≥n que capacite a t√©cnicos y desarrolladores en todas estas tecnolog√≠as‚Ķ ser√≠a algo interesante ¬Ņno crees?

Alfresco Hack: cómo sacar un informe rápido de los contenidos del repositorio

Ya lo vi hace tiempo en Think Alfresco y sab√≠a que alg√ļn d√≠a lo iba a necesitar, ahora quiero compartirlo con vosotros. Sabemos lo que ocupa el repositorio, ser√≠a tan f√°cil como hacer un du -sh contentstore, pero ¬Ņqu√© tipo de archivos almacena ese repositorio y cuantos de cada tipo? Saber ese dato es importante al hacer migraciones, optimizar Lucene, etc. Es tan f√°cil como ejecutar el siguiente comando desde el directorio superior al contentstore de turno:

$ find ./contentstore -type f -exec file -inb {} \;| sort |uniq -c|sort -nr

Este comando nos dar√° como resultado algo parecido a lo siguiente:

    378 application/msword
    147 application/pdf
     72 text/plain; charset=us-ascii
     58 text/x-c++; charset=iso-8859-1
     12 text/plain; charset=utf-8
      8 text/html
      2 application/x-zip
      2 text/plain; charset=iso-8859-1
      2 image/jpeg
      2 application/x-empty
      2 text/x-c; charset=utf-8
      1 text/x-c++; charset=utf-8
      1 image/png

F√°cil ¬Ņno? Claro que tambi√©n se puede hacer con un JavaScript y ejecutarlo como acci√≥n pero pienso que as√≠ es m√°s r√°pido, adem√°s es el “Sys Admin way”.

Archiving en Alfresco 3.2

image_archivingActualización 25/Feb/2010: ver demo-config-files para configuración más cómoda incluso desde Share, reglas y demás (doc calentito que me han enviado desde Alfresco, Gracias Paul!!).

¬ŅQue es el archiving/archivado? Un archivo en gesti√≥n documental es una colecci√≥n de documentos hist√≥ricos, as√≠ como el lugar donde se encuentran. Pues bien, vamos a ver como se configura Alfresco para poder almacenar los contenidos en diferentes sistemas de ficheros, particiones o filesystem (como quieras llamarlo). Cada filesystem puede ser de diferente naturaleza, es decir, los contenidos que se trabajan actualmente deber√°n estar en los discos m√°s r√°pidos (discos locales o en una SAN) y los contenidos hist√≥ricos o de acceso poco frecuente pero debemos mantener, podemos almacenarlos en discos m√°s lentos/baratos o por ejemplo en una NAS.

Todo esto se consigue en Alfresco gracias al Content Store Selector. El Content Store Selector ofrece un mecanismo de control que relaciona el contenido lógico con un fichero físico y su ubicación. Usando el aspecto cm:storeSelector y asignándole una propiedad cm:storeName podemos mover el contenido de un Store a otro de forma totalmente transparente tanto para el usuario como para la aplicación a la hora de mostrar los contenidos, claro que previamente tenemos que definirlos. Esto nos permitirá declarar políticas para controlar la capa de almacenamiento y el uso que de ella hace Alfresco en base a regales de negocio.

Veamos como se configura en base al siguiente escenario:

El repositorio y los ficheros de uso diario, los más usados, los tenemos en /opt/alfresco/alf_data/contentstore, supongamos que ese filesystem corresponde a los discos más rápidos. También tenemos un disco local más lento montado en /opt/alfresco/alf_data/storeA, e incluso podemos tener un filesystem de tipo NAS para los datos que ya no usamos pero necesitamos almacenar montado en /opt/alfresco/alf_data/storeB.

¬ŅC√≥mo lo configuramos?

Creamos un fichero llamado “sample-content-store-selector-context.xml” en shared/classes/alfresco/extension con el siguiente contenido, lee los comentarios para entender la configuraci√≥n:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http:// www.springframework.org/dtd/spring-beans.dtd'>
<!-- Define the new file stores -->
<beans>
        <bean id="firstSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
                <constructor-arg>
                        <value>${dir.root}/storeA</value>
                </constructor-arg>
        </bean>
        <bean id="secondSharedFileContentStore" class="org.alfresco.repo.content.filestore.FileContentStore">
                <constructor-arg>
                        <value>${dir.root}/storeB</value>
                </constructor-arg>
        </bean>
<!-- Declare the mapping between store names and store instances -->
        <bean id="storeSelectorContentStore" parent="storeSelectorContentStoreBase">
                <property name="defaultStoreName">
                        <value>default</value>
                </property>
                <property name="storesByName">
                        <map>
                                <entry key="default">
                                        <ref bean="fileContentStore" />
                                </entry>
                                <entry key="storeA">
                                        <ref bean="firstSharedFileContentStore" />
                                </entry>
                                <entry key="storeB">
                                        <ref bean="secondSharedFileContentStore" />
                                </entry>
                        </map>
                </property>
        </bean>
<!-- Point the ContentService to the 'selector' store -->
        <bean id="contentService" parent="baseContentService">
                <property name="store">
                        <ref bean="storeSelectorContentStore" />
                </property>
        </bean>
<!-- Add the other stores to the list of stores for cleaning -->
        <bean id="eagerContentStoreCleaner" class="org.alfresco.repo.content.cleanup.EagerContentStoreCleaner" init-method="init">
                <property name="eagerOrphanCleanup" >
                        <value>${system.content.eagerOrphanCleanup}</value>
                </property>
                <property name="stores" >
                        <list>
                                <ref bean="fileContentStore" />
                                <ref bean="firstSharedFileContentStore" />
                                <ref bean="secondSharedFileContentStore" />
                        </list>
                </property>
                <property name="listeners" >
                        <ref bean="deletedContentBackupListeners" />
                </property>
        </bean>
</beans>

Si te fijas en los dos primeros beans, los valores que se especifican están relacionados con la ubicación de los dos Stores adicionales que estamos creando, en esta caso, relativos a ${dir.root} que es un atributo declarado en alfresco-global.properties. Si nuestros nuevos filesystems no están dentro de dir.root podemos poner la ruta absoluta, por ejemplo <value>/mnt/storeA</value>.

Para poder usar los nuevos contentStores debemos configurar el web-client (Alfresco Explorer) y declararlo como aspecto. Editamos web-client-config-custom.xml y a√Īadimos las siguientes lineas:

<!-- Configuring in the cm:storeSelector aspect -->
        <config evaluator="aspect-name" condition="cm:storeSelector">
                <property-sheet>
                        <show-property name="cm:storeName" />
                </property-sheet>
        </config>
        <config evaluator="string-compare" condition="Action Wizards">
                <aspects>
                        <aspect name="cm:storeSelector"/>
                </aspects>
        </config>

Hecho lo anterior ya podemos reiniciar el servidor de aplicaciones para que los cambios surtan efecto.

Ahora vamos a ver como empezar a usarlo. Recuerda que el aspecto, aunque pueden aplicarlo todos los usuarios, s√≥lo el usuario administrador podr√° especificar el store correspondiente y s√≥lo es aplicable a contenidos (no a espacios). En este ejemplo veremos como hacerlo de forma manual, para sistemas en producci√≥n deber√≠amos hacer un script que modifique dicho metadato autom√°ticamente en base a las necesidades que tengamos, por ejemplo los que est√©n dentro de un espacio concreto, los que tengan m√°s de N a√Īos en el repositorio, etc. El procedimiento ser√≠a el siguiente:

  • Localizamos el fichero con el que queremos probar (lo moveremos al storeA).
  • Vamos a “Ver detalles” de dicho fichero y pinchamos en “Ejecutar una acci√≥n”
  • Seleccionamos “Agregar aspecto al contenido” -> “ContentStore Selector” -> Aceptar -> Finalizar
  • En las propiedades del fichero ya veremos un nuevo metadato llamado “Store Name”.
    propiedades
    Editamos las propiedades y en Store Name especificamos: storeA
    storea
    Cuando pinchemos en Aceptar, autom√°ticamente el contenido se mover√° de forma transparente al filesystem alf_data/storeA/2010/2/17/22/50/4365380f-daf1-494c-b79d-db11480cb171.bin correspondiente, en mi ejemplo, a un fichero pdf.

¬ŅInteresante no?

ACTUALIZACI√ďN: para automatizar la clasificaci√≥n por “Stores” podemos hacer un script en Java Script llamado, por ejemplo, action_storeA.js o B seg√ļn el sitio donde queramos colocar los ficheros, con el contenido:

document.properties["cm:storeName"]="storeA";
document.save();

Lo guardamos y subimos a Diccionario de datos -> Scripts. Hecho esto podemos ejecutar una acci√≥n sobre el fichero de turno y seleccionamos “Ejecutar un script” -> Seleccionamos nuestro script “action_storeA.js” y listo. Tambi√©n podemos incluirlo en una regla y hacer el proceso de forma autom√°tica, cuando entren los ficheros a un espacio concreto, o incluso clasificar si son v√≠deos, im√°genes, pdf, cad, etc.

Alfresco: configuración de Single Sign On (SSO) con NTLM vía Active Directory. Parte 1 de 3

Para comenzar el a√Īo, os dejo aqu√≠ el primero de una serie de 3 art√≠culos sobre la configuraci√≥n de Single Sign On con Alfresco Enterprise 3.1. Las versiones 3.2 de Alfresco requieren una configuraci√≥n que difiere de la que se cita a continuaci√≥n. Estos art√≠culos los he podido escribir gracias a la ayuda de Isa√≠as Aranda, Ra√ļl Maci√°n y Fernando Gonzalez, compa√Īeros y expertos en Alfresco de Intecna.

En este art√≠culo veremos como “Activar SSO (Single Sign On) con Alfresco Explorer y Webdav con Active Directory (NTLM)“, en los siguientes art√≠culos de esta serie veremos c√≥mo “Activar el SSO en Alfresco Share con Active Directory (NTLM)” y c√≥mo “Activar el SSO en Alfresco CIFS con Active Directory (NTLM)“.

¬ŅQu√© es Single Sign On (SSO)? Seg√ļn la Wikipedia, que lo explica bastante bien, es un procedimiento de autenticaci√≥n que habilita al usuario para acceder a varios sistemas con una sola instancia de identificaci√≥n. Hablando en plata, que introduces tus credenciales una vez y ya accedes a todas las dem√°s aplicaciones configuradas para funcionar como SSO. M√°s info aqu√≠.

No confundas SSO con autenticar diferentes aplicaciones con el mismo usuario y contrase√Īa, eso no es SSO, eso ser√° autenticaci√≥n centralizada.

Este procedimiento explica c√≥mo configurar Alfresco Enterprise 3.1SP2 para que detecte las credenciales del usuario que accede a su estaci√≥n de trabajo Windows XP logueando en un dominio controlado por Active Directory de esa forma, cuando el usuario acceda a Alfresco con Internet Explorer, autenticar√° dentro del Alfresco Explorer y Webdav autom√°ticamente sin pedir usuario y contrase√Īa, es decir, detectando el usuario que ya se env√≠a en la sesi√≥n de Windows.

Tambi√©n se puede hacer esto con Firefox escribiendo “about:config” sin comillas en la URL, buscamos la cadena “network.automatic-ntlm-auth.trusted-uris” y a√Īadimos (doble-click) la URL de Alfresco, en el caso de este art√≠culo ser√≠a http://alfresco.test.tld:8080/alfresco

Datos usados para estos artículos:

  • IP del controlador de dominio: 10.215.253.165 (w2003.test.tld)
  • Dominio: TEST.TLD
  • IP servidor Alfresco: 10.215.253.168 (alfresco.test.tld)

Ficheros que intervienen:

  • web.xml -> dentro de WEB-INF de alfresco.war desplegado, directorio alfresco en webapps
  • ntlm-authentication-context.xml -> en <extension>

En el web.xml modificar seg√ļn se indica en: http://wiki.alfresco.com/wiki/3.0_Configuring_NTLM#Alfresco_Explorer_and_WebDav_SSO_using_NTLM simplemente es descomentar unas cuantas l√≠neas que prefiero obviar aqu√≠, pero no olvides hacerlo para que todo funcione.

En ntlm-authentication-context.xml quitar la extension .sample del nombre de fichero y modificar o a√Īadir el siguiente bean:
<bean id=”authenticationComponent” class=”org.alfresco.repo.security.authentication.ntlm.NTLMAuthenticationComponentImpl” parent=”authenticationComponentBase”>
<property name=”useLocalServer”>
<value>false</value>
</property>
<!– Damain Servers –>
<property name=”servers”>
<value>TEST.TLD\10.215.253.165, 10.215.253.165</value>
</property>
<property name=”personService”>
<ref bean=”personService” />
</property>
<property name=”nodeService”>
<ref bean=”nodeService” />
</property>
<property name=”transactionService”>
<ref bean=”transactionComponent” />
</property>
<property name=”guestAccess”>
<value>false</value>
</property>
</bean>

Importante, hay que controlar los logs mientras estamos configurando estas funcionalidades, para ello debemos descomentar las siguientes líneas en el archivo log4j.properties que hay en el directorio classes del alfresco.war desplegado (webapps/alfresco/WEB-INF/classes):

# NTLM servlet filters
log4j.logger.org.alfresco.web.app.servlet.NTLMAuthenticationFilter=debug
log4j.logger.org.alfresco.repo.webdav.auth.NTLMAuthenticationFilter=debug

Reiniciamos Alfresco y ya podemos probar. Al acceder vía web (Alfresco Explorer) tras iniciar sesión con Windows XP en el dominio, deberemos ver unas trazas como las siguientes (Dominio TEST.TLD, Usuario: toni, Nombre de la máquina cliente: XPAIR, servidor Alfresco MACBOOK-DE-TONI):

20:41:26,223  DEBUG [app.servlet.NTLMAuthenticationFilter] New NTLM auth request from 10.215.253.168 (10.215.253.168:57688) SID:1B5CD1A3F83CE31F0EA27770359574FD
20:41:26,226  DEBUG [app.servlet.NTLMAuthenticationFilter] Received type1 [Type1:0xa2088207,Domain:<NotSet>,Wks:<NotSet>]
20:41:26,227  DEBUG [app.servlet.NTLMAuthenticationFilter] Client domain null
20:41:26,330  DEBUG [app.servlet.NTLMAuthenticationFilter] Sending NTLM type2 to client Р[Type2:0x80000203,Target:MACBOOK-DE-TONI,Ch:9e407e94299c1e11]
20:41:26,335  DEBUG [app.servlet.NTLMAuthenticationFilter] Received type3 [Type3:,LM:3ca6bb198992e77cc713341304743f156de9a77061678617,NTLM:239d3b79b323af49d32a77be92842057d65b32af3fb4236b,Dom:TEST,User:toni,Wks:XPAIR]
20:41:26,381 User:toni DEBUG [app.servlet.NTLMAuthenticationFilter] Updated cached NTLM details
20:41:26,381 User:toni DEBUG [app.servlet.NTLMAuthenticationFilter] User logged on via NTLM, [toni,Wks:XPAIR,Dom:TEST,AuthSrv:MACBOOK-DE-TONI,Sun Dec 20 20:41:26 CET 2009]
20:41:27,287 User:toni DEBUG [app.servlet.NTLMAuthenticationFilter] Processing request: /alfresco/wcservice/api/search/keyword/description.xml SID:null
20:41:27,287 User:toni DEBUG [app.servlet.NTLMAuthenticationFilter] Found webscript with no authentication – set NO_AUTH_REQUIRED flag.
20:41:27,288 User:toni DEBUG [app.servlet.NTLMAuthenticationFilter] Authentication not required (filter), chaining …
20:41:29,537 User:toni DEBUG [app.servlet.NTLMAuthenticationFilter] Processing request: /alfresco/wcservice/api/search/keyword/description.xml SID:7784CDFAD8E6B29103D6A2E02FE558F1
20:41:29,540 User:toni DEBUG [app.servlet.NTLMAuthenticationFilter] Found webscript with no authentication – set NO_AUTH_REQUIRED flag.
20:41:29,540 User:toni DEBUG [app.servlet.NTLMAuthenticationFilter] Authentication not required (filter), chaining …

Recuerda a√Īadir el usuario que quieras dotar de permisos administrador en el grupo ALFRESCO_ADMINISTRATOR o a√Īadir el usuario en el authority-services-context.xml, c√≥pialo en <extension> desde el <configRoot> y lo modificas seg√ļn tus necesidades:

<property name=”adminUsers”>
<set>
<value>${alfresco_user_store.adminusername}</value>
<value>administrator</value>
<value>TU_USUARIO</value>
</set>
</property>

Y listo. Así de fácil.

Mejorando la velocidad de Alfresco con Varnish

En la charla que di en el Meetup de Alfresco en Madrid, comenté, entre otras cosas, cómo acelerar Alfresco, en este punto se hablaba de Varnish.

Varnish

Varnish es un proxy caché, acelerador web y balanceador de servidores web que funciona sobre Linux, Mac y *BSD, básicamente usa opciones del kernel y un almacén de la caché para acelerar las peticiones de páginas, es decir, un sustituto a mod_proxy, mod_proxy_balancer o mod_proxy_ajp.

En este artículo os dejo un manual sobre como implementar Varnish por delante de Alfresco para acelerar la experiencia del usuario y funcionamiento en general de la aplicación, tanto Alfresco Explorer como Alfresco Share u otras aplicaciones que desarrollemos sobre Alfresco, reduce los tiempos de conexión de forma considerable y libera de algunas peticiones al servidor de aplicaciones.

En este caso explicaré como instalar y configurar Varnish 2.0.5 en CentOS 5 mediante un RPM aunque también se puede compilar, todo en menos de 5 minutos. La lectura de esta web me ha ayudado para escribir el artículo.

Read More

Adios Nagios, hola Icinga.

nagiosLos que me conocen saben que soy un enamorado de Nagios, lo conozco desde hace a√Īos, desde que se llamaba Netsaint, lo he montado siempre que he podido para demostrar que no tiene nada que envidiar a software propietario y caro que se ve por las grandes compa√Ī√≠as de todo el mundo. Me consta que sigue montado en sitios por los que he pasado, no dir√© m√°s pistas ;).

En los √ļltimos a√Īos, a Nagios le han salido muchos competidores en el mundo del Open Source: Zenoss, Hyperic, Pandora, OpenNMS, Zabbix, Centreon y Groundwork, estos dos √ļltimos basados en Nagios. Lo cierto es que ten√≠a la sensaci√≥n de que Nagios estaba siendo adelantado por sus competidores. El problema principal es que, a pesar de la gran comunidad que existe en torno a Nagios, el core s√≥lo lo desarrolla una persona en USA y parece ser que era un cuello de botella para otros desarrolladores y los usuarios finales. Esto no ha ca√≠do en saco roto y la comunidad se ha puesto manos a la obra para que el proyecto pueda seguir creciendo como se merece. As√≠ que la gente de nagios-portal.org, NagVis, NagTrap, PNP4Nagios, icingacheck_multi, NagiosGrapher y NETWAYS han realizado un fork llamado Icinga, que significa en Zul√ļ “explorar o examinar”.

Es la grandeza del Software Libre, y gracias a la libretad de adaptar, modificar, publicar podemos tener noticias como esta. Como ellos mismos indican en su FAQ ya ha ocurrido esto otras veces, por ejemplo con Mambo->Joomla o con XFree86->X.org.

Todo esto est√° muy bien, pero ¬Ņganar√° la comunidad con este cambio? A tenor de lo que la gente de Icinga promete, estoy seguro que si, y mucho. Veamos:

  • Soportar√° caracter√≠sticas y plugins de Nagios y ser√° facil migrar desde Nagios.
  • Soportar√° extensiones y desarrollos e integraciones gracias a una API.
  • Tendr√° una nueva interfaz web basada en PHP.
  • Tendr√° como addons: PNP, NagVis, Grapher V2 y NagTrap.
  • Nueva interfaz NDO con soporte para ser almacenado en ficheros o en base de datos permitiendo el acceso a esos datos desde la API con PHP o desde WebServices.
  • ReportDesigner para realizar informes personalizados y se podr√°n configurar env√≠os autom√°ticos de informes cada cierto tiempo.
  • Tambi√©n se contemplan mejoras para grandes instalaciones.

Por ahora toca esperar, parece que la primera versión de Icinga saldrá el próximo 20 de Mayo. Habrá que estar atento, yo ya he puesto una nota en mi calendario.

Proxmox VE: una alternativa libre a la gestión de la virtualización

logo_pveYa tengo muchas m√°quinas en casa y poco tiempo para dedicarle al hardware y el cacharreo por lo que hace ya un mes que adquir√≠ en Hetzner un nuevo servidor para mi laboratorio, Hetzner es ISP alem√°n y sudafricano que permite alquilar m√°quinas f√≠sicas a un precio aceptable, ancho de banda de sobra y con un servicio magn√≠fico comprobado a lo largo de m√°s de un a√Īo con otros servidores que uso a titulo profesional. No conozco muchos ISP de la magnitud de Hetzner para poder haceros comparativas en cuanto a servicios/precio, pero son r√°pidos y en caso de problemas (tanto de sistema operativo, de red como f√≠sicos) est√°n ah√≠ para ayudar con un servicio 24×7 excelente incluido en el precio. La √ļnica pega es que el panel de control que ofrecen a los clientes est√° en alem√°n pero es sencillo y con Google Translator en unos minutos lo ten√≠a dominado.

Hecha la “cu√Īita” publicitaria sin √°nimo de nada a Hezner (cuando algo funciona tambi√©n hay que decirlo). Paso a contaros qu√© infraestructura he configurado para gestionar este servidor.

Actualmente, gracias al furor “Cloud” y teniendo en cuenta que la virtualizaci√≥n forma parte del paradigma aunque no obligatoriamente, he estado mirando diferentes f√≥rmulas o aplicaciones para gesti√≥n de la virtualizaci√≥n de forma sencilla, c√≥moda y r√°pida, por supuesto en Software Libre. Conoc√≠a desde hace tiempo Enomalism o actualmente AbiCloud* que es muy interesante y otras muchas soluciones web que permiten gestionar m√°quinas virtuales y aprovisionarlas, pero a la hora de la verdad la mayor√≠a de estas aplicaciones de gesti√≥n de la virtualizaci√≥n no rinden como se espera, me refiero por ejemplo a la clusterizaci√≥n, migraci√≥n de m√°quinas virtuales entre f√≠sicas y acciones afines o en algunos casos hay que pasar por caja para conseguir funcionalidades extra que generalmente no son Open Source. Los amigos de la Fundaci√≥n I+D del Software Libre llevan usando Proxmox VE unos cuantos meses. As√≠ que tras documentarme me lanc√© a la aventura y solicit√© a mi ISP que me montaran una m√°quina con Proxmox VE 1.1.

*AbiCloud no es sólo un gestor de máquinas virtuales sino que también puede gestionar máquinas físicas de una nube.

Proxmox VE es una plataforma de virtualizaci√≥n de c√≥digo libre (GPLv2) realizada por la compa√Ī√≠a alemana Proxmox Server Solutions GmbH, especializados en appliances virtuales empresariales.

¬ŅPor qu√© usar Proxmox VE?

  • Porque hace gala del principio KISS, es simple y funciona.
  • Porque permite desplegar m√°quinas virtuales en cuesti√≥n de segundos ya sea desde las plantillas disponibles o desde 0.
  • Porque permite crear contenedores gracias a OpenVZ, permite virtualizar y paravirtualizar gracias a KVM, por lo que no hecho de menos ni VMware ni Xen.
  • Porque permite descargar plantillas con aplicaciones instaladas y configuradas listas para usar desde aqu√≠.
  • Porque se pueden tener varios servidores f√≠sicos en cluster y migrar en vivo m√°quinas virtuales de un servidor a otro de forma r√°pida y sencilla. Permiti√©ndo aprovechar al m√°ximo el hardware y alta disponibilidad de mis sistemas operativos virtualizados.
  • Porque permite hacer backup a otros discos de forma totalmente desatendida y controlar gr√°ficamente el estado y consumo de cada una de las m√°quinas virtuales.
  • Porque puedes acceder por VNC a cualquiera de las m√°quinas desplegadas a√ļn sin red configurada.
  • Porque se descarga en ISO, basada en Debian y se instala directamente en el servidor anfitri√≥n, una vez instalado todo lo dem√°s se hace v√≠a web.

800px-screen-startpage-with-cluster

Y por muchas razones m√°s. Pero no es oro todo lo que reluce, he echado de menos m√°s informaci√≥n sobre el consumo de red y recursos. Aunque se muestran datos b√°sicos, no hay acumulados y gr√°ficas hist√≥ricas que son importantes para adelantarse a los problemas. Realmente con ntop y Cacti se soluciona este problema. En cuanto a documentaci√≥n y comunidad no est√° mal, ya que tanto OpenVZ como KVM adem√°s del propio ProxmoxVE cuentan con un importante n√ļmero de colaboradores y manuales.

Para instalarlo mira este fant√°stico manual que nos ofrecen los amigos de Howtoforge.

Lo tengo claro, para montar un entorno corporativo o personal de virtualización ya tengo una solución Open Source que cubre mis necesidades: Proxmox VE.