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 alfresco@localhost 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.