Quem trabalha com redes de computadores, conhece como é difícil e árdua a tarefa de ficar verificando se algum servidor está ativo ou se o mesmo caiu. Geralmente ficamos sabendo após alguns telefonemas com reclamações ou críticas.
Então resolvi elaborar um script em PHP que executa um ping no servidor e verifica se ele está ativo, respondendo pela porta 80 (HTTP). O ideal é colocar esse painel em um monitor separado e deixar ligado, só observando e torcendo para não ficar vermelho alguns deles.
Funciona da seguinte maneira:
– Primeiro ele faz um ping para os servidores que estão gravados em forma de vetores no arquivo chamado servidores.php
– Caso ele não consiga realizar o ping, ele vai iniciar um arquivo txt com o nome do servidor, esse arquivo irá ter um contador de tentativas. Quando ele tenta 3 vezes e não consegue pingar, envia o primeiro email informando o problema.
– Após isso, ele vai tentando até chegar à trigésima tentativa, e então envia um segundo email, ou seja, a cada 30 minutos ele envia um e-mail informando que os servidors estão offline. Caso ele consiga pingar na décima tentativa, ele apaga o arquivo, pois significa que a conexão foi reestabelecida.
– Algumas variáveis devem ser setadas como as imagens, ip do servidor, permissão de escrita e leitura de arquivos no diretório;
– Um lembrete é que você deve configurar a forma como envia e-mail, no meu caso utilizo a função mail do PHP e a imagem de alerta fica em um IP da rede interna para que possa ser visualizada no e-mail.
É claro que você pode modificar o tempo de refresh da página que atualmente está em 1 minuto e outras.
Esse sistema está sendo utilizado atualmente para verirficar impressoras ativas, servidores e roteadores. Está em um monitor ligado, parado na sala de redes e quando algo fica em vermelho, já é hora de ficar em alerta.
INÍCIO
Para realizar esse trabalho, iremos precisar de dois arquivos, um chamado servidor.php com o conteúdo abaixo:
servidor.php
<?php
# IP : nome do servidor : Tipo de icone
# S -> servidor
# R -> roteador
# P -> impressora
#SERVIDORES SAO PAULO
$servidor[] = "10.0.0.10:BSD-SERVER1:S"; # servidor (S)
$servidor[] = "10.0.0.11:BSD-SERVER2:S"; # servidor (S)
$servidor[] = "10.0.0.12:BSD-SERVER3:R"; # roteador (R)
$servidor[] = "10.0.0.13:BSD-SERVER4:P"; # impressora (P)
?>
Esse arquivo é um vetor, com o ip, nome, e tipo ambos separados por “:”. Pode adicionar quantos desejar que a lista vai sendo gerada.
Agora é a hora de montarmos nosso painel de gerenciamento:
index.php
<html>
<head>
<meta HTTP-EQUIV = "Refresh" >
<SCRIPT language=JavaScript>
// CONTENT = "60; URL = index.php"
var g_iCount = new Number();
var g_iCount = 61;
// Função para contagem regressiva - de 1 em 1 minuto
function startCountdown(){
if((g_iCount - 1) >= 0){
g_iCount = g_iCount - 1;
document.getElementById('numberCountdown').innerHTML = "Atualização em " + g_iCount + " segundo(s)";
setTimeout('startCountdown()',1000);
}else
document.location.href='index.php';
}
</SCRIPT>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body {
margin-left: 0px;
margin-top: 0px;
margin-right: 0px;
margin-bottom: 0px;
}
</style>
</head>
<body>
<DIV style="width:450px; float:left; border:none;font-family:Verdana, Geneva, sans-serif; font-size:16px; color:#069; margin-left:10px;"><strong>Painel de Monitoramento de Servidores</strong></DIV>
<DIV style="font-family:Verdana, Geneva, sans-serif; border:none; font-size:14px; font-weight:bold; color:#990000; margin-left:10px; width:300px; float:left;" id=numberCountdown></DIV>
<br style="clear:both">
<?php
# inclui o arquivo com o vetor de servidores
include "servidores.php";
if(isset($servidor)){
# inicio as variáveis
$l = 0;
$server_out = "";
$f = 0;
$alerta = "";
for($i = 0; $i < count($servidor); $i++){
$linha = explode(":",$servidor[$i]);
$l++;
# executo o ping e verifico se retornou algum byte
$stream = shell_exec("ping -c 1 -t 1 ".$linha[0]);
# se não retornou eu adiciono um contador, exibo na tela em vermelho os dados do servidor, impressoa ou roteador
if(!ereg("bytes from",$stream)){
$a = "I";
$f++;
echo "<div style=\"margin-left:10px; background-color:#e30000; vertical-align:middle; float:left; font-family:Verdana, Geneva, sans-serif; font-size:10px; color:#fff; height:60px; width:250px; border:solid 1px #999;\">
<div style=\"width:60px; float:left;height:60px;\"><img src='".$linha[2].".png'></div>
<div style=\"margin-left:10px; vertical-align:middle; float:left\"><br><strong>".$linha[1]."</strong><br />".$linha[0]."<br>"."Status:";
$server_out .= "Nome: <strong style='color:#e30000'>".$linha[1]."</strong><br />IP: <strong style='color:#e30000'>".$linha[0]."</strong><br /><br />";
# Adiciono mais uma tentativa ao meu contador, um arquivo texto desse servidor
if(!file_exists("./".$linha[0].".txt")) shell_exec('touch '.$linha[0].".txt");
$fp = fopen("./".$linha[0].".txt", "r+");
$t = fread($fp,2);
fclose($fp);
# se já houve mais de 35 tentativas, envio um e-mail e zero o contador, lembrando que cada tentativa, tem um intervalo de 1 minuto
if($t >= 35){
$t = 3;
$alerta = "ATENÇÃO, OUTROS ALERTAS JÁ FORAM EMITIDOS PARA ESSE(S) SERVIDOR(S)!";
}else
$t++;
# Caso seja o primeiro alerta (depois da 3ª tentativa ele envia um e-mail)
if($t == 4 && !$alerta)
$alerta = "PRIMEIRO ALERTA! (3ª tentativa)";
$fp = fopen("./".$linha[0].".txt", "w");
fwrite($fp, $t);
fclose($fp);
# Gravar Log Erro
$fp2 = fopen("./ERR_".date("d-m-Y").".txt", "a+");
$txt = "\n".date("d/m/Y - H:i:s")." \t\t".$linha[0]." \t\t".$linha[1];
fwrite($fp2, $txt);
fclose($fp2);
}
# se não houve erro, ele exclui o arquivo de texto (contador) caso esteja criado pois o servidor voltou a responder, então exibo a tela com as informações normais como nome, ip, status e o desenho.
else{
echo "<div style=\"margin-left:10px; vertical-align:middle; float:left; font-family:Verdana, Geneva, sans-serif; font-size:10px; color:#666; height:60px; width:250px; border:solid 1px #999;\">
<div style=\"width:60px; float:left;height:60px;\"><img src='".$linha[2].".png'></div>
<div style=\"margin-left:10px; vertical-align:middle; float:left\"><br><strong>".$linha[1]."</strong><br />".$linha[0]."<br>"."Status:";
# Apaga o arquivo caso esteja pingando
if(file_exists("./".$linha[0].".txt")) unlink("./".$linha[0].".txt");
$a = "A";
# gravo o acerto - só para ter um log
# Gravar Log Acerto
$fp2 = fopen("./OK_".date("d-m-Y").".txt", "a+");
$lin = explode(" ",$stream);
$txt = "\n".date("d/m/Y - H:i:s").";".$lin[10].";".str_replace("time=","",$lin[11]).";".$linha[0].";".$linha[1];
fwrite($fp2, $txt);
fclose($fp2);
}
echo (ereg("bytes from",$stream))?" <strong>Ativo</strong>":" <font color='#fff008'><strong>Não responde ao ping</strong></font></font>";
echo "</div></div>";
if($l == 4){
echo "<br style=\"clear:both\"><br />";
$l = 0;
}
}
# Preparando para o envio de e-mail
if(isset($server_out) && $server_out && isset($alerta) && $alerta){
if($f = 1) $server_out = "<span style='color:#e30000'>".$alerta."</span><br /><br />O Servidor abaixo encontra-se indisponível:<br />".$server_out;
if($f > 1) $server_out = "<span style='color:#e30000'>".$alerta."</span><br /><br />Os Servidores abaixo encontram-se indisponíveis:<br />".$server_out;
# formatando um e-mail, com uma tabela e as informações a serem enviadas
$assunto = "ALERTA - Painel de Monitoramento de Servidores";
$msg = "<table width='570' border='0' cellspacing='0' cellpadding='0'>
<tr>
<td height='70'><img src='http://10.0.0.250/rede/seguranca.jpg' width='500' height='86' /></td>
</tr>
<tr>
<td><br /><font face='Verdana, Geneva, sans-serif' size='1' color='#333333'>
Alerta: <strong>".date("d/m/Y - H:i:s")."</strong><br /><br />
".$server_out."
<br />
Download de arquivos:<br />
<a href='http://10.0.0.250/rede/ERR_".date("d-m-Y").".txt'><font color='#e30000'><strong>Ping retornado</strong></font></a>
<a href='http://10.0.0.250/rede/OK_".date("d-m-Y").".txt'><font color='#006600'><strong>Ping enviado</strong></font></a>
</a>
<br /><br /><br /><br /><br />
<font face='Verdana, Geneva, sans-serif' size='1' color='#333333'><strong>TUBARAO - Monitoramentos</strong><br /><br /></font>
<font face='Verdana, Geneva, sans-serif' size='1' color='#006600'>Este é um e-mail automático, por favor não responda essa mensagem.</font>
</font>
</td>
</tr>
</table>";
//adicionando o html no corpo do email
echo "<br style='clear:both'><div align='center' style=\"margin-top:15px; background-color:#e30000; vertical-align:middle; float:left; font-family:Verdana; font-size:10px; color:#fff; height:20px; width:500px; border:solid 1px #999;\"><div style=\"margin-top:4px;\">";
//enviando e retornando o status de envio
if(mail('seu_email@dominio.com',$assunto,$msg))
echo "<b>Alerta Enviado para (Seu email)</b>";
else
echo "<b>Houve um erro ao enviar o email! </b>";
echo "</div></div>";
}
}
?>
<!-- Inicia o contador assim que a página for carrega totalmente !>
<script language="javascript">
startCountdown();
</script>
</body>
</html>
Note que tenho ainda 3 imagens:
R.jpg para roteadores
P.jpg para impressoras
S.jpg para servidores
Você pode criar quantas variações quiser e também não pode-se esquecer de dar permissão de escrita nesse diretório para que ele possa criar os arquivos txt de log e contadores.
Acho que é só… espero ter ajudado a resolver alguns problemas e poder evitar alguns telefonemas de reclamação, pois estará sabendo quais estão fora antes do usuário ligar.
Uma dica a mais
Você pode importar esses arquivos para o Excel, separados por “;” e com isso gerar um gráfico de desempenho da sua rede. Ele deve gerar um gráfico com os dias de acesso, horário, tempo de resposta e o nome do servidor e IP.
Exemplo de arquivos sem erro:
Nome: OK_31-08-2010.txt
- 31/08/2010 – 23:59:00;ttl=255;0.821;10.0.0.22;nome_do_servidor
- 31/08/2010 – 23:59:00;ttl=254;0.652;10.0.0.58;nome_do_servidor
- 31/08/2010 – 23:59:00;ttl=255;0.194;10.0.0.95;nome_do_servidor
- 31/08/2010 – 23:59:00;ttl=255;0.213;10.0.0.100;nome_do_servidor
- 31/08/2010 – 23:59:00;ttl=60;1.363;10.0.0.206;nome_do_servidor
- 31/08/2010 – 23:59:00;ttl=255;0.288;10.0.0.214;nome_do_servidor
- 31/08/2010 – 23:59:00;ttl=255;0.307;10.0.0.215;nome_do_servidor
- 31/08/2010 – 23:59:00;ttl=255;0.249;10.0.0.216;nome_do_servidor
- 31/08/2010 – 23:59:01;ttl=128;0.509;10.0.0.225;nome_do_servidor
- 31/08/2010 – 23:59:01;ttl=255;0.297;10.0.0.231;nome_do_servidor
- 31/08/2010 – 23:59:01;ttl=255;0.182;10.0.0.239;nome_do_servidor
- 31/08/2010 – 23:59:01;ttl=128;0.193;10.0.0.240;nome_do_servidor
Exemplo de arquivo com erro:ERR_31-08-2010.txt
- 31/08/2010 – 00:02:43;192.168.42.245;nome_do_servidor
- 31/08/2010 – 00:09:56;10.0.0.95;nome_do_servidor
- 31/08/2010 – 00:56:09;10.0.0.201;nome_do_servidor
- 31/08/2010 – 00:56:10;10.0.0.225;nome_do_servidor
- 31/08/2010 – 00:56:11;10.0.0.243;Snome_do_servidor
- 31/08/2010 – 00:56:13;10.0.0.225;nome_do_servidor
- 31/08/2010 – 01:06:30;10.0.0.95;nome_do_servidor
- 31/08/2010 – 01:11:39;10.0.0.95;nome_do_servidor
- 31/08/2010 – 01:12:42;10.0.0.95;nome_do_servidor
- 31/08/2010 – 02:23:35;10.0.0.95;nome_do_servidor
- 31/08/2010 – 02:46:11;10.0.0.95;nome_do_servidor
- 31/08/2010 – 02:49:17;10.0.0.95;nome_do_servidor