miércoles, 30 de septiembre de 2009

NAGIOS 3.x - ARGUMENTOS HABILITADOS PARA NRPE

En muchas ocasiones tendremos que ejecutar un comando creado por nosotros al cual tenemos que agregarle argumentos para chequear:

Ejemplo:

/home/commands/check_nrpe -H 192.168.0.2 -p 5666 -c check_cimage -a 1233 122

Esto nos devolverá error porque no soporta argumentos.

para habilitar los argumentos enviados por NRPE cuando se compile nrpe se debe ejecutar con la siguiente instrucción:

./configure --enable-command-args

básicamente esto lo pongo porque me trajo muchos dolores de cabeza y se que lo voy a volver a necesitar y me voy a volver a olvidar.

Hernan Mazzeo

HOW-TO - CREANDO UN PLUGIN PARA NAGIOS

El nagios ya tiene varios plugins que se pueden descargar desde la página oficial.
No obstante en muchos casos tenemos que realizar chequeos especificos que no se pueden realizar  con los plugins genericos.
Por eso y porque un compañero vino hoy a preguntar como carajo hacía para hacer un chequeo que le habíamos pedido (Pepo, nuestro experimento fue un exito).

Los script pueden realizarse en cualquier lenguaje que pueda ejecutarse desde consola.

La lógica se puede hacer con un script común teniendo en cuenta que lo mas importante es lo que muestra en la salida y el exit que tenga siguiendo las relaciones de :

exit 0 - OK
exit 1 - WARNING
exit 2 - CRITICAL

Un ejemplo en bash para chequear si se están almacenando correctamente las imagenes de un determinado dispositivo:

#/bin/bash

#Le paso como argumento el nombre del monitor

MONITOR=$1
CMINIMA=$2
DIR_TEMP="/home/commands/tmp";

USER="root"
PASS="password"
BD="base"

#Obtengo el ID de la Camara
IDCAM=`echo "SELECT Id FROM tabla1 WHERE Name = '${MONITOR}'" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`


#Con el ID de la camara saco el ultimo evento cerrado y la cantidad de imagenes

UECLOSE=`echo "select Frames from tabla2 where MonitorId='${IDCAM}' and EndTime is not null order by StartTime desc limit 1" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`

UECLOSEDATE=`echo "select StartTime from tabla2 where MonitorId='${IDCAM}' order by StartTime desc limit 1" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`

UE=`echo "select Id from Events where MonitorId='${IDCAM}' order by StartTime desc limit 1" | /usr/bin/mysql -u $USER -p$PASS -D $BD --skip-column-names`
UESTORE=`cat $DIR_TEMP/ULTIMO_VENTO_$IDCAM`;

if [ $UE -eq  $UESTORE ]
then

        UFTAM=`du -sk /var/www/html/events/${IDCAM}/${UE} | awk '{print $1}'`;


        AFTAM=`cat $DIR_TEMP/GRABA_CAM_$IDCAM`;

        echo $UFTAM > $DIR_TEMP/GRABA_CAM_$IDCAM

        if [ $UFTAM -eq  $AFTAM ]
                then
                RESPONDE="7";

     else
                RESPONDE="9";
        fi
else
        UFTAM=`du -sk /var/www/html/events/${IDCAM}/${UE} | awk '{print $1}'`;
        echo $UFTAM > $DIR_TEMP/GRABA_CAM_$IDCAM
        RESPONDE="9";
fi

#echo "---------------------------";
#echo "DEBUG";
#echo "---------------------------";
#echo "ULTIMO EVENTO" $UESTORE
#echo "EVENTO ACTUAL" $UE
#echo "TAMANO ANTERIOR" $UFTAM
#echo "TAMANO ACTUAL" $AFTAM
#echo "ESTADO DE GRABACIONES" $RESPONDE;
#echo "---------------------------";


echo $UE > $DIR_TEMP/ULTIMO_VENTO_$IDCAM

if [ $RESPONDE -eq 9 ]
then

        if [ $UECLOSE -lt $CMINIMA ]
        then
                 echo "ALERTA - ${UECLOSE} IMAGENES EN EL ULTIMO EVENTO CERRADO";
        exit 1

                echo "OK - ${UECLOSE} IMAGENES / ${UECLOSEDATE} FECHA ULTIMO EVENTO";
                exit 0

        else
                echo "OK - ${UECLOSE} IMAGENES / ${UECLOSEDATE} FECHA ULTIMO EVENTO HM";
                exit 0
        fi
else
        RCAM = `/usr/local/bin/zmdc.pl restart zmc -m $IDCAM`;
        echo "ALERTA - UE:${UESTORE} / ${UECLOSEDATE} FECHA ULTIMO EVENTO";
        exit 2
fi


Esto lo ponemos dentro de un archivo que se situará (en instalación default) /usr/local/nagios/libexec/
Se le darán permisos de ejecución correspondientes y se lo asociará al grupo que lo pueda ejecutar sin problemas.

Una vez realizado esto se debe generar el comando:

/usr/local/nagios/objects/commands.cfg

define command{
command_name check_cimage
command_line /home/commands/check_cimage $ARG1$ $ARG2$
}


Con eso se realizará el chequeo que necesitemos sin problemas.


Hernán Mazzeo

INCURSIONANDO EN PLSQL (ORACLE 10g)

En la empresa donde trabajo, terminamos hace poco una implementación de una plataforma para la administración de Call Centers.
Esta plataforma se llama CCA y es de Oracle.

Mi responsabilidad en el proyecto era la integración con el sistema CRM con el que actualmente trabajamos.

Una de las partes fue la actualización de la base de datos y debiamos hacerlo sin que la tabla se quede en 0 en ningun momento, ya que esta tabla es con la que consulta la plataforma para que el cliente ingrese al sistema.

A continuación vamos a explicar la lógica y el mecanismo ya que puede servir para otras aplicaciones:

ORACLE TO ORACLE:

1) Dentro de CCA creamos un DBLINK a la vista de nuestro CRM.
2) Dentro de CCA creamos la tabla IVR_CLIENTES (esta será la que contenga los datos que traigamos de nuestro CRM.
3) Dentro de CCA creamos una tabla IVR_CLIENTES_TMPO, la misma se utilizará de temporal.
4) Para actualizar cada 2 horas básicamente teníamos que armar un plsql que modifique el nombre de las tablas y evite tener que borrar los datos para cargarlos nuevamente (lo que generaría un vacio con posibles error de autentificación).

creamos un archivo ejecuta.sql.

adentro ponemos el siguiente codigo:
Obviar comentarios en rojo, son solo para indicar que se hizo.

Declaro variables
DECLARE
c_registros_A NUMBER(10);
c_registros_B NUMBER(10);
sql_drop VARCHAR2(255);
sql_alter VARCHAR2(255);
sql_create VARCHAR2(255);
sql_truncate VARCHAR2(255);
Hago un insert into select, consiste en hacer un insert en base a un select a otra tabla, en este caso un dblink con el formato CLIENTES_CRM_VIEW@TFLP

BEGIN
INSERT INTO IVR_CLIENTES_TMPO SELECT * FROM IVR_CLIENTES_CRM_VIEW@TFLP;
Básicamente aca cuento los registros, teniendo en cuenta que esta base siempre debe crecer y jamás tener menos registros.
SELECT COUNT(*) INTO c_registros_A FROM IVR_CLIENTES;
SELECT COUNT(*) INTO c_registros_B FROM IVR_CLIENTES_TMPO;
Analizo si me traje mas registros que los que hay ahora.
IF c_registros_B >= c_registros_A THEN
Si es así borro la tabla anterior y modifico el nombre de la vieja.
sql_drop := 'DROP TABLE IVR_CLIENTES';
sql_alter := 'ALTER TABLE IVR_CLIENTES_TMPO RENAME TO IVR_CLIENTES';
Creo nuevamente la base temporal para la próxima corrida.
sql_create := 'CREATE TABLE IVR_CLIENTES_TMPO AS SELECT * FROM IVR_CLIENTES';
Le borro el contenido.
sql_truncate := 'TRUNCATE TABLE IVR_CLIENTES_TMPO';
Ejecuto los comandos.
EXECUTE IMMEDIATE sql_drop;
EXECUTE IMMEDIATE sql_alter;
EXECUTE IMMEDIATE sql_create;
EXECUTE IMMEDIATE sql_truncate;
IMPORTANTE EL COMMITTTTTTT !!!!!!
COMMIT;
END IF;
END;
/

finalmente otro archivo que lo ejecute (utilizando sqlplus):

replica.sh

#!/bin/bash

sqlplus -l REP_10CRM/password@ORCL @ejecuta.sql <
EXIT

y lo croneamos:

[oracle@cca-db1 ~]$ crontab -l
* */1 * * * /bin/sh /home/oracle/replica.sh

Hernán Mazzeo