Nagios Falante

Este artigo ensina como colocar o Nagios para te ligar e avisar em caso de falhas críticas em sua rede. Ele irá funcionar como uma secretária eletrônica ao contrário. Ao invés de esperar a ligação, ele ligará e te avisará.

[ Hits: 71.712 ]

Por: Allan GooD em 24/01/2005


Alguns scripts e algumas configurações



Primeiramente, tenha certeza que o seu Nagios está configurado e funcionando corretamente. Para saber como fazer isso, vá no site oficial e leia os vários tutoriais, HOWTOs e documentação, que são muito boas.

Site: http://www.nagios.org

Vamos entender o que vai acontecer:

1) O Nagios verifica os serviços e caso necessário, emite os avisos que estão configurados nos arquivos:
  • contacts.cfg
  • misccommands.cfg
  • services.cfg

Vamos baixar e compilar o mgetty:

ATENÇÃO!!! Não é necessário instalar TODO o pacote mgetty, vamos utilizar apenas a parte de "voice" dele.

Baixe a última versão e descompacte em algum lugar. Depois disso entre no subdiretório "voice" e dê um "make" lá dentro. Simples assim.

Depois de compilar, copie todos os binários do diretório "pvftools" para um lugar qualquer, por exemplo "/usr/local/bin".

Copie também o binário do "vm" (Voice Shell) que fica no diretório "vm", pois é ele quem vai fazer toda a mágica!

Agora vem a parte difícil da coisa:
O Nagios envia notícias em paralelo, ou seja, se um serviço parar e houver mais de uma pessoa configurado no "contacts.conf" e "contacgroups.conf", ele irá tentar ligar para todos ao mesmo tempo... coisa que o modem não permite.

Solução: Criar um "servidor de e-mail" para mensagens de voz. Ou melhor, algum programa que enfilere as mensagens e dispare de modo serial e não paralelo.

Como eu quero facilitar a vida de vocês, vou colocar aqui meus scripts OK?

Nota: Estão todos em shell script, se alguém fizer uma versão melhor, em C por exemplo, me envie OK?

Nota 1: Os arquivos de som DEVEM ser gravados em WAV no formato **22050/16bits/Mono**. Caso não seja nesses parâmetros, o som não sairá correto!!! Depois disso, é necessário converter o arquivo para o formato que seu voice modem entenda (.rmd).

Nota 2: Os programas a seguir recebem 3 arquivos de som, um para o nome do servidor, outro para o nome do serviço e o terceiro para o estado.

O resultado será algo como: "Servidor X, HTTP, Crítico".

Este é o "daemon" do mailmodem. Ele fica em um loop infinito verificando (a cada 2 min) por arquivos no diretório "/var/spool/mailmodem", onde as mensagens serão colocadas.

#!/bin/bash

. /etc/mailmodem.conf

DELAY="2m"

while :; do
for message in `find $spool -type f | sort`; do
   CONT="`cat $message`"
   TEL="`echo $CONT | cut -f1 -d:`"
   SOM1="`echo $CONT | cut -f2 -d:`"
   SOM2="`echo $CONT | cut -f3 -d:`"
   SOM3="`echo $CONT | cut -f4 -d:`"
   if [ -z "`ps ax | grep playmodem | grep -v grep`" ]; then
     $playmodem $TEL $SOM1 $SOM2 $SOM3
     ERROR="$?"
     rm $message
   fi
   if [ "$ERROR" == "0" ]; then
     /usr/bin/logger -t MailModem "Send |Tel: $TEL - Som1: $SOM1 - Som2: $SOM2 - Som3: $SOM3| Success"
   else
     /usr/bin/logger -t MailModem "Send |Tel: $TEL - Som1: $SOM1 - Som2: $SOM2 - Som3: $SOM3| Failed, errnum: $ERROR"
   fi
   sleep 1s
done
  sleep $DELAY
done

exit 0

Este é o "arquivo de configuração" do mailmodem.sh, que deve ficar no /etc:

# Mail Modem Conf file

# Where the playmodem.sh stay
playmodem="/usr/local/bin/playmodem.sh"

# The place of spool messages
spool="/var/spool/mailmodem"

# Temporary directory
tmp="/tmp"

# The translation file
translation="/etc/nagios/translation.txt"

# Directory of sounds
sounddir="/usr/local/share/sounds"

Este é o send_modem.sh. Ele é responsável por colocar as mensagens no diretório "spool" do mailmodem e fazer algumas checagens como a existência dos arquivos de som e fazer umas "traduções" por exemplo.

Estas traduções são o seguinte:
No Nagios você pode definir nomes de serviços com espaços e coisas assim, quando usar o send_modem.sh para enviar as mensagens ele irá passar estes nomes enormes, gerando confusão ou dando problemas mesmo. A tradução serve para trocar os nomes extensos que o Nagios passa como parâmetro por nomes menores, mais genéricos.

#!/bin/bash

. /etc/mailmodem.conf

file="`date +%s%N`"

if [ "$#" != "4" ]; then
  echo "Wrong number of paramets"
  echo "Usage: $0 tel_number sound1 sound2 sound3"
  exit 255
fi

# Telefone
TEL="$1"
# Nome da maquina
P1="$2"
SOM1="`echo $P1 | awk '{print tolower($1)}'`"

# Servico
P2="$3"
SOM2="`grep -i ^\"$P2\" $translation | cut -f2 -d: | awk '{print tolower($0)}'`"
if [ -e "$sounddir/`echo $P2 | tr A-Z a-z`.rmd" ]; then
  SOM2="`echo $P2 | tr A-Z a-z`"
else
  SOM2="`grep -i "^$P2" $translation | cut -f2 -d: | tr A-Z a-z`"
fi

# Estado
P3="$4"
if [ -e "$sounddir/`echo $P3 | tr A-Z a-z`.rmd" ]; then
  SOM3="`echo $P3 | tr A-Z a-z`"
else
  SOM3="`grep -i "^$P3" $translation | cut -f2 -d: | tr A-Z a-z`"
fi

if [ -z "$SOM2" ] || [ -z "$SOM3" ]; then
  /usr/bin/logger -t MailModem "Wrong sound. Param: $1, $2, $3, $4. Exiting..."
  exit 255
fi

test -e $spool/$file || echo -n "$TEL:$SOM1.rmd:$SOM2.rmd:$SOM3.rmd" > $spool/$file
chmod 666 $spool/$file

exit 0

Aqui um exemplo das traduções. Defina o nome e local no arquivo de configuração do mailmodem (/etc/mailmodem.conf):

#
# Neste arquivo fica a tradução das falas
#


Administracao do Silver Stream:SILVERSTREAM
Servico do SilverStream:SILVERSTREAM
Servico do SyBase:SYBASE
Porta do SyBase:SYBASE
Exchange Informations Service:EXCHANGE
Exchange MTA:EXCHANGE
Exchange Management:EXCHANGE
IMAP4 - Exchange:EXCHANGE
GroupShield:GROUPSHIELD
HTTPS:HTTP
MailScanner Process:SMTP
Postfix Process:SMTP
SQUID Proxy:SQUID
UPS Charge Remaning:BATERIA
PROBLEM:CRITICO
UNKNOWN:CRITICO
RECOVERY:RECUPERADO

Quando o Nagios passar "Postfix Process", por exemplo, o programa irá "traduzir" para SMTP e procurar um arquivo de som chamado smtp.rmd no diretório de arquivos de som.

Este arquivo que irá tocar os 3 sons através do script do modem "messages.sh":

#!/bin/bash

TEL="$1"
SOM1="$2"
SOM2="$3"
SOM3="$4"
PREFIX="/usr/local"
DIRSOM="$PREFIX/share/sounds"

err=`sudo -u root $PREFIX/bin/vm shell -l cua0 $PREFIX/bin/message.sh $TEL $DIRSOM/$SOM1 $DIRSOM/$SOM2 $DIRSOM/$SOM3`

if [ "$err" == "OK: message sent" ];then
  out="0"
  mess="OK"
else
  out="255"
  mess="ERROR"
fi

echo "$mess"
exit $out

O messages.sh. Observe que este script não é meu, apenas dei uma adaptada para tocar 3 arquivos de som ao invés de 1.

#
# This script calls the given phone number and plays a message.
#
# $1 - phone number to call
# $2 - filename of the message to play (must be a .rmd file, that
#      can be played on the modem used for dialout)
#
# $Id: message.sh,v 1.5 1999/12/04 15:07:34 marcs Exp $
#
#
# Define the function to receive an answer from the voice library
#


function receive
     {
     read -r INPUT <&$VOICE_INPUT;
     echo "$INPUT";
     }

#
# Define the function to send a command to the voice library
#


function send
     {
     echo $1 >&$VOICE_OUTPUT;
     kill -PIPE $VOICE_PID
     }

#
# Check command line options
#


if [ $# -ne 4 ]; then
     echo "usage: $0 <phone_number> <filename1> <filename2> <filename3>" >&2
     exit 99
fi

#
# Let's see if the voice library is talking to us
#


ANSWER=`receive`

if [ "$ANSWER" != "HELLO SHELL" ]; then
     kill -KILL $$
fi

send "HELLO VOICE PROGRAM"

ANSWER=`receive`

if [ "$ANSWER" != "READY" ]; then
     kill -KILL $$
fi

#
# Enable events
#

send "ENABLE EVENTS"

ANSWER=`receive`

if [ "$ANSWER" != "READY" ]; then
     kill -KILL $$
fi
#
# Start dialout
#

send "DIAL $1"

ANSWER=`receive`

if [ "$ANSWER" != "DIALING" ]; then
     kill -KILL $$
fi

ANSWER=`receive`

if [ "$ANSWER" != "READY" ]; then
     echo "ERROR: $ANSWER, aborting"
     exit 99
fi

#
# Disable events
#

send "DISABLE EVENTS"

ANSWER=`receive`

if [ "$ANSWER" != "READY" ]; then
     kill -KILL $$
fi

#
# Now play the message file
#

send "PLAY $2"

ANSWER=`receive`

if [ "$ANSWER" != "PLAYING" ]; then
     kill -KILL $$
fi

ANSWER=`receive`

if [ "$ANSWER" != "READY" ]; then
     kill -KILL $$
fi

send "PLAY $3"

ANSWER=`receive`

if [ "$ANSWER" != "PLAYING" ]; then
     kill -KILL $$
fi

ANSWER=`receive`

if [ "$ANSWER" != "READY" ]; then
     kill -KILL $$
fi

send "PLAY $4"

ANSWER=`receive`


if [ "$ANSWER" != "PLAYING" ]; then
     kill -KILL $$
fi

ANSWER=`receive`

if [ "$ANSWER" != "READY" ]; then
     kill -KILL $$
fi


#
# Let's say goodbye
#

send "GOODBYE"

ANSWER=`receive`

if [ "$ANSWER" != "GOODBYE SHELL" ]; then
     kill -KILL $$
fi

echo "OK: message sent"
exit 0

Um pequeno script para converter os arquivos .WAV para .RMD, o convert.sh/ A variável PREFIX deve apontar para o diretório onde os arquivos "pvftools" foram copiados.

Observe a linha onde diz "pvftormd US_Robotics 1". Cada modem possui um formato diferente de tratar som. Verifique o seu e substitua o parâmetro.

Para listar os dispositivos use: "pvftormd -L"

#!/bin/bash

IN="$1"
OUT="`echo $IN | cut -f1 -d.`.rmd"
PREFIX="/usr/local/bin"

$PREFIX/wavtopvf $IN | $PREFIX/pvfspeed -s 8000 | $PREFIX/pvftormd US_Robotics 1 > $OUT
rm $IN

exit 0
Página anterior     Próxima página

Páginas do artigo
   1. Esclarecimentos
   2. Pré-requisitos
   3. Cenário
   4. Alguns scripts e algumas configurações
   5. O toque final: Juntando tudo
Outros artigos deste autor

Controle de conteúdo: Como proteger seus usuários deles mesmos

Alta disponibilidade com IP compartilhado - UCARP

Filtragem de vírus com pop3 transparente: pop3vscan

Leitura recomendada

Container Elastic Stack para visualização de logs do Proxy Squid

Pirataria - Como prejudica desenvolvedores, cria monopólios e facilita ações de crackers

MP3 no Linux

Relato: Instalação mista dos sistemas Linux, MacOS e Windows na mesma rede

Implantação de software livre

  
Comentários
[1] Comentário enviado por fabio em 24/01/2005 - 13:39h

Allan,

Excelente artigo! Apesar de não usar o Nagios, achei muito interessante a parte do mgetty. Acabei de configurar uma secretária eletrônica que recebe até fax aqui em casa usando esse tal de mgetty :P, muito bom mesmo.

Inclusive fica aí a sugestão de artigo, falar sobre como implementar um servidor de fax/secretária eletrônica usando o mgetty. Levando em conta que o mgetty também pode literalmente "telefonar" pra você, também pode-se ensinar a implementar um serviço de despertador que nem as companhias telefônicas fazem, ou seja, ligar pra seu telefone em determinado horário pré-agendado. Cruel!!!

Ah se eu tivesse tempo, infelizmente meu "time" hoje em dia é 100% consumido pela manutenção do site, daí tive de sacrificar algo que adoro fazer, que é escrever :)

[]'s

[2] Comentário enviado por wberbert em 24/01/2005 - 14:33h

Gostei muito do artigo, achei interessante o capacidade que o open souce tem em resolver nossos problemas :D e faço minhas as palavras do Fábio, estou ha um tempinho sem escrever para o site devido ao meu trabalho... a firma resolveu fazer um sistema de contratos para os clientes, e advinha quem o está fazendo... :).. bom assim que tiver um tempo e esfriar a cabeça com essa correria toda estarei postando novos artigos aqui e também lendo outros artigos tão bons quanto esse.

Meus parabens.

[3] Comentário enviado por fernandofat em 24/01/2005 - 14:50h

Allan, muito boa a sua "sacada".

Eu utilizo o Nagios e assim que possível vou implementar esta forma de notificação, achei muito legal mesmo.

Parabéns pelo artigo... ;-)



[4] Comentário enviado por allangood em 25/01/2005 - 14:58h

Pois é Fábio, hoje estou trabalhando em integrar o Nagios ainda mais com o mgetty. Quero coloca-lo para esperar por uma ligação e fazê-lo falar o estado dos serviços, para isso estou usando o Festival (sintetizador de voz) que pode gerar os arquivos de som em tempo real, não necessitando cria-los antes.

Com esta mesma idéia é possível implementar este recurso de "tele-despertador" que você mencionou.
Quem sabe este não seja meu próximo artigo? :)

Até mais.

Ps.: Obrigado a todos pelos elogios.

[5] Comentário enviado por marcaoguitarra em 25/01/2005 - 15:21h

cara... muito bommm...
vc sempre postando artigos muito bons para a comunidade hein!
Valew mesmo ae pelo artigo... vou estar fazendo isso ake o mais rápido possível e não deixe de postar outros artigos.

falow

[6] Comentário enviado por naoexistemais em 27/01/2005 - 01:24h

Caro Allan,

O que faltava na comunidade uns artigos como o seu, parabéns...

Falou,

[7] Comentário enviado por anarjups em 10/05/2005 - 17:19h

Eu estou utilizando o LPR para gerenciar a fila de notificações, e funciona direitinho, mas estou tendo problemas com a detecção do tom de ocupado e com a detecção do atendimento... a mensagens sempre começa a tocar antes que alguém atenda e quando atendem já era...

[8] Comentário enviado por allangood em 11/05/2005 - 11:25h

Bem interesasnte sua idéia, o LPR cuida da fila serial de forma mais "profissional" que eu, com certeza! É a idéia da "reinvenção da roda".
Na época eu achei mais rápido escrever um punhado de scripts pra cuidar disso... nem tinha me ligado que poderia fazer assim!
O que acha de escrever um artigo ou dica de como juntar a minha idéia com a sua? Seria bem legal.

Voltando ao assunto, este problema eu nunca tive. Qual programa você está usando para discar? O VM? Eu o utilizo porque ele cuida de todos estes detalhes, aguardar tom de discagem, tocar o som depois da pessoa atender...
Você tentou usar meus scripts junto com o lpr? Ao menos o playmodem.sh (que apenas disca e toca o som)? Tenta ele e avisa ok?

Testes, testes... Software livre precisa de gente testando pra melhorar sempre... :)

Até mais.

[9] Comentário enviado por allangood em 31/05/2005 - 18:36h

Para quem teve problemas com celular e esta solução, vai uma dica: Coloque um "sleep 20s" depois do comando de discagem... é um remendo, mas ajuda! Fica algo assim:
...
...
#
# Start dialout
#

send "DIAL $1"

ANSWER=`receive`

if [ "$ANSWER" != "DIALING" ]; then
kill -KILL $$
fi

ANSWER=`receive`

if [ "$ANSWER" != "READY" ]; then
echo "ERROR: $ANSWER, aborting"
exit 99
fi

sleep 20s
...
...

Até mais.

[10] Comentário enviado por marcolinux em 28/11/2005 - 09:07h

CARACA !

Exelente artigo, de dar água na boca devida as possibilidades... Imagina integrar isso agora com um Skype da vida e enviar um aviso sonoro na estação do usuário por exemplo...

MUito BoM! PaRABÉNS !

faLOU!

[11] Comentário enviado por cachioli em 09/03/2006 - 11:21h

mto bom artigo.

mas gostaria de saber quais são os nomes dos scripts, não ficou mto claro pra mim.

obrigado =D

[12] Comentário enviado por allangood em 09/03/2006 - 12:14h

Ok cachioli, vou listar aqui:
mailmodem.sh -> É o "enfileirador" das mensagens. Ele recebe os arquivos com os sons e mensagens. Pode ser substituido pelo lpr

/etc/mailmodem.conf -> Arquivo de configuração do mailmodem.sh

send_modem.sh -> Cria e coloca as mensagens no "spool" do mailmodem

playmodem.sh -> Chama o messages.sh e com os nomes dos arquivos como parâmetro (percebi que no artigo eu não coloquei o nome dele)

convert.sh -> (Opcional) Apenas converte arquivos .WAV para .rmd (sons do modem)

Espero ter ajudado.

Até mais.
messages.sh -> Liga e reproduz os sons

[13] Comentário enviado por leandromoreirati em 19/07/2006 - 17:24h

esse pacote vm e mail client do emacs, pois nao tenho esse comando na minha distro tentei usar o lpr mas deu erro

[14] Comentário enviado por fabiosantosf em 23/10/2006 - 15:54h

Allan,

Tenho uma duvida em relação ao mailmodem.conf e ao playmodem.sh. Não vi o conteudo dos dois nesse artigo com estou meio perdido faltando só definir esses dois arquivos...

[15] Comentário enviado por fabiosantosf em 26/10/2006 - 19:18h

Olá,

Segui todos os passos neste artigo mas quando executo o processo no event log do NAGIOS mostra a seguinte ocorrência:

Warning: Attempting to execute the command "/etc/send_modem.sh "xxxxxxxx" "retsg001" "CPU" "PROBLEM"" resulted in a return code of 126. Make sure the script or binary you are trying to execute actually exists...

Alguém sabe como resolver isso...

[16] Comentário enviado por Rickrock em 30/10/2006 - 15:14h

muito interessante... mas alguem poderia, pelo amor de deus, dar um exemplo prático de como configurar pelo menos 2 servicos quaisquer do nagios nesses scripts????
valeu

[17] Comentário enviado por rubensuni em 08/04/2008 - 23:50h

Allan,

Será que vc não tem o tutorial de como instalar o mgetty?

Agradeço desde já.
Obrigado.

[18] Comentário enviado por bsobrino em 30/07/2009 - 11:05h

Gostaria de Saber onde ou posso consegui um tutorial ou uma apostila sobre NAGIOS. Onde tenha configuração, instalação e uso (operação) do sistema.

Obrigado

Bruno Sobrino

[19] Comentário enviado por esousa-br em 02/12/2011 - 14:37h

Parabens pelo artigo apesar de ter sido escrito a alguns anos ainda é MUITO bom, deixa eu pedir algo?
Tem como fazer com que o nagios ligue através de uma conexão VOIP?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts