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.706 ]

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

Simples [PortScanner]

Enviando notificações do Nagios para o MSN

Importação de IPs do Whatsapp como Objeto do Zentyal

CRIAR CBQ

Servidor remoto de ps aux


  

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