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

domingo, 27 de septiembre de 2009

OPERACIONES BASICAS CON VIM

Escribiendo el articulo anterior me pareció interesante resumir alguna funciones básicas a realizar con el vim.

Para Escribir/Salir:


:q Salir del editor sin guardar quit
:q! Salir del editor sin guardar ni pedir confirmación quit ya!
:wq! Salir del editor guardando sin pedir confirmación write & quit ya!
:w f2.txt Guardar en un fichero llamado f2.txt y seguir write en f2.txt
:e f1.txt Cierra el fichero actual y abre f1.txt edit f1.txt

Operaciones de Texto:


dd Suprimir línea actual al buffer (p para pegar) delete
u Deshacer el último cambio en el fichero undo
CTRL+R Rehacer el último cambio en el fichero redo
guu Convertir a minusculas la línea actual lowercase
gUU Convertir a mayúsculas la línea actual UPPERCASE
:num Posicionarse en la línea num del fichero
gg Posicionarse al principio del fichero
G Posicionarse al final del fichero
ga Muestra código ASCII, hex y octal del caracter actual

Buscar y reelmplazar

Para buscar un texto, escribimos (en modo normal, pulsando antes ESC si estamos en modo edición) la secuencia /palabra. Veremos que se resalta la palabra encontrada (o nos avisa de que no existe). Entonces podemos seguir buscando la próxima coincidencia pulsando n o buscarla hacia detrás pulsando N.
Para sustituir un texto debemos escribir la secuencia :%s/texto1/texto2/g, donde texto1 es el texto a buscar y texto2 el texto que será reemplazado. Si incluimos la g final (global), sustituirá todas las coincidencias que encuentre, sino sólo la primera que encuentre.


Fijar Preferencias:

:set ts=3 Fija los tabulados a 3 espacios
:set sw=3 Fija los indentados a 3 espacios
:set number/nonumber Activa/desactiva el numerado en los ficheros
:set backup/nobackup Activa/desactiva la copia de seguridad automática
:set directory=dir Fija la carpeta donde se harán las copias
:syntax on/off Activa/desactiva el resaltado de sintaxis
:color esquema Cambia color del vim (evening, darkblue, desert, elflord, koehler, morning...)
:set cindent Activa indentado automático
:set mouse=a/mouse= Activa/desactiva el uso del ratón
:set paste/nopaste Activa/desactiva el modo pegar texto literalmente
:spell Activa el corrector ortográfico
:setlocal spell spelllang=es Activa el idioma español del corrector ortográfico
:set spellfile=~/.vimdic Fija diccionario de palabras desconocidas


Algunas opciones avanzadas:

=G Indenta automáticamente todas las líneas de un fichero
{} Detecta donde está la llave mal cerrada del párrafo actual
:g/^\s*$/d Elimina las líneas en blanco de un fichero

COLOREANDO EL VIM

Para los que les gusta programar o editar archivos desde el vim y quieren que le coloreen los archivo interpretando las instrucciones del lenguaje deben realizar los siguientes pasos:

nagios-mon:/var/www# vim /etc/vim/vimrc


Dentro del archivo vimrc descomentar "syntax on".


Y listo...
ahora que editemos cualquier archivo nos coloreará la sintaxis.

Otra forma es que si lo queremos hacer por única vez:

Una vez dentro del archivo seguir las siguientes acciones:

:syntax on

Y para sacar el coloreado:

:syntax off

Esperemos les haya servido..

Hernan Mazzeo

viernes, 25 de septiembre de 2009

CAMBIAR COLOR Y FORMATO DEL PROMPT EN LINUX - Debian 5

En muchos casos es muy util poder identificar equipos por el nombre de su prompt en consola, incluso cambiar el color.
Muchos usuarios lo utilizar para poder diferenciar su consola de usuario de la consola de root.
En fin, vamos a explicar a continuación como se cambia el color y los datos que muestra el prompt.

El prompt es definido en la viarable de entorno PS1.

En primera instancia pondremos las letras y su representación en la variable PS1.






\a
carácter de campana ASCII (07)
\d
la fecha en el formato "DíaDeLaSemana Mes DíaDelMes" (p.e., "Tue May 26")
\e
carácter de escape ASCII (033)
\h
el nombre de host a partir del primer '.'
\H
el nombre de host
\j
el número de trabajos de la shell
\l
el número de la shell activa
\n
nueva línea
\r
retorno de carro
\s
el nombre de la shell
\t
la hora en formato 24-horas HH:MM:SS
\T
la hora en formato 12-horas HH:MM:SS
\@
la hora en formato 12-horas am/pm
\u
el usuario activo
\v
la versión de bash (p.e., 2.00)
\V
la release de bash, versión + patchlevel (p.e., 2.00.0)
\w
la ruta completa del directorio de trabajo actual
\W
el directorio de trabajo actual
\!
el número en el historial de este comando
\#
el número de comando
\$
si el UID es 0, visualiza #, si no lo es, visualiza $
\nnn
el carácter correspondiente al número octal nnn
\\
contrabarrra
\[
comienza una secuencia de caracteres no imprimibles que puede usarse para ejecutar un comando en el prompt
\]
finaliza una secuencia de caracteres no imprimibles







Para cambiar el prompt en la sesion activa basta con poner:

[hmazzeo@JENNY ~]$ PS1="[\u@\h \W\]$ "
[hmazzeo@hmazzeo-laptop ~$

Como verán en la segunda linea el prompt cambia.

También se le puede cambiar el color:






Negro
0;30
Gris Oscuro
1;30
Azul
0;34
Azul Claro
1;34
Verde
0;32
Verde Claro
1;32
Cyan
0;36
Cyan Claro
1;36
Rojo
0;31
Rojo Claro
1;31
Morado
0;35
Morado Claro
1;35
Marrón
0;33
Amarillo
1;33
Gris Claro
0;37
Blanco
1;37



Para ponerle colores solo hay que usar '\[033[bb;c;ccm\]', donde 'bb' será el color de fondo, y 'c;cc' el color del texto. Hay que destacar que una vez puesto lo anterior se mantiene durante todo el prompt así que hay que usar varias veces el '\[033'.

Es importante que al final del prompt se ponga algo como: '\[\033[0;0m\]', ya que eso reestablece todo al color default.




Para poder dejarlo como default para cada sesion ssh que se establezca se debe dejar asentado en el archivo .bashrc ubicado en el home del usuario para el cual se quiere cambiar el bash.

En mi caso /home/hmazzeo/.bashrc

Reemplazo todas las lineas que aparece PS1 por la siguiente variable (esto es mi prompt)

PS1="\[\033[1;33m\][\[\033[1;34m\]\u\[\033[1;37m\]@\[\033[1;34m\MAQ\[\033[0;1;33m\]\w\[\033[0;1;37m\]]\$ \[\033[0;0m\]"

Esperemos que les sea de utilidad.

Nos vemos el próximo post.

Saludos,

Hernan Mazzeo




jueves, 24 de septiembre de 2009

HOW-TO (Instalación de Nagios 3.x con NDOUtils) Mysql

Objetivo:



A continuación realizaremos un instructivo de la instalación de un Nagios 3.x en Debian 5 con NdoUtils.


Introducción:


Basicamente esto surgió de la necesidad de instalar un Nagios que guarde los datos en un Mysql para luego poder ser utilizado por otra aplicación que tome esos datos y los maneje dinamicamente.


Aquí no se verán muy pocas cosas de configuración, ya que el objetivo de esta entrada es la instalación y comprobación de funcionamiento.


Explicación:

1) Creamos los usuarios necesarios


debían# useradd nagios
debían# groupadd nagios
debían# groupadd nagcmd
debían# usermod -a -G nagcmd nagios
debían# usermod -a -G nagcmd www-data

2) Instalamos los paquetes que necesitamos para la instalacion.


debían# apt-get install libg2-dev pkg-config libglib2.0-dev libapache2-mod-php5


3) Descargamos y compilamos el nagios 3.x


En primera instancia descargamos en /home/ el .tar del nagios y lo descomprimimos.


debían# cd /home/
debían-/home/# tar xzf nagios-3.0.6.tar.gz
debían-/home/# cd nagios-3.0.6
debían-/home/nagios-3.0.6/# ./configure —with-command-group=nagcmd
debían-/home/nagios-3.0.6//# make all
debían-/home/nagios-3.0.6# make install
debían-/home/nagios-3.0.6# make install-init (Opcional – Instala el script de inicio)
debían-/home/nagios-3.0.6# make install-config (Opcional – instala configuraciones de ejemplo)
debían-/home/nagios-3.0.6# make install-commandmode (Opcional – Instala commandos de ejecucion)
debían-/home/nagios-3.0.6# make install-webconf (Opcional – Configura el Apache2)
debían-/home/nagios-3.0.6# htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin (Requerido – Genera el password para ingresar al Nagios)
debían-/home/nagios-3.0.6# /etc/init.d/apache2 reload (Requerido – Toma las configuraciones)


Se recomienda que todos los comandos opcionales sean ejecutados para una mejor performance.


 4) Instalaremos los plugins del nagios que serán los que se encargarán de realizar los chequeos, estos plugins (ej: check_ping, check_tcp) son los comandos que se ejecutan con diferentes parámetros y nos dan una respuesta.


Estos, pueden ser programados en base a nuestras necesidades, otro día mostraremos un ejemplo de la programación en bash de un script para el chequeo en Nagios.


Descargaremos en /home/ el .tar de los plugins.


debían# cd /home/
debían-/home/# tar xzf nagios-plugins-1.4.11.tar.gz
debían-/home/# cd nagios-plugins-1.4.11
debían-/home/nagios-plugins-1.4.11# ./configure —with-nagios-user=nagios —with-nagios-group=nagios
debían-/home/nagios-plugins-1.4.11# make
debían-/home/nagios-plugins-1.4.11# make install


5) Debemos poner que nagios se ejecute siempre al inicio del sistema:


debían-/home/nagios-plugins-1.4.11# update-rc.d nagios defaults


6) Instalación de NODUTILS para la conexión a la base de datos.


Primero vamos a instalar las librerías developer de mysql. (ndo debe cambiarse por la carpeta que genere la descompresión del tarball).


debían# apt-get install libmysqlclient-dev
debían# cd /home/
debían-/home/# cd ./ndo/
debían-/home/ndo/# ./configure
debían-/home/ndo/# make
debían-/home/ndo/# cp src/ndomod-3x.o /usr/local/nagios/bin/
debían-/home/ndo/# cp config/ndomod.cfg /usr/local/nagios/etc/
debían-/home/ndo/# cp src/ndo2db-3x /usr/local/nagios/bin/
debían-/home/ndo/# cp config/ndo2db.cfg /usr/local/nagios/etc/
debían-/home/ndo/# cd db/

7) Creamos un usuario y una base de datos de nombre nagios, ya sea mediante phpMyAdmin o linea de comandos en MySql y ejecutamos:


debían-/home/ndo/db/# mysql –u root –p(ponerlaclavederoot)
mysql> CREATE DATABASE nagios;
mysql> exit;


debían-/home/ndo/db/# ./installdb -u nagios -p password_del_usuario_nagios -h localhost -d nagios


8) Hacemos un par de modificaciones en la configuración.


debían-/home/ndo/db/# vim /usr/local/nagios/etc/ndomod.cfg


modificar los dos campos siguientes si es que están distintos:


output_type=unixsocket
output=/usr/local/nagios/var/ndo.sock


debían-/home/ndo/db/# vim /usr/local/nagios/etc/ndo2db.cfg


modificar los dos campos siguientes si es que están distintos:


también modificar el usuario y clave de acceso a mysql.


socket_type=unix
socket_name=/usr/local/nagios/var/ndo.sock
db_user=nagios
db_pass=contraseña_del_nagios


debían-/home/ndo/db/# vim /usr/local/nagios/etc/nagios.cfg


modificar los dos campos siguientes, en caso que no estén agregarlos:


broker_module=/usr/local/nagios/bin/ndomod-3x.o config_file=/usr/local/nagios/etc/ndomod.cfg

OJO, TODA LA LINEA ANTERIOR DEBE ESTAR EN LA MISMA LINEA!!!


9) Iniciamos en Modulo NDO


debían-/home/ndo/db/# /usr/local/nagios/bin/ndo2db-3x -c /usr/local/nagios/etc/ndo2db.cfg

Cada vez que reiniciemos Nagios se reiniciará el daemon de ndo.


Bueno, espero que les haya sido de utilidad y cualquier problema que tengan por favor consulten…


Hasta la próxima!!!


Hernan Mazzeo