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.730 ]
Homepage: https://fabio.automatizando.dev
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!
#!/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"; } }
Carregando automaticamente wireless via ndiswrapper II
Enviando notificações do Nagios para o MSN
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Quero saber sobre os melhores aplicativos de office para usar em 2024 ... (3)
Queria saber se existe alguma forma de desistalar programa no ubuntu s... (3)
Toda vez que tento atualizar o clamav me deparo com erros ao atualizar... (0)