jueves, 2 de junio de 2011

Construcción de Plugin Nagios/Centreon para inodos

En esta ocación quiero compartir con ustedes un plugin muy básico para revisar el estado de los inodos en un FileSystem remoto a nuestro servidor de monitorio Nagios vía SNMP.

Para conseguir que el agente SNMP, nos pueda regresar información de los i-nodos de su sistema se requiere autorización, eso lo hacemos con el atributo "disk" y como parámetro se me envía cada uno de los FileSystem que deseamos monitorear. Esto seria agregando por ejemplo unas lineas al archivo snmpd.conf como las que siguen:

disk /
disk /home

Ya con este cambio solo queda reiniciar el servicio. Se puede verificar con el comando snmpwalk o el plugin que tenemos, desde el servidor de monitoreo o NMS.


#!/bin/bash
#check_snmp_inodes.sh
# Argumentos:
# 1. Community
# 2. Version
# 3. IP Address
# 4. FS
# 5. warning
# 6. critical
if [ $# -eq 6 ]; then
#Se localiza el indice del FS
isExist=`snmpwalk -c $1 -v $2 $3 dsktable | grep -e "$4$" | wc -l`
if [ $isExist -eq 1 ]; then
index=`snmpwalk -c $1 -v $2 $3 dsktable | grep -e "$4$" | awk 'BEGIN{FS="."}{print $2}' | awk '{print $1}'`
uso=`snmpwalk -c $1 -v $2 $3 .1.3.6.1.4.1.2021.9.1.10.$index | awk '{print $4}'`
valor=""
#Menor que
if [ $uso -lt $5 ]; then
echo "I-nodos OK $4 Esta usando $uso% de sus inodos | size=100 used=$uso"
exit 0
else
if [ $uso -lt $6 ]; then
echo "I-nodos WARNING $4 Esta usando $uso% de sus inodos | size=100 used=$uso"
exit 1
else
echo "I-nodos CRITICAL $4 Esta usando $uso% de sus inodos | size=100 used=$uso"
exit 2
fi
fi
echo "I-nodos $valor: $4 Esta usando $uso% de sus inodos | size=100 used=$uso"
exit 0
else
echo "No existe el FileSystem $4"
exit 3
fi

else
echo "Error en el paso de parametros"
exit 3
fi

viernes, 13 de mayo de 2011

Arbol de directorios con objeto Tree de java IceFaces.

Saludos, en esta ocación y de manera muy rapida tengo para ustedes un breve ejemplo de como llenar un objeto Tree en JavaIceFaces.



public class Page3 extends AbstractPageBean {
private static final String DIR_OPEN_ICON = "./xmlhttp/css/xp/css-images/tree_folder_open.gif";
private static final String DIR_CLOSE_ICON = "./xmlhttp/css/xp/css-images/tree_folder_close.gif";
private static final String DIR_LEAF_ICON = "./xmlhttp/css/xp/css-images/tree_document.gif";

private void get_tree(String dir, DefaultMutableTreeNode parent){
//Apertura del directorio
File a = new File(dir);
//Conseguimos un listado de los archivos y subdirectorios
String[] ficheros = a.list();
int i = 0;

//Agregamos los nodos al arbol, por cada archivo encontrado
try{
while ( i < ficheros.length ){
File tmp = new File( a.getCanonicalPath() +"/"+ ficheros[i]);

DefaultMutableTreeNode branchNode = new DefaultMutableTreeNode();
IceUserObject branchObject = new IceUserObject(branchNode);
branchObject.setText( ficheros[i] );
branchObject.setBranchContractedIcon(DIR_CLOSE_ICON);
branchObject.setBranchExpandedIcon(DIR_OPEN_ICON);
branchObject.setLeafIcon(DIR_LEAF_ICON);
branchObject.setExpanded(false);

//Si el archivo es un directorio volvemos a invocar el metodo.
if ( tmp.isDirectory() ){
branchObject.setLeaf( false );
this.get_tree( a.getCanonicalPath() +"/"+ ficheros[i] , branchNode);
}
else
branchObject.setLeaf( true );

branchNode.setUserObject(branchObject);
parent.add(branchNode);
i++;
}
}
catch (IOException e){
this.setLblCurrentDir("Error: " + e.getMessage());
}
}

private void lectura2(){
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
IceUserObject itemx = new IceUserObject(root);
itemx.setText("Directorios");
itemx.setExpanded(true);
itemx.setLeaf(false);
itemx.setBranchContractedIcon(DIR_CLOSE_ICON);
itemx.setBranchExpandedIcon(DIR_OPEN_ICON);
itemx.setLeafIcon(DIR_LEAF_ICON);
root.setUserObject(itemx);

//Directorio a visualizar
this.get_tree("..", root);

DefaultTreeModel model = new DefaultTreeModel(root);
this.tree1Model.setModel(model);
}
}


jueves, 31 de marzo de 2011

Sintesis: Exploring Linux Command-Line Tools

Brevemente solo quiero presentar una sintesis del primer capitulo de la Guía LPI Exploring Linux Command-Line Tools. Son algunos comandos para manupulación de archivos de texto.

cat:
-E final de linea con $
-n numero de linea (incluso lineas vacias)
-b numero de linea

join: combina dos archivos por algun campo en común.
join listing1.1.txt listing1.2.txt (defecto campo 1)
join -1 3 -2 2 people.txt numbers.txt (archivo 1 campo 3)

paste: combina dos archivos (linea a linea).
paste listing1.1.txt listing1.2.txt

expand: cambia los tabs a espacios en blanco

od: nuestra un archivo en formato octal
od listing1.2.txt

sort: Ordena listados.
-i Ignora si son mayusculas o munisculas.
-r Orden invertido
-k ¿por cual campo hacemos el ordenamiento?
sort -k 3 listing1.1.txt

split: Divide un archivo en dos o mas archivos. Se le pasa el prefix.
-b Los divide por tamaño en bytes
-l Por lineas
split -l 2 listing1.1.txt numbers

tac: concantena archivos pero con lineas en orden invertidos. Aplicando tac a cada archivo y despues concantena.

tr: Remplaza caracteres los del SET1 con el equivalente del SET2
-t Trunca el SET1 al SET2
-d Elimina los caracteres del SET1
[:alnum:] (all numbers and letters)
[:upper:] (all uppercase letters)
[:lower:] (all lowercase letters)
[:digit:] (all digits).
tr BCJ bc < listing1.1.txt

unexpand: Convierte los multiples espacios a tabs.

uniq: Elimina elementos duplicados de una lista.

fmt: Formato para archivos con lineas muy largas o irregulares.

nl: Enumerar las lineas.

pr: Formato para imprimir


head: Muestra el encabezado de archivos
head -n 10 file.txt

tail: Muestra la cola de un archivo.
tail -n 10 file.txt
tail -f file.txt

cut: Extrae porciones de texto de la su STDIN y lo manda a su STDOUT, por columnas

cat file1.txt | cut -c 2-
ifconfig eth0 | grep HW | cut -d " " -f 11

wc: Contador de palabras.
-l Lineas.
-w Palabras.
-c Bytes.
-m Caracteres.
-L Longitud de la linea mas larga.

domingo, 20 de marzo de 2011

Limitando los recursos de Tomcat.

Hace unos meses trabajando con OpenLaszlo 4.9 y Tomcat 5.0 en mi vieja notebook Compaq v2617la de 512Mb Ram, dramáticamente me estaba quedando sin memoria muy seguido, esto debido a los procesos que podemos ver en la siguiente expresión:
Mysqld + browser (iceweasel) + Apache + Laszlo = Frustración, tristeza y desesperación.

El proceso Tomcat que inicialmente era propiedad del root, causaba que al terminarse la Ram, comenzara a tener una gran demanda en el uso del SWAP al extremo de provocarme síntomas parecidos a los provocados en DoS, por el uso intensivo del disco. Las medidas que aplicamos fueron:
  • Aumentar la memoria Swap ( ver ).
  • Cambiar a un browser mas ligero (google-chrome).
  • Cambiar a un windowmanager mas ligero (Fluxbox).
  • Cambiar a un reproductor mp3 mas ligero (mpg123).
  • Limitar los umbrales de recursos disponibles de Tomcat ( ver ).
  • Crear el usuario "tomcat", limitarlo en el uso de consumo de memoria, y entregarle permisos sobre el servicio Tomcat.
Los umbrales para la configuración de recursos de tomcat los ajuste en uno de los scripts de inicio del mismo tomcat $CATALINA_HOME/bin/catalina.sh.
Cambiando el parámetro export JAVA_OPTS="-Xms128m -Xmx512m $JAVA_OPTS" por export JAVA_OPTS="-Xms128m -Xmx256m $JAVA_OPTS".

Para limitar los recursos del sistema usados por el usuario tomcat, en su archivo ~.bashrc colocarle ulimit -m 200000, para que solo tome 200mb como memoria maxima.

Estos ajustes los realize como ambiente de pruebas, mismos que hasta ahora me han ayudado a trabajar mas feliz.

domingo, 27 de febrero de 2011

Agregando mas SWAP en Volumen Logico

En últimos días el trabajo en mi viejo equipo portátil se ha vuelto un poco pesado por lo escaso de mi memoria Ram, para mi desgracia DDR (costosa y un poco mas difícil de conseguir).

Como alternativa de prueba, se me ocurrió aumentar tamaño de mi memoria swap. Vamos a ver como esta la situacion actual:

Tenemos 512Mb en Ram y 256Mb en Swap (Aun sigo reprochándome por que deje tan poco). Afortunadamente como medida preventiva cuando me instale este sistema deje un Volumen Lógico con algunos sistemas de archivos y espacio libre en el volumen.

Algoritmo:
1. Por cuestiones de seguridad en la integridad de datos, se recomienda desmontar todos los sistemas de archivos usados para realizar cambios en el volumen. Así que la recomendación es reiniciar, login como root, detener todos los servicios, desmontar sistemas de archivos en el volumen. Para esto nos podemos apoyar del comando lsof buscando procesos haciendo uso de directorios.

2. Crear el espacio que necesitamos adentro del volumen. En mi caso definimos un espacio de 512Mb en el volumen volgrp01:
Poseidon:~# lvcreate -L 512M volgrp01

3. Verificar el tamaño creado y el dispositivo asignado, solo mostraremos un resumen de la salida:
Poseidon:~# lvdisplay
...
--- Logical volume ---
LV Name /dev/volgrp01/lvol0
VG Name volgrp01
LV Write Access read/write
LV Size 512.00 MB

4. Crear y activar la nueva swap:
Poseidon:~# mkswap /dev/volgrp01/lvol0
Poseidon:~# swapon /dev/volgrp01/lvol0

5. Verificar que las estadísticas de la memoria en el sistema y confirmamos que tenemos (512+512+256)Mb.

domingo, 20 de febrero de 2011

Cronicas de un viaje anunciado: Dia1

La semana pasada realice un viaje que ya les había anunciado previamente en algunas redes sociales, viajar mas de siete horas para llegar a Real de Catorce un viejo pueblo minero en el norte de México, con características muy propias a mi parecer de la época de la revolución mexicana a inicios del siglo XX.

La aventura comenzó la madrugada del sábado 12/02/2011 en la central de autobuses de Morelia, con un retraso considerable del autobus. A pesar de este pequeño inconveniente puede llegar a las 11:30am a Matehuala, lugar donde mi primo Abraham pasaría por mi para llegar juntos al pueblo.

El recorrido Matehuala-Real de Catorce, es poco mas de 40min. sobre todo por que la mitad del recorrido es un camino de piedras. Cuando comenzó el camino de piedra le pedí a mi primo tomarnos unas fotos, aprovechando para estirar un poco las piernas y respirar los aromas del desierto de San Luis Potosí.

Dejaremos al lector una idea mas clara de lo que es el lugar usando las herramientas que google nos ofrece, vamos al google streetmaps para ver el lugar donde nos tomamos algunas fotos.

Ver mapa más grande


Al final del camino de piedra llegamos a la entrada del tunel Ogarrio, el cual nos lleva directamente al pueblo.



Una vez en el pueblo, nos dispusimos a satisfacer primeramente algunas de las necesidades básicas del hombre, comer y un lugar para dormir. En cuanto al hospedaje nos quedamos en Hotel Real de Álamos un lugar para dormir sin muchas comodidades pero bien, un hotel pueblerino de esos que eventualmente se antojan para ir a descasar y olvidarte de la ciudad.

Para la comida, me deleite con el famoso platillo de enchiladas potosinas, siendo aquí el lugar donde las comí por primera vez.

Después de la comida el momento de nuestro primer recorrido había llegado, se decidió democraticamente ir primero al pueblo fantasma de Real de Catorce, este pueblo fue originalmente el que estaba habitado, sin embargo en algún momento de la historia deciden ir mas abajo, la razón no la conozco. Los argumentos ofrecidos por los habitantes y guías son diversos incluso de la información que hay en Internet.

El recorrido es en caballo y hay que subir un cerro con un camino muy empedrado y recientemente mas dañado por las lluvias causadas por el Huracán Alex. A lo largo el camino podemos apreciar construcciones aisladas del pueblo fantasma, la mayoría de ellas destruidas, casas, cuartos de almacenaje de dinamita, edificios, haciendas, etc.

Pudimos conocer por afuera una de las minas con una profundidad de 500mts, se trata de un pozo principal de extracción de minerales de unos nueve metros de diámetro, hay túneles estrechos que los mineros usaban para descender a esa profundad. Supongo que una de tus preguntas es ¿Que minerales se extraían?, de estas minas se extraían varios metales como el mercurio, pero principalmente era plata.

El recorrido duro aproximadamente dos horas. De regreso en el pueblo pasamos a cenar y tomar unas cervezas en un pequeño bar. Ahí nos enteramos que esta vieja mina volverá a operar en los próximos meses, una compañía de Canadá es la que estará a cargo con mano de obra de la región.

Finalmente quiero dejar disponible el álbum de fotos donde subí algunas de ellas. En el próximo post vamos a ver el siguiente día de aventuras.

lunes, 3 de enero de 2011

ulimit & limits.conf: Recursos del sistema

Primeramente quiero aprovechar este espacio para desear feliz año nuevo a mis escasos y desatendidos lectores ya que últimamente (varios meses atrás) que no he colocado nada por aquí. Para ponerme al día, tocaremos este sencillo pero importante tópico.

GNU/Linux nos provee varios mecanismos para administrar los recursos del sistema, como el paso de parámetros al kernel, memoria (scheduling priority), recursos físicos, etc. Los limites PAM ( pam_limits ), son limites de los recursos del sistema que son aplicados a los usuarios al iniciar sesión. Entre algunos de los recursos a los que les podemos aplicar este limite tenemos los siguientes:
  • Máximo numero de archivos abiertos.
  • Máximo tiempo en CPU.
  • Máximo numero de procesos.
  • Máximo numero de logins en el sistema.
  • Máxima prioridad permitida a un proceso.

El administrador deberá modificar el archivo /etc/security/limits.conf para administrar estos limites, mientras que los usuarios podrán jugar con el comando ulimit para mover sus valores dentro del rango permitido. El archivo de configuración se arma con registros de cuatro campos, de izquierda a derecha son los siguientes:

Campo 1 - Dominio: Se debe especificar el usuario o el grupo al que se aplicara el limite.
Campo 2 - Tipo: Hard o soft, el primero es el limite del cual el usuario no podrá pasar mientras que el segundo es el valor por defecto que tomara el usuario tras hacer login. El carácter "-", indica que se aplican los dos tipos simultáneamente con el mismo valor.
Campo 3 - Item: El recurso que se desea limitar (core, data, fsize, memlock, nofile, rss, stack, etc).
Campo 4 - Value: Valor que se va a asignar al recurso.

Dado el siguiente archivo de configuración, comentaremos algunas cosas


martin hard nofile 4096
martin - nproc 512


Tenemos dos ítem: nofile y nproc (numero máximo de archivos abiertos y máximo numero de procesos). Después de que el usuario martin inicia sesión podría consultar los valores que tiene asociados con los comandos ulimit -n y ulimit -u, además de ver la lista de ítems completos y sus valores con ulimit -a. En este caso los valores mostrados serian de la siguiente manera:

open files (-n) 1024
max user processes (-u) 512


El usuario puede crecer nofile hasta 4096, pero no mas de ese valor, sin embargo, nproc ya no puede crecer mas, si se intenta se conseguirá un mensaje "no se puede modificar el límite: Operación no permitida".

Finalmente en la figura, verificamos esta información para el máximo numero de procesos, tratando de colgar el sistema con una bomba fork, la cual funciona con recursividad tratando de llevar los procesos hasta que el sistema deje de responder, con aplicado este limite podemos evitar esto.