jueves, 19 de julio de 2012

Otrs stat from last week, last month, last everyday


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_typexml_keyxml_content_keyxml_content_value
Stats29[0]{'otrs_stats'}[1]{'UseAsRestriction'}[1]{'TimeStop'} 2012-07-18 23:59:59
Stats29[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.

lunes, 2 de julio de 2012

Resultados Elecciones 2012

Como parte de mi compromiso social con mi patria el pasado 1 de Julio fui a votar y el día 2 de Julio a verificar los resultados con los registrados por el PREP. Esto ultimo por que encontré algunas imágenes compartidas en las redes sociales donde se pone en evidencias supuestas anomalías en el proceso de contabilización.

Basado en esta información me decidí a tomar una muy pequeña muestra de mis distritos vecinos para validar la veracidad de los números mostrados en el PREP. No encontré ningún error, en mi pequeña muestra, les paso las imágenes para que uds. mismos las verifiquen en [ aqui ] y corresponden al estado de Michoacan:

Sección: 1148, Casilla contigua


Sección: 1150, Casilla básica



Sección: 1151, Casilla básica y contigua



Sección: 1152, Casilla básica y contigua



Sección: 1153, Casilla básica y contigua



Sección: 1154, Casilla básica


También revise la sección 1149 pero ya se habían robado los resultados, incluso de la 1148 tampoco estaba los resultados de la casilla básica, mi revisión la realice en la mañana.  Debo agregar que me interese por hacer esta tarea debido a las fotos que circulan en las redes sociales y las cuales no coinciden con los datos del PREP donde en el mejor de los casos se trata de errores de captura (para no pensar que existe malas intenciones en afectar un resultado en favor de algún candidato):

DISTRITO FEDERAL
Distrito 25 - IZTAPALAPA
Sección 2937


DISTRITO FEDERAL
Distrito 04 - IZTAPALAPA
Sección 2641
Nota: compartida por @joseluigarcia


NUEVO LEÓN
Distrito 07 - MONTERREY
Sección 1076


OAXACA
Distrito 11 - SANTIAGO PINOTEPA NACIONAL
Sección 2062
NOTA: Esta ya se ha corregido en PREP.


SAN LUIS POTOSÍ
Distrito 02 - SOLEDAD DE GRACIANO SANCHEZ
Sección 1257

TABASCO
Distrito 06 - CENTRO
Sección 0389
Nota: Se corrige el valor anterior de 11, pero ahora actualizan con 112

Si alguien tiene información de errores en la captura del PREP, por favor compartan.