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.