sábado, 3 de octubre de 2009

CRONTAB - EJECUTAR TAREAS DESDE ROOT CON OTRO USUARIO

En muchas ocasiones nos es necesario tener que ejecutar desde el corntab de root tareas con otro usuario para que cree los permisos de acceso necesarios para su ejecución.

Un ejemplo claro que ocurrió hace poco es la ejecucion de un script que corria como root y generaba directorios entre otras cosas como ese usuario, luego el apache y otras aplicaciones no le daban acceso.

Para solucionar este problema basta solamente con poner delante de la tarea del crontab el usuario con el que lo queremos ejecutar.

Ej:

 */5 * * * * www-data /usr/bin/php -q /var/www/dvr/servidor/111.php >> /var/log/111.log

Esto ejecutará la tarea del cron con el usuario indicado.

NOTA IMPORTANTE: Para que funcione esto no se debe realizar con el comando crontab -e, sino que deben editar el archivo /etc/crontab.

Basicamente porque cuando ejecutamos crontab -e, estamos entrando al crontab del usuario que estamos.

cuando editamos el archivo /etc/crontab estamos trabajando sobre el crontab del sistema.


Hernan Mazzeo

viernes, 2 de octubre de 2009

NETWORKING - CAMBIAR IP y GW de CONSOLA EN UN LINUX

Muchas veces sucede que las herramientas de configuración de RED no funcionan por diversos motivos.

Siendo la única salida cambiar la IP y el GW por consola.

[root@TWITTER /]$ ifconfig eth0 192.168.1.40 netmask 255.255.255.0
[root@TWITTER /]$ route add default gw 192.168.1.254 eth0



Hernan Mazzeo

jueves, 1 de octubre de 2009

BLACKBERRY - Sincronizar una blackberry en Linux con Evolution. (BARRY)

Este instructivo se hizo en base a Ubuntu.
con barry.

funciona perfectamente.

1º) Instalo dos paquetes necesarios.

[hmazzeo@TWITTER ~]$ apt-get install opensync-plugin-evolution
[hmazzeo@TWITTER ~]$ apt-get install multisync-tools

2º) Descargo los siguientes paquetes (pueden instalar también los que vienen con la nueva version de ubuntu en los repositorios, pero estos estoy seguro que funcionan, los otros no).

Una vez descargados los pueden ejecutar haciendo doble click y con el gestor de paquetes synaptics.

http://downloads.sourceforge.net/barry/libbarry_0.13-1.2_i386.deb?modtime=1217433545&big_mirror=0

http://downloads.sourceforge.net/barry/barrybackup-gui_0.13-1.2_i386.deb?modtime=1217433325&big_mirror=0

http://downloads.sourceforge.net/barry/barry-util_0.13-1.2_i386.deb?modtime=1217433460&big_mirror=0

http://downloads.sourceforge.net/barry/libbarry-dev_0.13-1.2_i386.deb?modtime=1217433629&big_mirror=0

http://downloads.sourceforge.net/barry/libopensync-plugin-barry_0.13-1.2_i386.deb?modtime=1217433710&big_mirror=0

3º) Una vez instalados todos los paquetes ejecutamos los siguientes comandos:

[hmazzeo@TWITTER ~]$ msynctool --addgroup Blackberry
[hmazzeo@TWITTER ~]$ msynctool --addmember Blackberry barry-sync
[hmazzeo@TWITTER ~]$ msynctool --addmember Blackberry evo2-sync
[hmazzeo@TWITTER ~]$ msynctool --showgroup Blackberry

[hmazzeo@TWITTER ~]$ msynctool --configure Blackberry 1

Ahi busco la linea que diga

Device xxxxxxxxx 1 1

y reemplazo el xxxxxxxx por nuestro numero de PIN*.

* Para encontrar el numero de PIN de nuestro dispositivo vamos a herramientas de configuracion -> Estado

Grabamos el archivo.

4º) Conectamos la blackberry por USB y ejecutamos los siguientes comandos:

[hmazzeo@TWITTER ~]$ evolution --force-shutdown
[hmazzeo@TWITTER ~]$ msynctool --sync Blackberry

Estos comandos son los que debemos ejecutar siempre para sincronizar nuestro equipo.

Hernan Mazzeo

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