Implementar post procesos en Prontus

Este artículo sirve como orientación para implementar post procesos en Prontus. Se detallan los pasos necesarios que el desarrollador debiese conocer para llevar a cabo esta tarea.
Introducción a los post procesos

Como su nombre lo indica, los post procesos son scripts que se ejecutan luego de un proceso general, por ejemplo guardar una portada o guardar un artículo. Un ejemplo de post proceso podría ser un script llamado "prontus_ppart_crearunlog.cgi", el cual se gatillaría al guardar un artículo. Los scripts a usar como post procesos generalmente deberían escribirse en Perl, pero también es posible implementarlos en otros lenguajes. A continuación se detallan elementos elementos importantes  a la hora de implementar estas soluciones.

Tipos de post proceso

Actualmente Prontus permite utilizar tres tipos de post proceso distintos:

  • post procesos de artículo
  • post procesos de portada
  • post procesos de eliminación
¿Cómo efectuar una llamada a un post proceso en nuestro proyecto?

Para efectuar una llamada a un post proceso se utiliza una marca especial en una plantilla de portada, plantilla de artículo o FID (dependiendo de la release de Prontus instalada en su sitio), la cual al ser evaluada gatillará la ejecución del script indicado. La marca a utilizar concretamente es:

< !--POST_PROCESO=nombre_del_post_proceso-- >

Esta marca está compuesta por la palabra reservada "POST_PROCESO" y el nombre del script a ejecutar "nombre_del_post_proceso"; todo esto debe estar encerrado entre las etiquetas "< !-- -- >".

El nombre del script debe incluir la ruta relativa a la carpeta cgi-cpn o cgi-cx. Se pueden pasar parámetros adicionales al post proceso agregándolos a la invocación, tomando esto en cuenta, una invocación a un postproceso ubicado en cgi-cpn/pproc quedaría así:

< !--POST_PROCESO=pproc/demo_ppart_prueba.cgi param1 param2-- >

Si necesita utilizar múltiples post procesos en una plantilla de artículo, debe poner tantas marcas como post procesos necesite:

< !--POST_PROCESO=postproceso_1.cgi-- >
< !--POST_PROCESO=postproceso_2.cgi-- >
< !--POST_PROCESO=postproceso_n.cgi-- >
Estándares de código y nomenclatura para los post procesos

Los post procesos normalmente deben ser scripts creados con Perl, y la extensión del script debe ser .CGI. Dependiendo del tipo de post proceso, el nombre del script deberá ser:

  • < nombre_corto_del_proyecto >_ppart_< nombre_descriptivo >.CGI para post procesos de artículo.
  • < nombre_corto_del_proyecto >_ppport_< nombre_descriptivo >.CGI para post procesos de portada.
¿Dónde deben ir las marcas de post proceso?

Según el tipo de post proceso (Articulo, Portada, Eliminación) las marcas deben ubicarse en:

  • Post proceso de Artículo: Debe ir en la plantilla del artículo, bajo el TAG HTML
  • Post proceso de Portada: Debe ir en la plantilla de portada bajo el TAG HTML
  • Post proceso de Eliminación: desde la release Prontus 10.11.RC1, deben indicarse en el archivo de configuración < Nombre Prontus >-var.cfg
¿Dónde deben quedar alojados los Post Procesos?

El script del post proceso deben quedar dentro del directorio de las CGI (directorio activo) del sitio Prontus. Para conocer cual es su directorio activo, dirigirse a:

< server_name >/web/< nombre_prontus >/cpan

Seleccione el archivo < dir_cgi.cfg > o < dir_cgi.js >, el cual especifica el directorio activo de las CGI para el sitio.

Importante: Sin embargo, recordar que desde esa ruta "hacia arriba" serán buscados los postprocesos, pero dada la organización establecida para directorios en Prontus, los Post Procesos no deben ir "sueltos" en la carpeta cgi de administración.

  • Si son producto de algún subsistema, deben ir dentro de su respectiva carpeta.
  • Si son de uso común, deben ir dentro de la carpeta /pproc/
Programación de post procesos

Un post proceso puede tener diferentes propósitos, sin embargo en la etapa de construcción del script, debe tener al menos las siguientes líneas de código:

  • Documentación del post proceso (Fecha de creación, autor, propósito, versión, dónde aplica, etc.)
  • Datos del log de errores, por ejemplo, "el script genera los errores en el siguiente error-log:"
    /cgi-cpn/prontus_temp/prontus_ppart_crearunlog.cgi.error.log

Para ello se deben incluir en su script las siguientes líneas de código, adicionalmente se puede modificar el destino del error log.

BEGIN {
my $pesoscero = $0;
$pesoscero =~ s/(\w+\.cgi)$/prontus_temp\/\1/;
open (STDERR, " >$pesoscero.error.log");
};

Con lo anterior el error log quedará alojado en el directorio prontus_temp, y el nombre del archivo de log será el nombre del script con el sufijo .error.log.

Si se necesita hacer un unshift a @INC para dejar disponibles librerías, se puede hechar mano a la variable predefinida $Bin, la cual entrega el path al directorio en donde se encuentra la CGI del PP.

El log creado de esta forma se sobreescribirá cada vez que el post proceso sea ejecutado, por lo que en caso de error no permitiría ver hacia atrás las posibles causas o efectos secundarios del error. Por ello se recomienda inicializar el script de la siguiente forma:

BEGIN {
 use FindBin '$Bin';
 my $pathLibs = $Bin;
 unshift(@INC,$pathLibs); # Para dejar disponibles las librerias de pproc
 $pathLibs =~ s/\/pproc$//; #carpeta de ubicacion del postproceso
 unshift(@INC,$pathLibs); # Para dejar disponibles las librerias de prontus
 use lib_stdlog;
 &lib_stdlog::set_stdlog($0, 51200);
};

Así se utilizan las librerías Prontus para generar un log histórico rotativo, esta forma de inicializar el script deja disponibles librerías adicionales que se encuentren en el mismo directorio del post proceso, y las librerías de Prontus ubicadas en cgi-cpn o cgi-cx para poder utilizarlas en el script. Por estas razones se recomienda utilizar esta inicialización sobre la anterior.

Parámetros recibidos por el script del Post Proceso

Un post proceso recibe dos parámetros de entrada (post procesos de portada) o tres (post procesos de artículo) por defecto, estos son pasados al script cuando se lee la marca Prontus y se llama a su ejecución (NO son parámetros ingresados por el usuario al incrustar la marca en el código). Estos parámetros por defecto van luego de eventuales parámetros adicionales pasados en el artículo.
Los parámetros que van por defecto son:

Post Proceso de Portada:

$ARGV[N] = Server Name o IP (por ejemplo, www.mipagina.cl)
$ARGV[N+1] = Ruta hacia el Archivo de Portada (por ejemplo, /sites/mipagina.cl/web/prontus_mp/site/edic/base/port/ppagina.html)

Post Proceso de Artículo:

$ARGV[N] = Ruta hacia el Archivo del Artículo (por ejemplo, /sites/mipagina.cl/web/prontus_mp/site/artic/20050927/pags/20050927151853.html)
$ARGV[N+1] = Server Name o IP (por ejemplo, www.mipagina.cl)
$ARGV[N+2] = indicador del tipo de edición del artículo N (artículo nuevo) o E (artículo editado)

Donde "N" es el número de parámetros adicionales pasados en la plantilla. Por ejemplo, si pasara al postproceso 3 parámetros adicionales, estos estarían en $ARGV[0], $ARGV[1], $ARGV[2]; y los parámetros por defecto se encontrarían desde $ARGV[3] en adelante.

Un ejemplo de código útil para leer los parámetros estándar para post procesos de artículo sería el siguiente:

my $args = scalar @ARGV;
$parametros= $ARGV[$args - 4]; # Parámetros adicionales
$origen = $ARGV[$args - 3];# Ruta hacia el Archivo del Artículo (por ejemplo, /sites/mipagina.cl/web/prontus_mp/site/artic/20050927/pags/20050927151853.html)
$server = $ARGV[$args - 2]; #Server Name o IP (por ejemplo, www.mipagina.cl)
$mode = $ARGV[$args - 1]; #Indicador del tipo de edición del artículo N (artículo nuevo) o E (artículo editado)

Post Procesos en PHP

Es posible ejecutar post procesos escritos en el lenguaje PHP. Para hacer una llamada a un post proceso programado en PHP, se utiliza el método denominado "Trampolín", en la cual una CGI Perl ejecuta la llamada al script PHP mediante la instrucción system.
Esta modalidad se lleva a cabo de la siguiente manera:

  1. Agregar en la plantilla de portada o en la plantilla de artículo la marca de post proceso
    < !--POST_PROCESO=nombre_del_post_proceso.cgi-- >
  2. Asignar un nombre al post proceso en Perl (que debe tener extensión CGI) que usará como trampolín. Esta CGI debe quedar alojada en el directorio de scripts Perl del sitio. Al dar nombre al post proceso conviene seguir el estándar definido en este artículo.
  3. El código de este script, deberá incluír como mínimo los siguientes ítems:
    • Directiva de compilación Perl "!/usr/bin/perl"
    • Documentación del post proceso
    • Sentencias para recibir los argumentos por defecto, siempre que los utilice.
    • Llamada al script PHP mediante instrucción System, enviar entre comillas el path donde se encuentra el intérprete PHP, el path con dirección absoluta del script PHP y por último los parámetros al script (estos pueden ser opcionales).
#!/usr/bin/perl
# Nombre de script : toolbox_ppart_generaListadoArtics.cgi
# Parámetro Entrada : $path, $host
# Parámetro Salida : -
# Autor : ABC
# Fecha creación : 18/12/2012
# Fecha ult. Modificación : -
# Objetivo : Ejecuta la llamada a sistema para invocar la  
#    función toolbox_listado_artics_general.php
my ($path, $host) = @_;
system "/usr/local/bin/php /sites/toolbox.cl/web/cgi-php/toolbox_ppart_guarda.php &";

Los scripts PHP deben quedar en la ruta  < Nombre_sitio >/web/cgi-php/

Post Procesos de Eliminación

Los post procesos de eliminación se definen en el archivos de configuración del prontus

< nombre_sitio >/web/< nombre_prontus >/cpan/< nombre_prontus >-var.cfg

Cabe notar que solo puede haber un post proceso de eliminación, que se define en este archivo.

Para detallar un post proceso de eliminación, escribir la palabra reservada "POST_PROCESO", luego el tipo de post proceso, que siempre debe ser ART-BORRAR, y por último entre paréntesis el nombre de la CGI que corresponde al post proceso. Por ejemplo:

POST_PROCESO = 'ART-BORRAR (ads2_delete_banner.cgi)'
[Marca] = [tipo]([nombre_de_la_CGI])

Un post proceso de eliminación se ejecuta una vez que se procede con el proceso de eliminación de un artículo. Por esto, si usted necesitará ejecutar alguna acción a partir de la eliminación de un artículo, podría hacer uso de este tipo de post proceso, por ejemplo para generar un log de eliminaciones de artículos.

Parámetros de entrada del Post Proceso de eliminación

$ARGV [0] =  Ruta a archivo temporal con los artículos eliminados
$ARGV [1] =  Nombre del prontus dir, por ejemplo 'prontus_noticias'
$ARGV [2] =  Nombre del host o dominio

Ejecución de los post procesos

Cada distinto tipo de post proceso se gatillará cada vez que se ejecute la acción correspondiente en el sitio, por ejemplo, al guardar, al editar, en una operación de borrado, etc.