SiteCheckSMS - Monitore seu website e receba alertas por SMS

Publicado por Fábio Berbert de Paula (última atualização em 19/03/2010)

[ Hits: 6.727 ]

Homepage: https://fabio.automatizando.dev

Download siteCheckSMS.pl




Script usado para testar a disponibilidade e velocidade de um site:

- se o site estiver fora do ar, enviar um SMS para o administrador
- se o site estiver lento (variável $tempoAceitavel), enviar um SMS para o administrador

Utiliza o serviço do site www.fastsms.com.br para o envio de SMS.

Configure a seção 2, de definição de variáveis.

Melhorias no código são bem vindas!

  



Esconder código-fonte

#!/usr/bin/perl
# -------------
# Script usado para testar a disponibilidade e velocidade de um site
#
# - se o site estiver fora do ar, enviar um SMS para o administrador
# - se o site estiver lento (variável $tempoAceitavel), enviar um 
#   SMS para o administrador
#
# Programado por Fábio Berbert de Paula <fberbert@gmail.com>
# http://www.vivaolinux.com.br/~fabio
#
# Novas versões deste script serão publicadas em: 
# http://www.vivaolinux.com.br/script/siteCheckSMS/
#
# Sumário:
#
# 1. Carregamento dos módulos Perl
# 2. Definição das variáveis
# 3. Verificar se o script está rodando / gravar pid deste processo
# 4. Verificar conexão com a internet
# 5. Verificar se o aviso já foi enviado nos últimos 10 minutos
# 6. Acessar o site coletando tempo de resposta e/ou disponibilidade
# 7. Enviar o SMS para o administrador em caso de lentidão ou erro
#
# Sub-rotinas:
#
# checarPid() - verifica se o script está em execução, caso negativo, 
# grava o PID do processo atual no arquivo de PID
#
# gravarStatus() - grava a data e o status (erro ou sucesso) da 
# última verificação do site.
#
# verificarInternet() - verifica a conexão com a internet do host 
# que está executando o script. Se a internet estiver down, o script
# sempre acusará erro de acesso ao site, então não faz sentido 
# executar o script sem acesso à internet.
#
# debugar() - imprime mensagens detalhadas na tela caso o $debug = 1
# tenha sido definido.
# ------------------------------------------------------

# 1. Carregamento dos módulos Perl
use strict;
use Net::Ping;
use Time::HiRes;
use LWP::UserAgent;
use IO::Socket::INET; 

# 2. Definição das variáveis

#variáveis configuráveis
my $site = "http://www.vivaolinux.com.br/"; # site testado
my $nomeSite = "VOL";
my $tempoAceitavel = 10; #em segundos

#caminhos de arquivo
my $status = "/tmp/siteCheckSMS.status"; #arquivo de status
my $pidfile = "/tmp/siteCheckSMS.pid"; #arquivo de pid
my $debuglogfile = "/tmp/siteCheckSMS.debug";

#variáveis para o serviço FastSMS
my $fastURL = "http://www.fastsms.com.br/sms.cfm"; 
my $fastID = "FBI210xxx";
my $fastPass = "xxxxxx";
my $fastCelular = "xxxxxx";

#variáveis de debug
my $debuglog = 1; # 0 = sem debug | 1 = com debug
my $debug = 1; # 0 = sem debug | 1 = com debug

#variáveis usadas pelo script
my ($antes, $depois, $diff, $mensagem, $ultimoAviso, $avisado, $agora, $pid); 
my ($ua, $request, $response, $code);


# 3. Verificar se o script está rodando / gravar pid deste processo
debugar("1. Verificando se o script está rodando:");
my $isrunning = checarPid();
if ($isrunning) {
   exit;
}

# 4. Verificar conexão com a internet
debugar();
debugar("2. Verificando conexão com internet:");
my $conex = verificarInternet();
if ($conex==0) {
   #se internet fora do ar, abordar execução do script
   debugar("\tSem conexão com internet, abortando...");
   exit;
} 
debugar("\tInternet OK!");
debugar();

# 5. Verificar se o aviso já foi enviado nos últimos 10 minutos
debugar("3. Lendo arquivo de status:");
open(READ, $status);
while (<READ>) {
   chomp;
   ($ultimoAviso, $avisado) = split(":", $_);

   if ($avisado) {
      debugar("\tÚltima verificação apresentou lentidão ou erro.");
   } else {
      debugar("\tÚltima verificação não apresentou lentidão ou erro.");
   }

   #se o último aviso via SMS for mais antigo que 10 minutos,
   #então vamos zerar o log
   $agora = time;
   if ( ($agora - $ultimoAviso > 600) && $avisado==1 ) {
      gravarStatus(0);
      debugar("\nÚltimo SMS enviado tem mais de 10 minutos, enviar novo SMS.");
      $avisado = 0;
   }
}
close(READ);

if ($avisado) {
   debugar("\tÚltimo SMS foi enviado em menos de 30 minutos, abortando script...");
   exit;
}
debugar();

# 6. Acessar o site coletando tempo de resposta e/ou disponibilidade
debugar("4. Iniciando teste de acesso ao site:");

# criando agente LWP para acessar o site
$ua = new LWP::UserAgent;
testarSite();
debugar();

#fazendo encoding da mensagem para enviar via GET:
$mensagem =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg; 

# 7. Enviar o SMS para o administrador em caso de lentidão ou erro
if ($diff>$tempoAceitavel || $code!=200) {
   #enviar o SMS
   debugar("5. Lentidão ou erro detectado. Enviando SMS de alerta para $fastCelular");
   debugar();
   $request = new HTTP::Request GET => "$fastURL?id=$fastID&senha=$fastPass¶=$fastCelular&texto=$mensagem";
   $response = $ua->request($request);
   gravarStatus(1);
} else {
   gravarStatus(0);
}

sub gravarStatus {
   my $erro = shift;
   open(WRITE, ">$status");
   print WRITE time . ":$erro";
   close(WRITE);
}

sub verificarInternet {
   my $cont = 0;
   my $p = Net::Ping->new("tcp");
   $p->hires();

   #executo ping em 3 hosts diferentes, se 2 estiverem up, 
   #significa que a internet está ok
   my ($ret, $duration, $ip) = $p->ping('kratos');
   $cont+= $ret;

   ($ret, $duration, $ip) = $p->ping('www.vivaolinux.com.br');
   $cont+= $ret;

   ($ret, $duration, $ip) = $p->ping('www.br-linux.org');
   $cont+= $ret;

   if ($cont>=2) {
      return 1;
   } else {
      return 0;
   }
}

sub debugar {
   my $log = shift;
   my $localtime = localtime;
   print STDERR $log."\n" if ($debug);

   if ($debuglog) {
      open(WRITELOG, ">>$debuglogfile");
      print WRITELOG "($localtime) $log\n";
      close(WRITELOG);
   }
}

sub checarPid {
   $pid = $$;

   open(READ, $pidfile);
   my $pidinfile = <READ>;
   chomp($pidinfile);
   close(READ);

   my $exists = 0;
   $exists = kill 0, $pidinfile if ($pidinfile);
   if ($exists) {
      debugar("\tJá existe um checkSiteSMS rodando no pid $pidinfile\n");
      return 1;
   }

   debugar("\tGravando o pid deste processo em $pidfile");
   open(WRITE, ">$pidfile");
   print WRITE $pid;
   close(WRITE);

   return 0;
}

sub testarSite {

   # em caso de lentidão vou executar o teste de tempo por 3 vezes para 
   # me certificar que a demora não ocorreu por gargalo do link de 
   #internet desta estação
   for (my $x=1; $x<=3; $x++) {
   
      $antes = time;

      $request = new HTTP::Request GET => $site;
      $response = $ua->request($request);
      $code = $response->code();

      $depois = time;
      if ($code==200) {
         $diff = $depois - $antes;
         debugar("\tTeste $x levou $diff segundos...") if ($diff>$tempoAceitavel);
      } else {
         $diff = 0;
      }

      $x = 4 if ($diff<$tempoAceitavel);
   }

   debugar("\tHTTP-Status do site: $code");
   if ($code==200) {
      $mensagem = "$nomeSite levou $diff segundos para abrir";
      debugar("\tTempo de acesso ao site: $diff segundos");
   } else {
      $mensagem = "$nomeSite esta fora do ar";
   }
}

Scripts recomendados

Slowloris.pl (não foi feito por mim é apenas um compartilhamento.)

UDP flood em Perl!

Servidor remoto de ps aux

ping Aviso

Enviando notificações do Nagios para o MSN


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts