Monitorar servidores e enviar alertas por e-mail e SMS

Apresentação

Este é meu primeiro artigo compartilhado no VOL, então, não sei muito bem o que colocar para começar e por isso, vou direto ao assunto.Estava a procura de algo para avisar se algum servidor perdesse rede, ou algo assim, que fizesse o mesmo parar de responder na rede, então, pesquisei sobre scripts para avisar por e-mail sobre estes eventos.

Encontrei bastante conteúdo na Internet, mas logo veio uma duvida: e se o próprio servidor que está a executar o script estiver sem rede, ou se o servidor de e-mail perder a rede, e se a internet não estiver funcionando?

Então, resolvi enviar estas mesmas mensagens por SMS. Fui à cata de conteúdo. Encontrei também alguma coisa na Net (mas até que não muito), então juntei tudo e desenvolvi minha ideia.

Claro que não é 100%. Vai que o servidor que está executando o script desligue. Mas, já é uma alternativa bem legal.

O que utilizei para colocar em funcionamento:

Hardware:

  • Servidor Ubuntu server 10.04
  • Modem 3g USB Huawei

Software:

  • SendEmail
  • Gammu

Instalação

Mão na massa.

Obs.: todos comandos aqui listado foram executados como root.

Instalação do SendEmail para enviar os e-mails:

# apt-get install sendemail libnet-ssleay-perl libio-socket-ssl-perl

Instalação do Gammu, para enviar SMS:

# sudo apt-get install gammu

Pronto, tudo instalado. Agora, é só plugar o modem 3G em alguma USB, e listar as portas criadas para o mesmo.:

# ls /dev/tty*

Mostrará uma lista de tty. A que vamos usar neste caso, é a “ttyUSB0” ou “ttyUSB1”. Executaremos com uma para testar, se não funcionar, testaremos com a outra.

Configuramos o Gammu:

# gammu-config

Pressione Enter para editar e colocar a porta criada para o modem:

Enter, para Aceitar:

Clique em “Save” para salvar:

Pressione Enter para aceitar e criar o arquivo mencionado na tela, que contém a configuração do Gammu.

Vamos testar se o modem foi encontrado na porta mencionada:

# gammu –identify

Deverá aparecer algo como esta tela:

Se isso aparecer, está tudo OK. Se não aparecer, execute novamente o comando gammu-config e mude para a porta “/dev/ttyUSB1” e teste novamente.

Teste

Testando se está enviando SMS e enviando e-mail.

Para testar envio do SMS:

# echo teste | gammu –sendsms TEXT NumeroParaQuemVaiOsms

E receberá o SMS com a palavra: “teste”

Para testar o envio de e-mail:

# sendEmail -f EMAIL_DE -t EMAIL_PARA -u “ASSUNTO” -o “MENSAGEM” -s SERVIDOR_SMTP -xu EMAIL_DE -xp SENHA

E receberá o e-mail com o assunto e a mensagem colocada no comando acima.

Funcionamento

Colocando para funcionar definitivamente.Vou mostrar exatamente como fiz no meu caso, sintam-se à vontade para modificar as instruções.

# cd /
# mkdir monitor
# cd monitor/
# mkdir logs

Salve o script abaixo como “monitor.sh”:

#!/bin/bash
############CONFIGURACAO
local=/monitor
log=$local/logs/”LOG-`date +%d%m%y`.txt”
numero=5498979897
EMAIL_DE=”@gmail.com”
EMAIL_PARA=”@outlook.com”
EMAIL_PARA2=””
SERVIDOR_SMTP=”smtp.gmail.com:587″
SENHA=’senha’
#########################
echo “—————————————” >> $log
for i in $( cat $local/servidores.txt)
do
ping -c 1 -W 3 “$i” > /dev/null # -c para 1 ping e -W para 1 segundo de espera por ping
if [ “$?” -ne 1 ];then
# RECONECTADO
if [ -e $local/$i-OFF.txt ]; then
printf “%13s – %12s – %6s\n” $i RECONECTADO `date +%H:%M:%S` >> $log
if [ $(cat $local/$i-OFF.txt) -ge 3 ]; then
# ENVIA EMAIL
ASSUNTO=”SERVIDOR RECONECTADO – $i”
MENSAGEM=”Servidor $i reconectado – `date +%H:%M:%S`”
ANEXO=””
sendEmail -f $EMAIL_DE -t $EMAIL_PARA -bcc $EMAIL_PARA2 -u “$ASSUNTO” -m “$MENSAGEM” -a $ANEXO -s $SERVIDOR_SMTP -xu $EMAIL_DE -xp $SENHA >
$local/log_email.txt
# ENVIA SMS
echo “$MENSAGEM” | gammu –sendsms TEXT $numero > $local/log_sms.txt
fi
rm $local/$i-OFF.txt
else
# CONECTADO
printf “%13s – %12s – %6s\n” $i CONECTADO `date +%H:%M:%S` >> $log
fielse
# DESCONETADO
printf “%13s – %6s – %6s\n” $i DESCONECTADO `date +%H:%M:%S` >> $log
if [ -e $local/$i-OFF.txt ]; then
cont=$(cat $local/$i-OFF.txt) && soma=$(($cont + 1)) && echo “$soma” > $local/$i-OFF.txt
else
echo “1” > $local/$i-OFF.txt
fi
if [ $(cat $local/$i-OFF.txt) -eq 3 ]; then
# PERDEU 3 PINGS ENVIA EMAIL
ASSUNTO=”PERDA DE REDE – $i”
MENSAGEM=”Servidor $i sem resposta – Primeiro Alerta – `date +%H:%M:%S`”
ANEXO=””
sendEmail -f $EMAIL_DE -t $EMAIL_PARA -bcc $EMAIL_PARA2 -u “$ASSUNTO” -m “$MENSAGEM” -a $ANEXO -s $SERVIDOR_SMTP -xu $EMAIL_DE -xp $SENHA >
$local/log_email.txt
# ENVIA SMS
echo “$MENSAGEM” | gammu –sendsms TEXT $numero > $local/log_sms.txt
#rm $local/$i-OFF.txt
elif [ $(cat $local/$i-OFF.txt) -eq 34 ]; then
# PERDEU + de 4 PINGS ENVIA EMAIL
ASSUNTO=”PERDA DE REDE – $i”
MENSAGEM=”Servidor $i sem resposta – Alerta Continuo – `date +%H:%M:%S`”
ANEXO=””
sendEmail -f $EMAIL_DE -t $EMAIL_PARA -bcc $EMAIL_PARA2 -u “$ASSUNTO” -m “$MENSAGEM” -a $ANEXO -s $SERVIDOR_SMTP -xu $EMAIL_DE -xp $SENHA >
$local/log_email.txt
# ENVIA SMS
echo “$MENSAGEM” | gammu –sendsms TEXT $numero > $local/log_sms.txt
echo “4” > $local/$i-OFF.txt
fi
fi
done
echo “—————————————” >> $log

1. Colocaremos o script “monitor.sh” dentro do diretório “/monitor”.
2. Criaremos um arquivo dentro de “/monitor”, com os IPs dos servidores a serem monitorado, e terá o nome “servidores.txt”.

E para finalizar, colocaremos o script para ser executado a cada 1 minuto.

# crontab -e

* * * * * /monitor/monitor.sh
Rolar para cima