Watching your Libreoffice process for Alfresco transformations

A usual question of final users is that their Office files are not being previsualized in Alfresco. This may be for some reasons like:
 
 1. The office file is corrupted
 2. The office mimetype is not set correctly
 3. The office file is too big
 4. The Libreoffice process is not responding
 
In the last case, you will see that new MS-Office and Office documents are not being previsualized (any of them). In that cases, the first thing you should do is to check the Libreoffice process, by default in 8100 port:
 
  ps aux | grep soffice
 
If this process does not exist, or it seems to have problems, the manual solution is to restart Libreoffice just with a simply:
 
  $ALF_HOME/alfresco.sh start libreoffice
 
Sometimes it is necessary to kill the pid of the Libreoffice process, previously.
 
But there are better alternatives for the Alfresco admin. The first one is based on a nice plugin and a quartz job:
 
 
where you can define the corresponding cronjob in alfresco-global.properties
 
contentreich.officeWatchDog.kill=true
contentreich.officeWatchDog.cronExpression=0 */10 * * * ?
contentreich.officeWatchDog.timeoutSeconds=60
 
Another simple solution is check_libre.sh script in the crontab:
 
#! /bin/bash
# m h  dom mon dow   command
#0,15,30,45 * * * * /opt/alfresco/bin/check_libre.sh
 
ALF_HOME=/opt/alfresco
ALF_EXE=$ALF_HOME/alfresco.sh
ALF_LOG=$ALF_HOME/tomcat/logs/libreffice.log
ALF_DATE=`/bin/date`
 
if [[ -z `/bin/pidof ".soffice.bin"` ]]
 then
  $ALF_EXE start libreoffice
  echo "$ALF_DATE" >> $ALF_LOG
fi 
 
The log will help you to track if you have many problems with Alfresco transformations and OODirect subsystem. If this happens, consider to have memory enough for the soffice process.
 
You can also use the next script for reference for starting Libreoffice:
 
 
And finally, in Enterprise Edition (although in this case, it is tracked via Jodconverter subsystem) you can also restart the Libreoffice subsystem via JMX, or to set multiple instances to jodconverter via Admin Console.
 
 
NOTE: In Alfresco 5.1.e you need to change alfresco.sh to the correct location of libreoffice script (assuming an installation with the linux installer and including libreoffice). Anyway you can always run:
 
zylk@alf5:/opt/alfresco51e/libreoffice/scripts$ sh libreoffice_ctl.sh start
libreoffice_ctl.sh : libreoffice started at port 8100
 
In alfresco.sh change:
 
#LIBREOFFICE_SCRIPT=$INSTALLDIR/libreoffice/scripts/ctl.sh
LIBREOFFICE_SCRIPT=$INSTALLDIR/libreoffice/scripts/libreoffice_ctl.sh
 
Also the libreoffice_ctl.sh script needs to remove the slashes. Check this:
 
 
NOTE II: In Ubuntu you may also need:
 
sudo apt-get install libice6 libsm6 libxt6 libxrender1 libfontconfig1 libcups2 libxinerama1 libglu1-mesa
Entrada publicada en Sin categoría | Comentarios cerrados

My top Alfresco Addons

Recently we upgraded to Alfresco 201602GA (5.1.e CE) with all their new capabilities such as smart folders, new admin console or model manager. But once you installed Alfresco CE (or EE), you always need some extra Community power. This is a selection of our favourites for our Alfresco installations.
 
1. Javascript Console: Simply fantastic, essential plugin for administrators and developers in Alfresco installations. 
 
 
Also execute script addon in Share extras is quite useful in 5.x version , but it needs some changes for make it work in recent versions
 
2. Alfresco Site Creators: I do not remember a recent Alfresco Installation without this customization. Must have!
 
 
 
3. Alfresco Site Space Templates: The missing templates for Alfresco Sites.
 
 
 
4. Libreoffice Edit Online: No applet based, simple as webdav based edition hyperlink for protocol registering.
 
 
 
5. Uploader Plus: How many times does a client ask you for filling metadata before uploading the document ? 
 
 
 
6. Alfresco List Manager: Dynamic Lists administration for your Alfresco Share forms and content models. A simple way for avoiding redeploying constraint lists in content models continuously. It is very useful, when these data is not completely static, for example a list of clients.
 
 
 
 
7. Alfresco Bulk Import v.2.0: Enhanced Bulk Import Tool for (not inplace?) content migrations.
 
 
 
8. Trashcan Cleaner: Do no forget to take out the thrash.
 
 
 
9. PDF Toolkit: Useful PDF actions for content rules split, merge and many more.  
   
 
 
10. Alfresco Audit Analysis and Reporting: The BI reference project for Alfresco Suite.
 
 
For Alfresco 4.x users Audit Share is a very very nice addon --> https://github.com/atolcd/alfresco-audit-share
 
 
11. Alfresco Groovy Runner: Nice console for accesing Alfresco Java API. Well documented, with many examples.
 
 
 
12. Alfresco version by name: Very nice customization for the default behaviour when uploading documents in Share. 
 
 
 
Other admin basics for EE users are:
 
 
1. Support Tools for Enterprise Edition: A "must" have for every Alfresco Enterprise installation.
 
 
A JMX console like JMX term is quite useful --> http://wiki.cyclopsgroup.org/jmxterm/
 
 
2. Alfresco Nagios Plugin: A very useful check_jmx plugin for Alfresco (more adequate for Enterprise Editions) although basic ports monitoring and checks are also valid for Community Edition. 
 
 
 
More links:
Entrada publicada en Sin categoría | Comentarios cerrados

Change Alfresco ports in Alfresco 5

Sometimes we need to change the main ports of an Alfresco web application (i.e 8080 --> 9080), for example for running another Tomcat based app in your machine. This is a tip for Alfresco 5.x
 
* Change 8080, 8443, 8009 and 8005 connector ports in $ALF_HOME/tomcat/conf/server.xml
 
* Change JPDA 8000 in  $ALF_HOME/tomcat/bin/catalina.sh if used
 
* Change 8080, 8443 ports in $ALF_HOME/tomcat/shared/classes/alfresco-global.properties
 
  alfresco.port=8080
  share.port=8080
  solr.port=8080
  solr.port.ssl=8443
 
* Change 8080 ports in $ALF_HOME/tomcat/shared/classes/alfresco/web-extension/share-config-custom.xml urls (at least 5 urls by default)
 
* Change 8080 and 8443 in: 
 
  alfresco.port=8080
  alfresco.port.ssl=8443
 
  $ALF_HOME/solr4/workspace-SpacesStore/conf/solrcore.properties
  $ALF_HOME/solr4/archive-SpacesStore/conf/solrcore.properties
 
In Alfresco 4.x (with SOLR 1.4) you need :
 
  $ALF_HOME/alf_data/solr/archive-SpacesStore/conf/solrcore.properties
  $ALF_HOME/alf_data/solr/workspace-SpacesStore/conf/solrcore.properties
 
If for any reason you have to run two Alfresco repositories in the same machine, you may have other port conflicts relating RMI (50500), FTP (2121), CIFS (1445,1137-1139), IMAP (1443) , SMTP (25), Hazelcast (5701) or Libreoffice (8100). You may need to check this:
 
Entrada publicada en Sin categoría | Comentarios cerrados

Java AutoCloseable interface

He estado haciendo unas prubas mínimas con las interfaz autocloseable introducida en java 7 ... y la verdad es que está muy bien y hace que quede el código típico de try{} cath{}  finally{} mucho más limpio. Dejo aquí un ejemplo básico de uno de sus posible usos.

public class HBaseUtil implements AutoCloseable
{
    private Connection connection;
    public HBaseUtil() throws IOException
    {
        Configuration  conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum","lug000.zylk.net,lug008.zylk.net");
        conf.set("hbase.zookeeper.property.clientPort","2181");
        conf.set("zookeeper.recovery.retry","5");
        conf.set("zookeeper.session.timeout","5000");
        conf.set("hbase.client.retries.number","3");
        conf.set("zookeeper.znode.parent", "/hbase-unsecure");
        this.connection = ConnectionFactory.createConnection(conf);
    }
    
    private Connection getConnection()
    {
        return this.connection;
    }
    
    public void add() throws IOException {
        this.getConnection();
        //add element code
    }
    
    @Override
    public void close() throws Exception {
        if(!this.connection.isClosed())
            this.connection.close();
       
    }
    
    
    public static void main(String[] args) throws IOException
    {
        try (HBaseUtil hbu = new HBaseUtil())
        {
            hbu.add();
           
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

 

Entrada publicada en Sin categoría | Comentarios cerrados

Share action to copy an Alfresco link in your email client

Some time ago, we published an Alfresco addon for editing online with Libreoffice in Alfresco Share (via webdav protocol), in github. For this plugin, that works in Alfresco 4.x and 5.x versions, we need to register a protocol for using webdav url scheme (dav: or vnd.sun.star.webdav:) in our operating system. Recently, we made an update for Libreoffice 5.x in github.
 
Taking a similar aproximation, we developed another simple action for copying directly an Alfresco download URL via mailto: protocol, which is already registered in our OSes. I mean, when clicking in the corresponding action, your email client is opened with the download url for the file copied in the body of a message. Between the different download urls available, we chose http webdav url for getting some information about the paths and filenames. The github project is available here.
 
In fact, this is done in a similar way, when sharing a public url via email, but for public content.
 
This action is available in both Document Library and Document Details menus. The details menu is shown below:
 
 
 
 
When clicking for the first time and if a default application is not defined for the mailto: protocol (or url scheme), the browser will ask you for an application. Click in the right app and remember the chosen application. In the figure, I selected Zimbra, which is my email web client.
 
 
Finally, you will get something like this:
 
Entrada publicada en Sin categoría | Comentarios cerrados

How to avoid indexing full content in Alfresco

To avoid indexing full content in Alfresco, we have different aproximations:
 
1. From SOLR point of view (tested in SOLR 1.4 and Alfresco 4.2.5): 
 
In solrcore.properties (for workspace and archive store) set: 
 
alfresco.index.transformContent=false 
alfresco.ignore.datatype.1=d:content 
 
This is a general setup (for all content types).
 
2. From Filesystem Bulk Import and/or CMIS APIs point of view: 
 
Add aspect cm:indexControl and use cm:isIndexed=true, and cm:isContentIndexed=false in your XMLs for Bulk import. In APIs, use addAspect and set the corresponding properties. 
 
This is highly customizable, for any given types used in your data imports or APIs.
 
 
3. From a custom model point of view: 
 
Create an aspect overriding cm:indexControl
 
<aspect name="my:doNotIndexContentControl"> 
    <title>Do Not Index Control</title> 
    <parent>cm:indexControl</parent> 
    <overrides> 
       <property name="cm:isIndexed"> 
           <default>true</default> 
       </property>  
       <property name="cm:isContentIndexed"> 
           <default>false</default> 
       </property> 
     </overrides> 
</aspect> 
 
And then, set it as mandatory aspect for the custom content type. This is highly customizable, for a given custom type, defined in the repository.
Entrada publicada en Sin categoría | Comentarios cerrados

El futuro de sinadura (sinadura 5)

El ecosistema de sinadura, que zylk.net lleva gestionando y dinamizando desde hace unos 7 años, va a sufrir este año una transformación, o eso esperamos. Hasta ahora todos los proyectos que componen el ecosistema son proyectos con una base común pero sin una ligazón fuerte. Durante el año 2016 desde zylk.net vamos a tratar de impulsar varias acciones relacionadas con este ecosistema. La intensidad del impulso dependerá bastante de la financiación que consigamos para afontar este nuevo reto.

  • Integración de los dos principales servicios (sinadura desktop, cloudsign)
  • Autenticación en dos fases, basada en un QR y en un móvil, para disparar el proceso de firma delegada
  • Firma de documentos remotos (para la integración con aplicaciones de terceros) con el fin de permitir usar sinadura desktop en aplicaciones web (esto ya lo hace a día de hoy, sinadura desktop, usando webdav y el proyecto apache vfs que se integró en sinadura hace ya varios años. Esto se hizo para permitir la firma de documentos en el gestor documental alfresco).

Como se puede ver hay dos acciones que se encaminan a mejorar los dos productos principales del ecosistema. Y otra acción que se encamina a hacer que los procesos de firma de una organización se coordinen desde un sistema centralizado que controle, quién puede hace qué y desde qué dispositivo.

La integración de ambos desarrollos nos debería permitir la gestión de las firmas desde los siguientes puntos de vista

Firma delegada basada en servicios REST (con una sistema de auntenticación en 2 Fases)

  1. Para permitir realizar firmas corporativas
  2. Para permitir firmas de aplicación

Firmas en PC, integradas con las aplicaciones de una empresa

  1. Para permitir firmas de terceros sin tener que custodiar sus certificados
  2. Para permitir firmas personales con smartcards (dnie electrónico)

En esencia la idea es eliminar del ecosistema, el producto sinadura ECM y ampliar su funcionalidad para que permita firmar documentos no solo almacenados en alfresco ECM. Además perseguimos potenciar el uso de cloudsign, al integrar ambos productos para permitir cubirar las necesidades globales de firma de una empresa.

 

Para poder afrontar este reto, vamos a incorporar un proces de autenticación en dos fases a la plataforma cloudsign. El diagrama base de lo que se pretende hacer es el siguiente

 

 

Con estas dos mejoras de los productos del ecosistema vamos a poder hacer que ambos confluyan en una solución única. La idea de la confluencia es la descrita en el siguiente gráfico:

Veremos como se da el año (2016) y veremos si, desde zylk.net, somos capaces de traccionar esta nueva visión.

Entrada publicada en Sin categoría | Comentarios cerrados

API gateway architecture for microservices

Siguiendo con los anteriores artículos relacionados con los microservicios presentamos un nuevo diagrama de arquitectura de lo que se conoce como API-gateway. Que es una suerte de orquestador (y más) de las llamadas a distintos microservicios. En realidad las operaciones que realizan los microservicios suelen ser operaciones muy atómicas que aunque tienen valor de negocio necesitan ser orquestadas para poder representar una operación de negocio real.

Donde podemos ver a grandes rasgos la función de un API-Gateway. En el caso que nos ocupa en zylk.net para componer esta capa se va a usar, lo ya descrito anteriormente

Y el proyecto Hystrix de netflix. La idea es encapsular los servicios RCP con una capa de comandos hystrix para poder crear el API Gateway. Para la PoC que hemos definido se necesita

  1. Crear un primer comando hystrix que tarde en ejecutarse, pongamos 5 segundos
  2. Crear un segundo comando que tarde en ejecutarse 4 segundos

Una vez que tenemos esto, crearemos un cliente que invoque ambos comandos de dos maneras (existe una tercera basada en programación reactiva, que en este caso no vamos a usar) Síncrona

  • Síncrona

  • Asíncrona

Si ejecutamos ambos clientes podemos ver las diferencias de ejecución en ambos casos.

La verdad es que el proyecto hystrix de netflix es un gran proyecto que nos sirve para encapsular las llamadas a servicios de terceros. En este caso nos permite encapsular nuestros propios microservicios expuestos por yarn/avro-rpc. Además nos permite gestionar las asincronía y también implementa el patrón circuit-breaker, tan importante en los sistemas de información de nueva generación como los que empezamos a desarrollar en zylk.net

En este link os podéis descargar las 4 clases que se han usado para la PoC, para los que prefieren leer código.

Entrada publicada en Sin categoría | Comentarios cerrados

Visión general de una arquitectura de microservicios basada en yarn

Siguiendo con la evolución de las arquitecturas orientadas a servicios ... ahí va un gráfico que completa la visión general explicada en anteriores post

Los servicios son servicios modelados con avro/RP y pueden operar en tres modalidades

  • POJOs
  • Como servicio RPC en local
  • Como servicio RPC en un cluster de yarn (escalado, tolerancia a fallos etc..)
Entrada publicada en Sin categoría | Comentarios cerrados

Prototipando un servicio de validación de tickets usando códigos QR

El otro día me propusieron a ver si era posible desarrollar un servicio de validación de entradas, vamos a llamarlo, que permitiera validar las entradas y fuera ágil. El servicio debía cumplir las siguientes especificaciones

  • Estar en producción en 10-12 días
  • Permitir acceder al recinto usando una entrada impresa en papel
  • Permitir acceder al recinto usando la entrada sin imprimirla en papel
  • Comunicarse con los servicios centrales del cliente para integrar la información de quién había entrado y cuando

Nos pusimos a pensar y planteamos las siguientes ideas

  1. Papel/Móvil y Boli
  2. Papel/Móvil y Ordenador
  3. Papel/Móvil y lector de código de barras
  4. Papel/Móvil y móvil


Si alguna vez has estado en un evento en el que la lista de acceso se valida con papel y boli sabrás que tienen varias desventajas (pese a tener una gran ventaja ... que es no necesita desarrollo):

  • Si acude mucha gente no es fácil que todo el mundo le de tiempo a entrar antes de que empiece el evento
  • Si hay varias puertas …. el sistema tiene puntos de fallo si no se organiza quién entra por qué puerta

Por tanto las dos primeras opciones quedan descartadas.
Las otras dos que nos quedan estarían vinculadas al hecho de disponer de un lector de códigos de barras y un servicio que recoja la lectura y la envíe a algún lado.... Si descartamos la del lector porque habría que comprarlos etc... nos quedamos con que lo mejor sería desarrollar un poco más la cuarta opción a ver hasta donde nos lleva.

La opción cuarta aún así tiene una gran debilidad y es la de desarrollar la APP para el dispositivo móvil que permite validar la entrada. Con esto en mente desarrollamos los siguientes diagramas que nos permitían aclarar un poco el panorama .... pintar siempre es una buena idea




Donde se ve que necesitamos un sistema que genere códigos QR para las entradas y un QR que sirva para registrar el móvil que está haciendo de lector de QR. La idea es olvidarnos de desarrollar una app para el móvil y que de alguna forma cualquier móvil que tenga un cámara se puede usar como lector de QR.
 


Si no vamos a tener una app propia disponible tenemos que hacer que no todos los móviles sirvan para enviar la información al servidor, por un tema de seguridad principalmente. Además como queremos poder dar feedback a la persona que está en la puerta vamos a vincular el móvil con un PC que estará también en la puerta. Este gráfico representa cómo se ha diseñado el protocolo que vincula ambos dispositivos... Esto se haría una vez por cada puerta/persona que está validando los accesos.
Por último la fase de validación de las entradas



Donde vemos que la persona que va a entrar, presenta la entrada en la puerta. Esta entrada se escanea con el lector de QR estándar del móvil (hay muchos en el mercado) y al leer la URL que está en el QR la APP que ha leido el QR lanza el navegador con dicha URL que se procesa en el servidor. Esta URL genera una llamada de vuelta al PC vinculado a este móvil (paso 3.2-3.3) y el proceso de validación y registro se da por finalizado.


Ahora bien esto es en teoría y son papeles pintados … así que para probarlo hemos desarrollado una  PoC que usa los siguientes elementos

  • Librería ZXING para generara códigos QR
  • Servicios REST desarrollados usando JAXRS
  • WebSockets para comunicar eventos del servidor al cliente
  • Servidor tomcat 7

En total hemos desarrollado las siguientes clases java

  • QRGenerator
  • RegistService
  • WebSocketService

Con estas tres clases y el programa de lectura de QRs del móvil hemos hecho una PoC plenamente funcional que cumple los requisitos. (Hemos tardado 8 horas, post incluido). Evidentemente faltaría hacer bastantes cosas para poner el desarrollo en producción pero con esta orientación creemos que se podría hacer el proyecto en 10 -12 días

Las grandes ventajas que creemos que tiene este modelo son

  • Poco código desarrollado
  • No depende de una aplicación específica desarrollada para el móvil
  • Permite usar cualquier dispositivo con cámara como lector de códigos
  • Tiene un modelo de seguridad, que sin ser el más seguro del mundo, sirve.

Tiene muchos puntos de mejora está claro

  • Modelo de seguridad
  • Usar una APP propia para controlar mejor el feedback al usuario

En realidad el punto más fuerte de este modelo creemos que es que es facilmente convertible en un sistema de autenticación de dos fases … Adjunto el código del WAR de la PoC para el que tenga interés en ver el código.

Entrada publicada en Sin categoría | Comentarios cerrados