Dev (Back & Front)ARTIGO

Painel de Controle de Servidores Ativos

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&Ccedil;&Atilde;O, OUTROS ALERTAS J&Aacute; 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&atilde;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&iacute;vel:<br />".$server_out;<br />        if($f > 1) $server_out = "<span  style='color:#e30000'>".$alerta."</span><br /><br />Os Servidores abaixo encontram-se indispon&iacute;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> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;       <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 &eacute; um e-mail autom&aacute;tico, por favor n&atilde;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

é formado em ciência da computação – UNIS MG, pós-graduado em Redes de Computadores – UNIS MG, analista de sistemas, professor e desenvolvedor WEB.

Ver perfil

Mais de Marcelo Nunes Simoni