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<br /><?php<br /># IP : nome do servidor : Tipo de icone<br /><br /># S -> servidor<br /># R -> roteador<br /># P -> impressora<br /><br />#SERVIDORES SAO PAULO<br />$servidor[] = "10.0.0.10:BSD-SERVER1:S"; # servidor (S)<br />$servidor[] = "10.0.0.11:BSD-SERVER2:S"; # servidor (S)<br />$servidor[] = "10.0.0.12:BSD-SERVER3:R"; # roteador (R)<br />$servidor[] = "10.0.0.13:BSD-SERVER4:P"; # impressora (P)<br /><br />?>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<br /><br /><html><br /><head><br /><meta HTTP-EQUIV = "Refresh" ><br /><SCRIPT language=JavaScript><br /> // CONTENT = "60; URL = index.php"<br /> var g_iCount = new Number();<br /><br /> var g_iCount = 61;<br /><br />// Função para contagem regressiva - de 1 em 1 minuto<br />function startCountdown(){<br /> if((g_iCount - 1) >= 0){<br /> g_iCount = g_iCount - 1;<br /> document.getElementById('numberCountdown').innerHTML = "Atualização em " + g_iCount + " segundo(s)";<br /> setTimeout('startCountdown()',1000); <br /> }else<br /> document.location.href='index.php';<br />}<br /></SCRIPT><br /><br /><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><br /><style type="text/css"><br />body {<br /> margin-left: 0px;<br /> margin-top: 0px;<br /> margin-right: 0px;<br /> margin-bottom: 0px;<br />}<br /></style><br /></head><br /><body><br /><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><br /><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 /><br /><br style="clear:both"><br /><?php<br /><br /># inclui o arquivo com o vetor de servidores<br />include "servidores.php";<br /><br />if(isset($servidor)){<br /><br /> # inicio as variáveis<br /> $l = 0;<br /> $server_out = "";<br /> $f = 0;<br /> $alerta = "";<br /><br /> for($i = 0; $i < count($servidor); $i++){<br /><br /> $linha = explode(":",$servidor[$i]);<br /> $l++;<br /><br /> # executo o ping e verifico se retornou algum byte<br /> $stream = shell_exec("ping -c 1 -t 1 ".$linha[0]);<br /><br /> # se não retornou eu adiciono um contador, exibo na tela em vermelho os dados do servidor, impressoa ou roteador<br /> if(!ereg("bytes from",$stream)){<br /> $a = "I";<br /> $f++;<br /> 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;\"><br /> <div style=\"width:60px; float:left;height:60px;\"><img src='".$linha[2].".png'></div><br /> <div style=\"margin-left:10px; vertical-align:middle; float:left\"><br><strong>".$linha[1]."</strong><br />".$linha[0]."<br>"."Status:"; <br /><br /> $server_out .= "Nome: <strong style='color:#e30000'>".$linha[1]."</strong><br />IP: <strong style='color:#e30000'>".$linha[0]."</strong><br /><br />";<br /><br /> # Adiciono mais uma tentativa ao meu contador, um arquivo texto desse servidor<br /> if(!file_exists("./".$linha[0].".txt")) shell_exec('touch '.$linha[0].".txt");<br /><br /> $fp = fopen("./".$linha[0].".txt", "r+");<br /> $t = fread($fp,2);<br /> fclose($fp);<br /><br /> # 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<br /> if($t >= 35){<br /> $t = 3;<br /> $alerta = "ATENÇÃO, OUTROS ALERTAS JÁ FORAM EMITIDOS PARA ESSE(S) SERVIDOR(S)!";<br /> }else<br /> $t++;<br /><br /> # Caso seja o primeiro alerta (depois da 3ª tentativa ele envia um e-mail)<br /> if($t == 4 && !$alerta)<br /> $alerta = "PRIMEIRO ALERTA! (3ª tentativa)";<br /><br /> $fp = fopen("./".$linha[0].".txt", "w");<br /> fwrite($fp, $t);<br /><br /> fclose($fp);<br /><br /> # Gravar Log Erro <br /> $fp2 = fopen("./ERR_".date("d-m-Y").".txt", "a+");<br /> $txt = "\n".date("d/m/Y - H:i:s")." \t\t".$linha[0]." \t\t".$linha[1];<br /> fwrite($fp2, $txt);<br /><br /> fclose($fp2); <br /><br /> }<br /><br /> # 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.<br /> else{<br /> 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;\"><br /> <div style=\"width:60px; float:left;height:60px;\"><img src='".$linha[2].".png'></div><br /> <div style=\"margin-left:10px; vertical-align:middle; float:left\"><br><strong>".$linha[1]."</strong><br />".$linha[0]."<br>"."Status:";<br /><br /> # Apaga o arquivo caso esteja pingando<br /> if(file_exists("./".$linha[0].".txt")) unlink("./".$linha[0].".txt");<br /><br /> $a = "A";<br /><br /> # gravo o acerto - só para ter um log<br /> # Gravar Log Acerto <br /> $fp2 = fopen("./OK_".date("d-m-Y").".txt", "a+");<br /> $lin = explode(" ",$stream);<br /> $txt = "\n".date("d/m/Y - H:i:s").";".$lin[10].";".str_replace("time=","",$lin[11]).";".$linha[0].";".$linha[1];<br /> fwrite($fp2, $txt);<br /><br /> fclose($fp2); <br /> }<br /> echo (ereg("bytes from",$stream))?" <strong>Ativo</strong>":" <font color='#fff008'><strong>Não responde ao ping</strong></font></font>";<br /><br /> echo "</div></div>"; <br /><br /> if($l == 4){<br /> echo "<br style=\"clear:both\"><br />";<br /> $l = 0;<br /> }<br /><br /> }<br /><br /> # Preparando para o envio de e-mail<br /><br /> if(isset($server_out) && $server_out && isset($alerta) && $alerta){<br /> if($f = 1) $server_out = "<span style='color:#e30000'>".$alerta."</span><br /><br />O Servidor abaixo encontra-se indisponível:<br />".$server_out;<br /> if($f > 1) $server_out = "<span style='color:#e30000'>".$alerta."</span><br /><br />Os Servidores abaixo encontram-se indisponíveis:<br />".$server_out;<br /><br /> # formatando um e-mail, com uma tabela e as informações a serem enviadas<br /> $assunto = "ALERTA - Painel de Monitoramento de Servidores";<br /> $msg = "<table width='570' border='0' cellspacing='0' cellpadding='0'><br /> <tr><br /> <td height='70'><img src='http://10.0.0.250/rede/seguranca.jpg' width='500' height='86' /></td><br /> </tr><br /> <tr><br /> <td><br /><font face='Verdana, Geneva, sans-serif' size='1' color='#333333'><br /> Alerta: <strong>".date("d/m/Y - H:i:s")."</strong><br /><br /><br /> ".$server_out."<br /> <br /><br /> Download de arquivos:<br /><br /> <a href='http://10.0.0.250/rede/ERR_".date("d-m-Y").".txt'><font color='#e30000'><strong>Ping retornado</strong></font></a> <br /> <a href='http://10.0.0.250/rede/OK_".date("d-m-Y").".txt'><font color='#006600'><strong>Ping enviado</strong></font></a><br /> </a><br /> <br /><br /><br /><br /><br /><br /> <font face='Verdana, Geneva, sans-serif' size='1' color='#333333'><strong>TUBARAO - Monitoramentos</strong><br /><br /></font><br /> <font face='Verdana, Geneva, sans-serif' size='1' color='#006600'>Este é um e-mail automático, por favor não responda essa mensagem.</font><br /> </font><br /> </td><br /> </tr><br /> </table>";<br /><br /> //adicionando o html no corpo do email<br /> 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;\">";<br /><br /> //enviando e retornando o status de envio<br /> if(mail('seu_email@dominio.com',$assunto,$msg))<br /> echo "<b>Alerta Enviado para (Seu email)</b>";<br /> else<br /> echo "<b>Houve um erro ao enviar o email! </b>";<br /><br /> echo "</div></div>";<br /> }<br /><br />}<br /><br />?><br /><br /><!-- Inicia o contador assim que a página for carrega totalmente !><br /><script language="javascript"><br /> startCountdown();<br /></script><br /><br /></body><br /></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







