Hace unos días había tenido la necesidad de automatizar el envió de reportes en OTRS (3.1.2), lo que buscábamos era enviar el reporte de las actividades realizadas en los últimos N días, por ejemplo enviar automáticamente cada domingo por la noche un reporte semanal de los tickets creados en la semana actual.
El problema: Las estadísticas con objetos dinámicos no permiten especificar un parámetro como "LastWeek", solo permite dos opciones
- Definir un rango de fechas estéticamente.
- Dejar a elección del usuario escoger la fecha en la interface web.
¿Que pasa con el script de generación de estadísticas?
El script otrs.GenerateStats.pl recibe algunos parámetros como el ID de la estadística, el directorio destino donde colocara el archivo, el formato en que entregara la estadística (csv, pdf). Incluso una opción "-p" que recibe valores para Format, GraphSize, StatID y ExchangeAxis. Debo mencionar que esta parte tiene una documentación muy pobre.
Como la idea es automatizar el proceso, tenemos que pensar en cron job, pero cron implica otrs.GenerateStats.pl, y este ultimo no tiene el soporte que ocupamos, esperando que esta descripción sea clara ¿quien podrá ayudarnos?
La solución: Construcción de un script traductor.
En la base de datos de OTRS, las estadísticas se almacenan en "xml_storage", cada generación de estadísticas consultara las fechas primeramente en un cache y luego en la tabla
select * from xml_storage where xml_key=29
xml_type | xml_key | xml_content_key | xml_content_value |
Stats | 29 | [0]{'otrs_stats'}[1]{'UseAsRestriction'}[1]{'TimeStop'} | 2012-07-18 23:59:59 |
Stats | 29 | [0]{'otrs_stats'}[1]{'UseAsRestriction'}[1]{'TimeStart'} | 2012-07-11 00:00:00 |
Es recomendable crear un usuario en mysql con acceso de select/update a nuestra tabla y nada mas, este para ser usado en nuestro script. Con esta información preliminar les presento el script resultante:
#!/bin/bash ################################################ # Martin Edmundo, [ Julio 2012 ] # @martinedmundo # www.elrincondemartin.org # Funcion: Script de generacion de estadisticas # basado en los ultimos dias. # Release: OTRS 3.1.2 ################################################ #Definicion de variables usadas OTRS_DIR=/opt/otrs OTRS_BIN=$OTRS_DIR/bin BODYMAIL=/usr/local/sbin/bodymail.txt DBUSER='otrsstat' DBPASSWD='xxxxxx' DBNAME='otrs' DBTABLE='xml_storage' STATNUM=''; TARGETDIR=$HOME; DAYSNUM='7'; FILENAME=''; FILENAMESTAT=''; PREFIXFILENAMESTAT='Estad'; datestart='' datestop='' function phelp { echo -e "Usage: $0 -n-o -d | -h" echo -e " -n Numero de estadistica." echo -e " -o Directorio destino de la estadistica. [ Predeterminado: $HOME ]" echo -e " -d Rango de fechas de los utimos dias hasta hoy. [ Predeterminado: 7 ]" echo -e " -h Ayuda, este mensaje.\n" } function chdb { #Se define el rango de fechas para los ultimos DAYSNUM dias datestart=`date --date="-$DAYSNUM day" +"%F "`00:00:00; datestop=`date +"%F %H:%M:%S"`; #Limpiamos cache de estadisticas rm $OTRS_DIR/var/tmp/CacheFileStorable/XML/* 2> /dev/null #Actualizamos fechas de estadisticas mysql -u $DBUSER -p$DBPASSWD --database=$DBNAME --execute="UPDATE $DBTABLE SET xml_content_value='$datestart' WHERE xml_key=$STATNUM and xml_content_key LIKE '%TimeStart%'" mysql -u $DBUSER -p$DBPASSWD --database=$DBNAME --execute="UPDATE $DBTABLE SET xml_content_value='$datestop' WHERE xml_key=$STATNUM and xml_content_key LIKE '%TimeStop%'" } function sendmail_ { #Nos vamos al diretorio de los reportes cd $TARGETDIR #Se revisa los destinatarios de correo for mail in `cat $FILENAME`; do isComment=`echo "$mail" | cut -d "#" -f1` #Si no es un comentario, analizamos if [ -n "$isComment" ]; then #Se requiere mejorar la expresion regular para correo isMail=`echo "$mail" | grep ".*@.*"` #Enviamos correo electronico if [ "$?" = "0" ]; then ( echo -e "Reporte de actividades correspondientes al siguiente periodo: \n [ $datestart a $datestop ]"; uuencode $FILENAMESTAT Reporte_$STATNUM.pdf ) | mail -s "Servicios update" $mail else echo "Formato de correo desconocido: $mail" fi fi done } while getopts n:o:d:f:h OPT do case $OPT in n) STATNUM="$OPTARG" ;; o) TARGETDIR="$OPTARG" ;; d) DAYSNUM="$OPTARG" ;; f) FILENAME="$OPTARG" ;; h) phelp exit 0 ;; ?) phelp exit 1 ;; esac done if [ -z "$STATNUM" ]; then echo "*** Ocurrio un error o hace falta el parametro -n" phelp exit 1; fi #Se actualiza la base de datos chdb #Se genera el reporte rm $TARGETDIR/*.pdf 2> /dev/null FILENAMESTAT=`$OTRS_BIN/otrs.GenerateStats.pl -n $STATNUM -o $TARGETDIR -f Print 2> /dev/null | grep -o "$PREFIXFILENAMESTAT.*pdf"` #¿Quiere que se envie por correo? if [ -n "$FILENAME" ]; then if [ -f $FILENAME ]; then sendmail_ else echo "No existe el archivo $FILENAME" exit 1; fi fi exit 0;
Como lo usamos:
martinbarriga@monitoreo:/usr/local/sbin$ ./otrs.GenerateStats.sh -h Usage: ./otrs.GenerateStats.sh -n-o -d | -h -n Numero de estadística. -o Directorio destino de la estadistica. [ Predeterminado: /home/user ] -d Rango de fechas de los utimos dias hasta hoy. [ Predeterminado: 7 ] -h Ayuda, este mensaje.
No hay comentarios:
Publicar un comentario