# ========================================================================================
# Nombre: Enviologservidores.sh
# ---------------------------------------------------------------------------------------------------------------
# Este script recoge ficheros de varios servidores, comprueba si tienen errores y envía un correo de aviso.
# ---------------------------------------------------------------------------------------------------------------
# El script necesita que exista previamente un fichero con las direcciones IP de los servidores (listado_servidores.txt)
# El script extrae las direcciones IP del fichero de servidores (listado_servidores.txt)
# Se conecta una por una a cada máquina (por su IP)
# De cada servidor se descarga el log /usr/log/fichero01.log
# y lo renombra como la direccion IP del equipo
# Se busca un "error" en todos los ficheros de log importados
# Se envía un email con el error (si existe), o con OK si no existe.
# ========================================================================================
# ---------------------------------------------------------------------------------------------------------------
# Nos posicionamos en el directorio de los logs (para que al extraer la informacion aparezca limpia)
# se define el path del directorio en una variable
# ---------------------------------------------------------------------------------------------------------------
cd /home/directorio01/logservidores
directorio_fichero="/home/directorio01/logservidores"
# ---------------------------------------------------------------------------------------------------------------
# se extraen las IPs de cada servidor del fichero de servidores, y se guardan en el ARRAY "direccionesIP"
# extraemos 4 bloques que contienen de 1 a 3 caracteres cada uno.
# -oe = extrae solo el texto que coincida con lo que buscamos
# [0-9] = debe haber números del 0 al 9
# {\1,3\} = contiene de 1 a 3 caracteres
# . = separa cada uno de los 4 bloques
# -------------------------------------------
# Un array se define con datos separados por un espacio en blanco dentro de un paréntesis:
# array=(dato1 dato2 dato3)
# pero en un script, además de los paréntesis, hay que usar comillas invertidas: array=(`datos o variable`)
# ---------------------------------------------------------------------------------------------------------------
direccionesIP=(`grep -oe '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' listado_servidores.txt`)
# ---------------------------------------------------------------------------------------------------------------
# Si queremos recoger ficheros de un solo servidor, podemos usar su IP, sin el array.
# Se recoge el log del servidor local 192.168.xxx.xxx y se deja en mismo directorio que el resto de logs
# ---------------------------------------------------------------------------------------------------------------
cp /var/log/fichero01.log /home/directorio01/logservidores/errores/192.168.xxx.xxx.log
# ---------------------------------------------------------------------------------------------------------------
# se leen las IPs del array una por una = for i in ${array[@]} o también for i in ${array[*]}
# se conecta al servidor con el usuario "directorio01" y la IP leida = directorio01@$i
# se trae el fichero de log cambiando el nombre a la IP del servidor que contenía el log
# ---------------------------------------------------------------------------------------------------------------
for i in ${direccionesIP[@]}; do
scp -i ~/.ssh/id_rsa directorio01@$i:/var/log/fichero01.log /home/directorio01/logservidores/errores/$i.log
done
# ---------------------------------------------------------------------------------------------------------------
# se extraen las líneas con error y se asignan a un array de variables
# ---------------------------------------------------------------------------------------------------------------
# Se extraen las líneas que contengan la palabra "error" y las dos líneas siguientes "-a2" de todos los logs
# "grep -a2 error /home/directorio01/borrame/fichero.log" extrae, además, las dos líneas posteriores a la encontrada
# -i = ignorar mayusculas/minusculas
# -w = buscar la palabra exacta
# -o = selecciona solo el texto buscado
# -n = numero de linea en el que está la palabra
# -v = buscar las líneas que NO contienen la palabra
# -l = muestra solo el nombre del fichero en el que se encuentra la palabra
# -H = muestra el nombre del fichero -h = no muestra el nombre del fichero
# --color = muestra en COLOR la palabra que buscamos
# 'palabra1|palabra2' = buscar dos palabras
# ---------------------------------------------------------------------------------------------------------------
cd /home/directorio01/logservidores/errores
grep --color -i -w -n -H 'error' *.log > errores.txt
# ---------------------------------------------------------------------------------------------------------------
# Si hay errores, se envía un correo con los errores extraidos de los log
# ---------------------------------------------------------------------------------------------------------------
# -i ignora mayusculas/minusculas
# -o selecciona la palabra solo si la coincidencia es exacta (selecciona "error" pero no selecciona "errores")
# -w selecciona solo la palabra exacta
# Se busca la palabra "error" y se guarda en la variable "erroresLOG"
# Si la variable $erroresLOG contiene (**) la palabra "error" o ( || ) "ERROR" entonces...
# ---------------------------------------------------------------------------------------------------------------
erroresLOG=(`grep -i -w -o 'error' errores.txt`)
if [[ $erroresLOG == *error* ]] || [[ $erroresLOG == *ERROR* ]]
then
# ---------------------------------------------------------------------------------------------------------------
# Mediante comandos telnet al puerto 25 del servidor SMTP (no hace falta usuario ni contraseña)
# se envia un correo con los errores extraidos de los log
# ---------------------------------------------------------------------------------------------------------------~
# El correo de envío puede ser inventado. Vale cualquiera, por ejemplo: correodeenvio@dominio.com
# El correo de destino debe existir de verdad y estar correctamente configurado.
# el comando telnet va fuera del paréntesis separado por una barra (pipe), mientras que todos sus parámetros van dentro
# ---------------------------------------------------------------------------------------------------------------
count=1
while [ $count -le 1 ]
do
( echo open 192.168.xxx.xxx #dirección IP del servidor SMTP
sleep 8
echo helo smtp.dominio.dominio #nombre del servidor SMTP
echo mail from: correodeenvio@dominio.com
sleep 2
echo rcpt to: correodedestino@dominio.com
sleep 2
echo data #aquí comienza el correo
sleep 2
echo subject: Existen ERRORES en la monitorizacion de servidores.
echo
echo | cat /home/directorio01/logservidores/errores/errores.txt
sleep 5
echo .
sleep 5
echo quit ) | telnet
count=$[$count+1]
done
#elif [ $CLAVE != $erroresLOG ]; then
# ---------------------------------------------------------------------------------------------------------------
# Si no existen errores, se envía un correo indicando que todo está OK
# ---------------------------------------------------------------------------------------------------------------
else
count=1
while [ $count -le 1 ]
do
( echo open 192.168.xxx.xxx #dirección IP del servidor SMTP
sleep 8
echo helo smtp.dominio.dominio #nombre del servidor SMTP
echo mail from: correodeenvio@dominio.com
sleep 2
echo rcpt to: correodedestino@dominio.com
sleep 2
echo data
sleep 2
echo subject: OK. No existen errores en la monitorizacion de servidores
echo
echo "Todo OK. Ningun servidor contiene errores."
sleep 5
echo .
sleep 5
echo quit ) | telnet
count=$[$count+1]
done
fi
# ---------------------------------------------------------------------------------------------------------------
# se borran los ficheros log para que no ocupen espacio
# ---------------------------------------------------------------------------------------------------------------
# rm /home/directorio01/logservidores/errores/*.*
exit 0
