08 julio 2010

Script para hacer pings a hosts en Unix / Linux

El otro día tuve que salir del paso cuando un sistema de monitorización, que simplemente hace pings a diferentes equipos y recoge los resultados, falló. Las estadísticas que da de el tiempo activo, el tiempo de respuesta, ... no se usan, lo querían simplemente para detectar las caídas y recuperaciones. Como tenía que estar al tanto de estas decidí "salvarme" con un simple script que hizo lo mismo que la herramienta, de "dudosa" compra, de que disponían.

Mi caso es muy particular, estaba limitado en un Solaris antiguo sin permisos de instalación con carencia de comandos y con versiones antiguas de estos. No quería ver lo que hace el script sino simplemente los resultados y que estos no fueran demasiado rápidos.

Exporte los datos de los hosts de la base de datos. Tenía las ips en dos campos diferentes según el tipo de host y este mismo valor también estaba en dos campos diferentes (no me digáis porque ya que yo no hice la base de datos) por lo que tuve que tener en cuenta todas esas condiciones. Os dejo el ejemplo por si alguien le sirve para adaptarlo.

#!/bin/bash
 
######################################################
#####         DETECTOR DE CAIDAS DE HOSTS        #####
######################################################
########################################   Nebur   ###
######################################################
 
# Comprobamos que no queden archivos temporales
# generados por el script y los creamos.
if [ -e "temp" ]; then
  rm -R temp
  mkdir temp
else
  mkdir temp
fi
touch ./temp/caidos
touch ./temp/recuperados
 
# Eliminamos " y espacios del archivo de datos
# ya que asi se exporto.
sed -e 's/\"//g' hosts.txt>hosts.int
sed -e 's/ /_/g' hosts.int>hosts
rm hosts.int

# Creamos un bucle infinito.
while test 1 != 0
do
# Recojemos los valores que necesitamos
# realizamos los pings y según el resultado
# lo escribimos en un archivo temporal
# llamado caidos o recuperados.
  hora=`date "+%H:%M:%S"`
  for linea in `cat hosts`
  do
    cod=`echo $linea | cut -d';' -f1`
    descrip=`echo $linea | cut -d';' -f2`
    tipo_m=`echo $linea | cut -d';' -f3`
    tipo_v=`echo $linea | cut -d';' -f6`
    ip_m=`echo $linea | cut -d';' -f4`
    ip_v=`echo $linea | cut -d';' -f7`
    baja_m=`echo $linea | cut -d';' -f8`

    if [ "$baja_m" = "No" ]; then
      if [ "$(ping $ip_m 2 | grep alive)" = "" ]; then
        if [ "$(grep $ip_m ./temp/caidos)" = "" ]; then
          echo "$cod;$descrip;$tipo_m;$ip_m;$hora" >> ./temp/caidos
        fi
      else
        if [ "$(grep $ip_m ./temp/caidos)" != "" ]; then
          echo "$cod;$descrip;$tipo_m;$ip_m;$hora" >> ./temp/recuperados
          sed "/$ip_m/d" ./temp/caidos > ./temp/caidos_tmp
          mv ./temp/caidos_tmp ./temp/caidos
        fi
      fi
    else
      if [ "$(ping $ip_v 2 | grep alive)" = "" ]; then
        if [ "$(grep $ip_v ./temp/caidos)" = "" ]; then
          echo "$cod;$descrip;$tipo_v;$ip_v;$hora" >> ./temp/caidos
        fi
      else
        if [ "$(grep $ip_v ./temp/caidos)" != "" ]; then
          echo "$cod;$descrip;$tipo_v;$ip_v;$hora" >> ./temp/recuperados
          sed "/$ip_v/d" ./temp/caidos > ./temp/caidos_tmp
          mv ./temp/caidos_tmp ./temp/caidos
        fi
      fi
    fi
  done
 
  # Limpiamos la pantalla para que solo se muestre
  # la lectura de caidos en color rojo y de
  # recuperados en verde.
  clear
  echo ""
  echo "###############################################"
  echo "###   Lista de hosts caidos y recuperados   ###"
  echo "###############################################"
  echo ""
  if [ "$(cat ./temp/caidos)" != "" ]; then
    echo -e '\E[37;41m'"Hosts caidos"; tput sgr0
    echo ""
    for linea in `cat ./temp/caidos`
    do
      cod=`echo $linea | cut -d';' -f1`
      descrip=`echo $linea | cut -d';' -f2`
      tipo=`echo $linea | cut -d';' -f3`
      ip=`echo $linea | cut -d';' -f4`
      cuando=`echo $linea | cut -d';' -f5`
 
      echo -e '\E[37;41m'"El equipo $cod - $descrip - $tipo - $ip a caido a las $cuando"; tput sgr0
    done
  fi
  echo ""
  if [ "$(cat ./temp/recuperados)" != "" ]; then
    echo -e '\E[37;42m'"Hosts recuperados"; tput sgr0
    echo ""
    for linea in `cat ./temp/recuperados`
    do
      cod=`echo $linea | cut -d';' -f1`
      descrip=`echo $linea | cut -d';' -f2`
      tipo=`echo $linea | cut -d';' -f3`
      ip=`echo $linea | cut -d';' -f4`
      cuando=`echo $linea | cut -d';' -f5`
 
      echo -e '\E[37;42m'"El equipo $cod - $descrip - $tipo - $ip a recuperado a las $cuando"; tput sgr0
    done
  fi
  rm ./temp/recuperados
  touch ./temp/recuperados
 
  sleep 10
done

Al final tenía en la pantalla del terminal una posible lista de hosts caídos y recuperados que comprobaba 300 hosts con un intervalo de un minuto.

No hay comentarios: