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.696 ]
Homepage: https://mestrefabio.com
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"; } }
Script de conectividade wireless
Carregando automaticamente wireless via ndiswrapper II
Nenhum comentário foi encontrado.
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
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Inkscape Atualização 1.4 [RESOLVIDO] (8)
samba4 - 4.21 utilizar phpldapadmin [RESOLVIDO] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta