La tecnología S.M.A.R.T. permite monitorizar los diferentes parámetros del disco como pueden ser: la velocidad de los platos del disco, sectores defectuosos, errores de calibración, CRC, distancias medias entre el cabezal y el plato, temperatura del disco, etc.

Con este pequeño script pandoraFMS nos avisará si hay algún problema para poder reaccionar a tiempo. Si tienes algún servidor en cierta empresa francesa que empieza por O y acaba en VH deberías de ponerlo si o si. 🙂

El script necesita tener instalada una versión mas o menos moderna de las smartmontools ya que las versiones más antiguas no incluyen el parametro –scan de smartctl

#!/bin/bash
 
OK="PASSED"
 
for i in $(smartctl --scan | awk {'print $1'})
        do
                SMART=$(smartctl -H $i | grep "SMART overall-health self-assessment test result"|tr -d " " |awk '{split($0,a,":");print a[2]}')
                if [ $SMART != $OK ]
                then
                        SALIDA="1"
                        DESCRIBE="ERROR EN DISCO $i"
                else
                        SALIDA="0"
                        DESCRIBE="Check de errores de HD $i con smart"
                fi
                echo "<module>";
                echo "<name>< ![CDATA[Smart $i]]></name>";
                echo "<type>< ![CDATA[generic_data]]></type>";
                echo "<data>< ![CDATA[$SALIDA]]></data>";
                echo "<description>< ![CDATA[$DESCRIBE]]></description>";
                echo "<min_critical>1</min_critical>";
                echo "</module>";
 
        done

PLUS: Si no utilizas PandoraFMS y quieres tener controlada la salud de tus discos este script te enviará un email si S.M.A.R.T. detecta algún problema. Necesitas tener instalado, además del smartmontools, mailutils para poder enviar el email.

#!/bin/bash
OK="PASSED"
for i in $(smartctl --scan | awk {'print $1'})
        do
                SMART=$(smartctl -H $i | grep "SMART overall-health self-assessment test result"|tr -d " " |awk '{split($0,a,":");print a[2]}')
                echo $SMART
                if [ $SMART != $OK ]
                then
                        TO_ADDRESS="correo@micorreoorigen.com"
                        FROM_ADDRESS="correo@micorreodestino.com"
                        SUBJECT="Error en disco smart"
                        BODY=" El disco xxxxx ha dado un error. Revisar cuanto antes"
                        echo ${BODY}| mail -s ${SUBJECT} ${TO_ADDRESS} -- -r ${FROM_ADDRESS}
 
                fi;
 
        done

Mas información sobre S.M.A.R.T:
http://sourceforge.net/apps/trac/smartmontools/wiki
http://lime-technology.com/wiki/index.php/Understanding_SMART_Reports
http://en.wikipedia.org/wiki/S.M.A.R.T

Este sencillo script para pandorafms nos permite comprobar si un raid software tiene algún problema para poder actuar cuanto antes.

#!/bin/bash
for i in $(mdadm --detail --scan | cut -d" " -f2)
        do
                ESTADORAID=$(mdadm --query --detail $i | grep "State :" | tr -d " ")
 
                CHECK=$(echo $ESTADORAID | egrep -c "State:clean,checking|State:active|State:clean")
 
 
                if [ $CHECK -eq 0 ]
                then
                        SALIDA="1"
      #                  DESCRIBE="ERROR EN ARRAY $i"
                        DESCRIBE=$ESTADORAID
                else
                        SALIDA="0"
                        DESCRIBE="Check OK de errores de Raid $i con mdadm"
                fi
                echo "<module>";
                echo "<name>< ![CDATA[Check_raid $i]]></name>";
                echo "<type>< ![CDATA[generic_data]]></type>";
                echo "<data>< ![CDATA[$SALIDA]]></data>";
                echo "<description>< ![CDATA[$DESCRIBE]]></description>";
                echo "<min_critical>1</min_critical>";
                echo "</module>";
 
        done

El script se guarda en la carpeta de plugins del agente de pandora y en la configuración del agente deberíamos añadir la siguiente línea:
module_plugin check_raid

Si queréis comprobarlo a mano se podría utilizar el siguiente comando:

mdadm --detail --scan | cut -d" " -f2 | xargs -I ARG mdadm --query --detail ARG | grep "State :"

Y si no os funcionara mdadm con un simple:

cat /proc/mdstat

Podríais ver el estado del array

Pandora FMS es un software de monitorización muy completo que estoy utilizando en sustitución de los icinga/nagios que venía utilizando hasta ahora. Una característica común a pandora fms y nagios es la capacidad de poder añadir tus propios plugins al sistema de monitorización lo que da una enorme libertad para poder hacer prácticamente cualquier cosa.

Uno de los plugins que he preparado sirve para poder medir con comodidad la velocidad de respuesta de un sitio web. Los parámetros que mide son:

  • Time to First Byte
  • Tiempo total de descarga
  • Tiempo de pretransferencia
  • Código http de respuesta
  • Tamaño total de la página

Algunos de estos parámetros son muy útiles para poder ver desviaciones o comportamientos extraños que asociados a su alarma correspondiente nos pueden avisar con tiempo para evitar caídas o incluso ataques.

Hay algunos parámetros que pueden extrañar como el código http de respuesta o el tamaño de la página, los he añadido para poder tener avisos de casos como errores 504 o 500 que de otra forma son difíciles de detectar y el tamaño de la página para monitorizar actualizaciones en ciertas páginas que no cuentan con herramientas como rss o similares para avisarnos de los cambios.

La instalación es muy sencilla y sólo se ha de copiar al directorio de los plugins del servidor donde tengamos pandora fms funcionando, asignarle permisos de ejecución y asegurarnos de que tenemos curl instalado (apt-get install curl).

En pandora debemos de ir a Gestionar servidores -> gestionar complementos y pulsar en Añadir y rellenar todos lo datos del plugin.


Ahora tenemos que añadir a un agente nuevo o a uno ya creado un nuevo módulo que utilice este plugin. El tipo de módulo debe de ser de Servidor de complementos.

Introducimos todos los datos necesarios, en este caso para medir el valor “Time to first byte”.

O por ejemplo para comprobar si se produce algún error 500 en una página

Este plugin está desarrollado en bash por lo que puede usarse desde la línea de comandos directamente.
Aquí os dejo el código fuente:

#!/bin/bash
# Page Speed Plugin Pandora FMS Server plugin
# (c) Manuel Angel Fernandez 2012
 
function help {
        echo -e "Page Speed Plugin for Pandora FMS Plugin server. http://pandorafms.com"
        echo " "
        echo "This plugin is used to check page speed and Time to First Time"
        echo " "
        echo -e "Syntax:" 
        echo -e "\t\t-f Time to First Byte"
        echo -e "\t\t-t Total time"
        echo -e "\t\t-p Pretransfer time"
        echo -e "\t\t-c Http status code"
        echo -e "\t\t-s Size download(Kb)"
        echo -e "\t\t-a All parameters csv format"
        echo -e "\t\t-h This help"
        echo -e "Samples:"
        echo "   ./page_speed -f www.yahoo.com"
        echo " "
	echo "by Manuel Angel Fernandez - manuel at rastreador.com.es" 
	echo " "
        exit
}
 
if [ $# -eq 0 ]
then
        help
fi
 
 
# Main parsing code
while getopts ":h:f:t:p:c::s:a:" optname
  do
    case "$optname" in
      "h")
                help
        ;;
      "f")
                curl -so /dev/null -H "Pragma: no-cache" -H "Cache-Control: no-cache" -w "%{time_starttransfer}\n" "$OPTARG?`date +%s`"
                exit 0
        ;;
      "t")
                curl -so /dev/null -H "Pragma: no-cache" -H "Cache-Control: no-cache" -w "%{time_total}\n" "$OPTARG?`date +%s`"
                exit 0
        ;;
      "p")
                curl -so /dev/null -H "Pragma: no-cache" -H "Cache-Control: no-cache" -w "%{time_pretransfer}\n" "$OPTARG?`date +%s`"
                exit 0
        ;;
      "c")
                curl -so /dev/null -H "Pragma: no-cache" -H "Cache-Control: no-cache" -w "%{http_code}\n" "$OPTARG?`date +%s`"
                exit 0
        ;;
      "s")
                curl -so /dev/null -H "Pragma: no-cache" -H "Cache-Control: no-cache" -w "%{size_download}\n" "$OPTARG?`date +%s`"
                exit 0
        ;;
      "a")
                curl -so /dev/null -H "Pragma: no-cache" -H "Cache-Control: no-cache" -w "Timetofirstbyte\tTotal-Time\tPretransfer-time\tHttp-code\tdownload-size\n%{time_starttransfer}\t%{time_total}\t%{time_pretransfer}\t%{http_code}\t%{size_download}\n" "$OPTARG?`date +%s`"
                exit 0
        ;;
 
 
       ?)
                help
        ;;
      default)
                help
        ;;
 
    esac
done

Espero que os sea de utilidad.

Una forma sencilla de comprobar si un servicio del servidor está caído y hacer que se vuelva a levantar con Python.

En este caso es para comprobar si el apache está funcionando y si no lo está iniciar el servicio.

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import socket, subprocess
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip="127.0.0.1"
port="80"
try:
	s.connect((ip, int(port)))
	s.shutdown(2)
except:
	subprocess.call(['/etc/init.d/apache2', 'start'])

Lo ideal sería tener este script ejecutándose en el cron cada poco tiempo.