viernes, 23 de junio de 2017

Script en PHP para monitorear varios equipos

En mi trabajo era necesario verificar constantemente la conectividad de varios equipos de la red, en su mayorìa dispositivos inalàmbricos con el fin de conocer el estatus de cada uno de ellos, esta tarea se volvìa tediosa ya que el mètodo que usabamos era haciendo ping (muchos van a comentar que el ping es un tema de seguridad, etc, pero en una red interna definiendo las reglas adecuadamente se evitan cosas como el ping de la muerte, etc), muchas veces no recordaba cual era la ip a revisar, en vista de ello investigué un poco en la red, y estudiando un poco más el tema diseñé algo que quizás pueda servirles.

El código está hecho en PHP, puede ser usado en Linux o Windows (Al final detallo un ligero cambio en la funcion "hacerping" si vas a usarlo en Windows), se usa básicamente el comando ping para este script, obviamente debes tener permisos en tu servidor de php para poder hacerlo, las configuraciones están en la red y no es el tema, si desean ayuda puedo guiarlos, solo dejen el comentario. sin más preámbulos:

Pasos a Seguir:

1) Tener un servidor con servicios de Apache (O cualquier otro servidor Web, solo lo he probado con apache 2)

2) Librerías php5 para para Apache 2

3) Creen una carpeta para colocar el script, dentro de ella creas otra llamada imagenes, puedes revisar el código y colocar los archivos de imagenes que mas te gusten.

3) Código:
Solo debes colocar las direcciones ip a las que deseas hacer el monitoreo, en mi caso hay 12, las
agrupo en 2 bloques, en la parte superior los accesos a la red pública, y en la parte inferior los dispositivos locales. La ip de Internet es cualquier IP Pública que permita ping

// Inicio del Código
<?php
//Para Acceso a Internet y Equipos en la Sala de telematica
$ipinternet = "104.23.136.14";
$iprouter = "IP Del Router hacia Internet, es el equipo más extremo a la red";
$ipinformatica = "Ip que desees Evaluar";
$ipproxy = "Ip que desees Evaluar";
echo '<font size="18" face="Arial">';
echo '<font color="000000">';

//Para Monitoreo de los radio del Campus Universitario

$almaserver = "Ip que desees Evaluar";
$almacliente = "Ip que desees Evaluar";
$produccion = "Ip que desees Evaluar";
$pnfserver = "Ip que desees Evaluar";
$pnfcliente = "Ip que desees Evaluar";
$electricidadserver = "Ip que desees Evaluar";
$chuito = "Ip que desees Evaluar";
$agustin = "Ip que desees Evaluar";

function hacerPing($ip) {
$str = exec("ping -c 1 -w 1 $ip", $res, $ret);
    if ($ret == 0) {
        return true;
    }
    return false;
}

if (hacerPing($ipproxy)=== true) {
    $estatusproxy= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $estatusproxy= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}

if (hacerPing($ipinformatica)=== true) {
    $estatusgateway= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
$gateway=1;
} else {
$gateway=0;
$estatusinternet= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
$estatusrouter= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
    $estatusgateway= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}
if ($gateway==1)
{

if (hacerPing($iprouter)=== true) {
    $estatusrouter ="<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $estatusrouter= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}

if (hacerPing($ipinternet)=== true) {
    $estatusinternet= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $estatusinternet=  "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}
}

echo "
<table border='0>
<table style='width:800px; height: 125px;' border='1'>
<style>
table.roundedCorners {
  border: 1px solid DarkOrange;
  border-radius: 13px;
  border-spacing: 0;
  }
table.roundedCorners td,
table.roundedCorners th {
  border-bottom: 1px solid DarkOrange;
  padding: 3px;
  }
table.roundedCorners tr:last-child > td {
  border-bottom: none;
}
</style>
<table class='roundedCorners'>
<tbody>
<tr>
<td><b>Red de Monitoreo Red de Informatica</b></td>
</tr>
</tbody>
</table>
<tr></tr>

<table border='1>
<table style='width:800px; height: 125px;' border='1'>
<table class='roundedCorners'>
<tbody>
<tr>
<td style='width: 189px';><b>Descripcion&nbsp;</td>
<td style='width: 115px;'align='center'><b>Estatus</td>
<td style='width: 66px;'align='center'><b>Ref&nbsp;</b></td>
<td></td>
<td style='width: 189px';><b>Descripcion&nbsp;</td>
<td style='width: 115px;'align='center'><b>Estatus</td>
<td style='width: 66px;'align='center'><b>Ref&nbsp;</b></td>
</tr>

<tr>
<td style='width: 189px;'>&nbsp;Proxy de Inform&aacute;tica</td>
<td style='width: 115px;'align='center'>"; echo $estatusproxy; echo"</td>
<td style='width: 66px;' align='center' >"; echo "<img src='imagenes/proxy.jpg' 'width=60 height=60'>"; echo"</td>
<td></td>
<td style='width: 189px;'>&nbsp;Gateway de Informatica</td>
<td style='width: 115px;'align='center'>"; echo $estatusgateway; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/gateway2.jpg' 'width=49 height=49' >"; echo "</td>
</tr>
<tr>
<td style='width: 189px;'>&nbsp;Router de la Universidad</td>
<td style='width: 115px;'align='center'>"; echo $estatusrouter; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/router.jpg' 'width=60 height=60'>"; echo "</td>
<td> <font size='3' color='white'>-----------</td>
<td style='width: 189px;'>&nbsp;Acceso de CANTV</td>
<td style='width: 115px;'align='center'>"; echo $estatusinternet; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/internet.jpg' 'width=80 height=80'>"; echo "</td>
</tr>
</tbody>
</table>
";


if (hacerPing($almaserver)=== true) {
    $almaserver= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $almaserver= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}

if (hacerPing($almacliente)=== true) {
    $almacliente= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $almacliente= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}

if (hacerPing($produccion)=== true) {
    $produccion= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $produccion= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}

if (hacerPing($pnfserver)=== true) {
    $pnfserver= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $pnfserver= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}

if (hacerPing($pnfcliente)=== true) {
    $pnfcliente= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $pnfcliente= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}

if (hacerPing($electricidadserver)=== true) {
    $electricidadserver= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $electricidadserver= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}

if (hacerPing($chuito)=== true) {
    $chuito= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $chuito= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}

if (hacerPing($agustin)=== true) {
    $agustin= "<img src='imagenes/arriba.jpg' 'width=40 height=40'><br>";
} else {
    $agustin= "<img src='imagenes/abajo.jpg' 'width=40 height=40'><br>";
}


//
echo "
<style>
table.roundedCorners {
  border: 1px solid DarkOrange;
  border-radius: 13px;
  border-spacing: 0;
  }
table.roundedCorners td,
table.roundedCorners th {
  border-bottom: 1px solid DarkOrange;
  padding: 3px;
  }
table.roundedCorners tr:last-child > td {
  border-bottom: none;
}
</style>


<table border='0>
<table style='width:800px; height: 125px;' border='1' border: 1px solid orange;>
<table class='roundedCorners'>
<tbody>
</br>
<tr>
<td><b>Red de Monitoreo Nodos Wireless</b></td>
</tr>
</tbody>
</table>
<tr></tr>
<table border='1>
<table style='width:800px; height: 125px;' border='1'>
<table class='roundedCorners'>
<tbody>
<tr>
<td style='width: 189px';><b>Descripcion&nbsp;</td>
<td style='width: 115px;'align='center'><b>Estatus</td>
<td style='width: 66px;'align='center'><b>Ref&nbsp;</b></td>
<td></td>
<td style='width: 189px';><b>Descripcion&nbsp;</td>
<td style='width: 115px;'align='center'><b>Estatus</td>
<td style='width: 66px;'align='center'><b>Ref&nbsp;</b></td>
</tr>

<tr>
<td style='width: 189px;'>&nbsp;Alma Mater (Servidor)</td>
<td style='width: 115px;'align='center'>"; echo $almaserver; echo"</td>
<td style='width: 66px;' align='center' >"; echo "<img src='imagenes/radio-server.jpg' 'width=60 height=60'>"; echo"</td>
<td> <font size='3' color='white'>-----------</td>
<td style='width: 189px;'>&nbsp;Alma Mater (Cliente)</td>
<td style='width: 115px;'align='center'>"; echo $almacliente; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/radio-server.jpg' 'width=60 height=60' >"; echo "</td>
</tr>

<tr>
<td style='width: 189px;'>&nbsp;PNF (Server)</td>
<td style='width: 115px;'align='center'>"; echo $pnfserver; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/radio-server.jpg' 'width=60 height=60'>"; echo "</td>
<td> <font size='3' color='white'>-----------</td>
<td style='width: 189px;'>&nbsp;PNF (Cliente)</td>
<td style='width: 115px;'align='center'>"; echo $pnfcliente; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/pnfcliente.jpg' 'width=60 height=60'>"; echo "</td>
</tr>
<tr>
<td style='width: 189px;'>&nbsp;Electricidad (Server)</td>
<td style='width: 115px;'align='center'>"; echo $electricidadserver; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/radio-server.jpg' 'width=60 height=60'>"; echo "</td>
<td> <font size='3' color='white'>-----------</td>
<td style='width: 189px;'>&nbsp;Electricidad (Taller)</td>
<td style='width: 115px;'align='center'>"; echo $chuito; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/radio-server.jpg' 'width=60 height=60'>"; echo "</td>
</tr>
<tr>
<td style='width: 189px;'>&nbsp;Electricidad (Cubiculos)</td>
<td style='width: 115px;'align='center'>"; echo $agustin; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/radio-server.jpg' 'width=60 height=60'>"; echo "</td>
<td> <font size='3' color='white'>-----------</td>
<td style='width: 189px;'>&nbsp;Taller de Produccion la Sabana</td>
<td style='width: 115px;'align='center'>"; echo $produccion; echo"</td>
<td style='width: 66px;' align='center'>"; echo "<img src='imagenes/radio-server.jpg' 'width=60 height=60'>"; echo "</td>

</tr>
</tr>

</tbody>
</table>

";
/////

En el caso de que tu servicio web esté en un equipo con Windows, debes sustituir en la función  hacer ping en sus parámetros la opción "-c" por la opción "-n", es decir que quedaría así:




function hacerPing($ip) {
$str = exec("ping -n 1 -w 1000 $ip", $res, $ret);
    if ($ret == 0) {
        return true;
    } 
    return false;
}

Como (según percibo) el tiempo de respuesta del ping en Windows pareciera ser un poco más lento, modifico los parámetros para no obtener de buenas a primeras respuestas negativas, incrementando en 1000 la opción "w"que no es más que el tiempo de espera para dar respuesta en milisegundos.

Quizás piensen que el código es complejo y no es así, solo copien y peguen y sustituyan a las ip de ustedes, si son pocas la ip que necesitan monitorear solo eliminen las que no necesiten y editen las entradas en html para lo que necesitan, si eres muy novato en esto, deja solo las ip que te interesan y las otras las pones en blanco, es decir, borras las ip, algo asi como por ejemplo:
$almaserver = "";
$almacliente = "";
$produccion = "";
$pnfserver = "";
$pnfcliente = "";
$electricidadserver = "";
$chuito = "";
$agustin = "";

claro está que si lo hacen así van a ver algunos errores, en todo caso practica y corrige poco a poco.

Muestra real del código
Aquí pueden apreciar como 2 equipos estás desconectados posiblemente están apagados o hay algún error de enlace o de hardware en los radios, es tarea de verificarlos. pero de manera rápida y efectiva se puede visualizar el comportamiento de nuestros nodos de interconexión.

Si crean un archivo php (en mi caso se llama "estatus.php" sin la carpeta imagenes van a tener un resultado poco visual, los invito a que busquen imagenes que les agraden y las mencionan en los comentarios!!! Pero si les gusta esta imagenes pueden descargar las que usé y colocándola dentro de una carpeta llamada "imagenes":-)

Para los que se les complica un poco la cosa aqui les dejo el enlace https://goo.gl/rmaVR6 para que descarguen la carpeta con el código y las imágenes.

La fuente original de mi investigación proviene de: https://stackoverflow.com/questions/9841635/how-can-i-ping-a-server-port-with-php


Espero les guste.




Lampara de Eemergencia

Con la crisis energética en Venezuela muchos nos vimos en la necesidad de resolver el problema de alguna manera, en mi caso lo resolví busca...