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.938 ]
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";
}
}
Script para Detectar rede Wireless
Slowloris.pl (não foi feito por mim é apenas um compartilhamento.)
Script de conectividade wireless
Nenhum comentário foi encontrado.
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Programa fora de escala na tela do pc (9)
Fedora KDE plasma 42 X Módulo de segurança BB (Warsaw-2) (1)
O programa assinador digital (1)









