Como Monitorar Servidores E Estações De Usuários Em PHP

A primeira atitude que qualquer administrador de redes toma quando pretende analisar sua rede é verificar através de sistemas de monitoramento se seus Servidores e Estações de Usuários estão respondendo ok.

Uma das formas de se analisar é executando o comando ping que é um dos comandos DOS mais conhecidos.

Claro que existem vários métodos de se executar tais integridades, mas com certeza tudo se torna mais prático quando você tem um sistema que faz a varredura e lhe informa quando a estação não está online.

Na matéria de hoje estaremos mostrando como elaborar este tipo de sistema que pode gerenciar facilmente sua rede de computadores.

servidor

Criando A Lista De Servidores

Antes de nos preocuparmos em monitorar a rede, precisamos levantar informações sobre os terminais, tais como:

  • Nome do Operador;
  • Nome do Computador;
  • IP do computador;
  • Departamento que pertence;
  • Tipo de máquina (se Servidor ou Estação de Usuário).

Após levantar tais informações, podemos elaborar uma lista que pode ser detalhada em .XLS ou algum outro documento que facilite nossos serviços, correto?

Para nossa solução, não muda muita coisa. Precisamos apenas organizar uma lista com o IP e NOME de cada computador.

Por esse motivo, estaremos criando um ficheiro com o nome “servidor.php” e organizando a lista com cada computador (conforme o ficheiro a seguir).


<?

# IP : nome do servidor

# S -> servidor
# R -> roteador
# P -> impressora

$servidor[] = "187.108.192.23:empresasnainternet.com.br:S"; # servidor (S)
$servidor[] = "187.108.192.23:qsasolucoescorporativas.com.br:S"; # servidor (S)
$servidor[] = "187.108.192.23:repupo.com.br:S"; # servidor (S)
$servidor[] = "74.86.244.168:webmasterphp.org:S"; # servidor (S)
$servidor[] = "67.228.213.188:webmaster.pt:S"; # servidor (S)
$servidor[] = "192.168.0.2:samara:S"; # servidor (S)
$servidor[] = "192.169.0.10:roteador:R"; # roteador (R)
$servidor[] = "192.168.0.11:DNS2:P"; # impressora (P)

?>

OBS.: Acima montei um exemplo com alguns Servidores que monitoro.

É IMPORTANTE LEMBRAR QUE: Os Servidores só serão monitorados, caso a rede dê as permissões devidas.

Ex.: Em alguns Servidores Linux, você só consegue monitorar se um Servidor externo está funcionando, se houver a liberação devida.

Preenchido o conteúdo a ser monitorado, vamos agora criar a página onde as informações aparecerão.

Criando A Página De Apresentação

A página externa pode ser adaptada conforme suas necessidades.

Para esta matéria, usamos um conteúdo simples que pode facilitar suas atividades.

1 – Atualização da página

Para sua página manter uma atualização constante, disponibilizamos o código a seguir, que atualizará a cada 60 segundos.



<META HTTP-EQUIV="Refresh" CONTENT="60">

2 – Email do Administrador

Na linha a seguir, você poderá inserir o email que receberá as mensagens com logs das atividades executadas:



$email_admin = "seu email";

Bem… veja abaixo o código da página “index.php” como deverá ficar:



<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META HTTP-EQUIV="Refresh" CONTENT="60">

<title>.:: WEBMASTER.PT :: Redes de Computadores e o PHP ::.</title>

<link rel="stylesheet" href="3col_rightNav.css" type="text/css">
</head><body>
<div id="masthead">
  <h1 id="siteName">WEBMASTER.PT</h1>
  <h2 id="pageName">Redes de Computadores e o PHP</h2>
</div>
<div id="content">
  
    <h2>Monitoramento das estações / Servidores</h2>
    <div class="story">
<?

// altere a linha abaixo com seu email
$email_admin = "seu email";

// inclui o ficheiro SERVIDOR.PHP
include "servidor.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 "

<h2>".$linha[1]."</h2>
IP: ".$linha[0]."
"."Status:";

$server_out .= "Nome: ".$linha[1]."
IP: ".$linha[0]."

";

# 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 "

<h2>".$linha[1]."</h2>
IP: ".$linha[0]."
"."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+");
$txt = "\n".date("d/m/Y - H:i:s")."  \t\t".$linha[0]." \t\t".$linha[1];
fwrite($fp2, $txt);

fclose($fp2);
}
echo (ereg("bytes from",$stream))?" Ativo":" Não responde ao ping";

echo " ";

if($l == 4){
echo "

";
$l = 0;
}

}

# Preparando para o envio de e-mail

if(isset($server_out) && $server_out && isset($alerta) && $alerta){
if($f = 1) $server_out = "".$alerta."

Os Servidores abaixo encontram-se indisponível:

".$server_out;
if($f > 1) $server_out = "".$alerta."

Os Servidores abaixo encontram-se indisponíveis:

".$server_out;

# formatando um e-mail, com uma tabela e as informações a serem enviadas
$assunto = "ALERTA - Monitoramento de Servidores";
$msg = "

Alerta: ".date("d/m/Y - H:i:s")."

".$server_out."

Sistema de Monitoramento<br>QSA Soluções Corporativas

Este é um e-mail automático, por favor não responda essa mensagem.

";

//adicionando o html no corpo do email
echo "
";

//enviando e retornando o status de envio
if(mail($email_admin,$assunto,$msg))
echo "Alerta Enviado para (Seu email)";
else
echo "Houve um erro ao  enviar o email! ".$mail->ErrorInfo;

echo " ";

}

}
?>

    </div>

</div>
</body></html>

OBS.: O sistema deverá criar arquivos .txt que gravarão logs e informações das atividades executadas.

Caso você queira, poderá inserir novos recursos neste ficheiro. Só não se esqueça de efetuar liberações no Servidor para leitura das máquinas da Rede e o envio periódico das mensagens.

Download Do Código Usado Neste Tutorial: Como Monitorar Servidores E Estações De Usuários

Be Sociable, Share!

9 Comentários

  1. Leonardo

    Bom dia, obrigado pelo post. pesso que venha me ajudar pois não consegui, esta dando erro

    IP: ".$linha[0]." "."Status:"; $server_out .= "Nome: ".$linha[1]." IP: ".$linha[0]." "; # Adiciono mais uma tentativa etc

  2. Edmilson Britto de Almeida

    Ótima&nbsp;materia, so&nbsp;precisa&nbsp;atualizar a function (ereg) do PHP, pois estamos no PHP5, para corrigir acho que deve fazer o uso da function (preg_match) para que ele funcione corretamente e&nbsp;também a tag do php no inicio do código &lt;? para &lt;?php..&nbsp;.

  3. Jean Decker

    Boa tarde, precisei fazer algumas alterações no index.php além das citadas acima como: if(!preg_match("/bytes from/",$stream)){   e  echo (preg_match("/bytes from/",$stream))?" Ativo"

    Após as alterações parou de dar os erros mas continua não pingando, mesmo na rede local:
    DCIP: 10.1.1.1 Status: Não responde ao ping

    No servidor onde está hospedado o código é possível pingar sem problemas

    att,

  4. Pedro

    Bom dia, Parabens pelo post. pesso que venha me ajudar pois não consegui, esta dando o seguinte erro

    IP: ".$linha[0]." "."Status:"; $server_out .= "Nome: ".$linha[1]." IP: ".$linha[0]." "; #

  5. Pedro

    Fiz todas as alteraçoes mas continua não pingando, sera que alguem conseguiu consertar o codigo, estou tentando assim que consegui vou postar a solução.

  6. Para corrigir o problema de status, basta alterar o texto "bytes from" para "Resposta de", pois o sistema em PHP busca a resposta do sistema operacional, e possível que o seu não esteja em inglês, e sim em português.

    Aqui fiz a alteração e funcionou perfeitamente!

Participa! Comenta...