MONITORANDO UPTIME DE LINKS/MÁQUINAS COM UM SIMPLES PHP

Um dos grandes problemas da vida de um SysAdmin é visualizar o problema antes que ele cause um problema aos seus usuários. Ou seja, proatividade não é simplesmente uma frescura, mas sim, uma obrigação de quem mantém grandes estruturas de TI.
O Software Livre[bb] nos fornece diversas ferramentas de gerenciamento deste tipo, como o Nagios e o Zabbix, que nos mostram se realmente o problema está ocorrendo, histórico do mesmo e ainda, disparando avisos via qualquer meio que quisermos ( inclusive Jabber ).
Mas, uma coisa que eu sempre visualizo como problema é : será que, mesmo eu estando acessando meu link aqui, sem problemas, alguém de fora está me vendo ?
Será que quando a minha operadora diz que está tudo ok, realmente está ?

Tendo em vistas estas perguntas, sempre pensei em um Co-Location de uma máquina no exterior, somente para efetuar este monitoramento externo dos servidores que eu administro/administrava.
Mas, em termos de custo, isto seria inviável. Manter uma estrutura desta somente para prestar um serviço pequeno de monitoramento, na realidade, é um custo um pouco alto demais para um ganho digamos, ínfimo em termos de contratos.

Assim, comecei a pensar em como gerar uma boa estrutura para este tipo de gerenciamento e cheguei no famoso PHP[bb] como um shell script. Na realidade, criei um pequeno shell script em PHP que efetua estes testes e gera um pequeno relatório em HTML que pode ser usado por você ( ou sua diretoria ) para cobrança de ações junto a sua operadora de serviços internet/dados.

<?php

putenv("TZ=America/Sao_Paulo");
$hora = date("d/m/Y H:i:s");

$horatotal = date("d-m-Y");

$arquivo = "/path/para/o/arquivo/de/relatorios/uptime-$horatotal.html";
$servidores = array (
"maquina1.servidor.com.br" => "200.200.200.200",
"maquina2.servidor.com.br" => "200.200.200.201"
);

$ENDERECOS = array (
"sysadmin" => "sysadmin@servidor.com.br",
"CELULAR" => "seunumerocelular@operadora.com.br"
);


while (list($site,$ip) = each($servidores)) {
$comando = "/usr/pkg/bin/ping -c 8 -i 5 " . $ip;
$saida = shell_exec($comando);

$texto = $texto.$hora." ".$site." ".$ip." "."Status:";
if ( ereg("bytes from",$saida) ) {
$texto = $texto."<b>online</b><br />";
} else {
while(list($nome,$email) = each($ENDERECOS))
{
mail($email,"QUEDA $site","CRITICO - LINK DOWN");
}
$texto = $texto. "<font color=red><b>não responde</b></font><br />";
}
}
$abre = fopen($arquivo, "a+"); // Abre o arquivo
$salva = fwrite($abre, $texto); // Escreve no arquivo o
fclose($abre); // Fecha o arquivo novamente

shell_exec("/bin/chmod 644 $arquivo");

////////////
// EOF /////
////////////
?>

Explicando o código :-)
Na realidade, este código efetua um simples ping na máquina, em número de oito, de cinco em cinco segundos.
Após isto, ele testa se houve alguma resposta, e grava um log. Caso haja o erro, ele também remete um email para os contatos cadastrados.

Além disto, com o putenv levei em consideração que o script pode estar em uma máquina fora do país, e devemos levar sempre em consideração o Timezone local.

O script, pelo menos para mim, já resolveu algumas vezes. Sempre que obtenho reclamações, vou lá no arquivo de uptime e vejo se realmente está algo offline.

E, ainda, em termos de custo, simplesmente com uma conta shell ou até, uma hospedagem tipo a Dreamhost, que lhe fornece um shell, você resolve este problema :-) ( na SDF você pode conseguir uma conta shell gratuita sem problemas ).

Mas, há um porém que deve ser lembrado. Tal teste deve servir somente como uma simples referência pois o tratamento de erros neste caso é bem pobre.
Mas, serve como uma ajuda a mais, para que nós, SysAdmins comecemos a ser um pouco mais onipresentes ;-)
Espero que este script seja útil a mais alguém.