Documentacion para la construccion de un LOOK@LAN para linux centos 5.1 i386 en php+mysql+apache
A estas alturas usted instala todos estos RPM de la manera que pueda, ya sea con yum o con rpm -ivh XXX.rpm o incluso compilando.
Primero revisar que los siguientes RPM esten instalados:
# rpm -qa|grep php
php-snmp-5.1.6-23.2.el5_3
php-devel-5.1.6-23.2.el5_3
php-cli-5.1.6-23.2.el5_3
php-gd-5.1.6-23.2.el5_3
php-bcmath-5.1.6-23.2.el5_3
php-common-5.1.6-23.2.el5_3
php-mysql-5.1.6-23.2.el5_3
php-pear-1.4.9-4.el5.1
php-pdo-5.1.6-23.2.el5_3
php-5.1.6-23.2.el5_3
# rpm -qa|grep mysql
perl-DBD-mysql-4.011-1.el5.rf
mysql-5.0.45-7.el5
php-mysql-5.1.6-23.2.el5_3
mysql-devel-5.0.45-7.el5
mysql-bench-5.0.45-7.el5
mysql-server-5.0.45-7.el5
# rpm -qa|grep snmp
net-snmp-libs-5.3.1-19.el5_1.4
php-snmp-5.1.6-23.2.el5_3
net-snmp-devel-5.3.1-19.el5_1.4
net-snmp-perl-5.3.1-19.el5_1.4
net-snmp-utils-5.3.1-19.el5_1.4
net-snmp-5.3.1-19.el5_1.4
Para que el programa funcione primero debe:
Para que esta aplicacion funcione usted debe:
http://www.comptechdoc.org/os/linux/usersguide/linux_ugfilesp.html
cd /usr/bin
ll nmap
chmod +s nmap
y probar que el siguiente comando funciona: nmap -v -sP 192.168.0.0/24
El codigo en php es el siguiente:
Lamme a este codigo explorar_red01.php
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="expires" content="0">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<title>explorar01</title>
</head>
<body>
<tbody>
<?php
$conexion=Conectarse();
$cadena_consecutivo_maximo= "select max(`consecutivo_escaneo`)as maximo from `equipos_prendidos`;";
$resultado_consecutivo_maximo=mysql_query($cadena_consecutivo_maximo,$conexion) or die($cadena_consecutivo_maximo . "La consulta fallo;: " . mysql_error());
$fila_consecutivo_maximo=mysql_fetch_array($resultado_consecutivo_maximo);
//echo $fila_consecutivo_maximo['maximo']."<br>";
printf("<table border=1>");
printf("<tr>");
printf("<td>");
printf("index");
printf("</td>");
printf("<td>");
printf("ip");
printf("</td>");
printf("<td>");
printf("mac");
printf("</td>");
printf("<td>");
printf("fabricante");
printf("</td>");
printf("<td>");
printf("hostname");
printf("</td>");
printf("<td>");
printf("netbiosname");
printf("</td>");
printf("<td>");
printf("snmp");
printf("</td>");
printf("<td>");
printf("Analisis");
printf("</td>");
printf("<td>");
printf("Reanalisis");
printf("</td>");
printf("</tr>");
$networks = array("247","248"); //con esto se estudian varios segmentos de red
foreach($networks as $ip_YY)
{
for ($ip_XX='0';$ip_XX<254;$ip_XX++)
{
$ip="172.28.".$ip_YY.".".$ip_XX;
$fila_consecutivo=$fila_consecutivo_maximo['maximo'];
estudiar_red($ip,$fila_consecutivo);
}}//fin de los for
$networks = array("0","1","2","3","16","17","18","19"); //con esto se estudian varios segmentos de red
foreach($networks as $ip_YY)
{
for ($ip_XX='0';$ip_XX<254;$ip_XX++)
{
$ip="192.168.".$ip_YY.".".$ip_XX;
$fila_consecutivo=$fila_consecutivo_maximo['maximo'];
estudiar_red($ip,$fila_consecutivo);
}}//fin de los for
printf("</table>");
$cadena02= "select count(*) AS contador from `equipos_snmp` WHERE `snmp` = 'si';";
$resultado02=mysql_query($cadena02,$conexion) or die($cadena02 . "La consulta fallo;: " . mysql_error());
$fila02=mysql_fetch_array($resultado02);
$cadena03= "select count(*) AS contador from `equipos_snmp` WHERE `fabricante` LIKE '%Alcatel%';";
$resultado03=mysql_query($cadena03,$conexion) or die($cadena03 . "La consulta fallo;: " . mysql_error());
$fila03=mysql_fetch_array($resultado03);
$cadena04= "select count(*) AS contador from `equipos_snmp` WHERE `fabricante` LIKE '%Extreme%';";
$resultado04=mysql_query($cadena04,$conexion) or die($cadena04 . "La consulta fallo;: " . mysql_error());
$fila04=mysql_fetch_array($resultado04);
$cadena05= "select count(*) AS contador from `equipos_snmp`;";
$resultado05=mysql_query($cadena05,$conexion) or die($cadena05 . "La consulta fallo;: " . mysql_error());
$fila05=mysql_fetch_array($resultado05);
printf("<table border=1>");
printf("<form action=explorar_red04.php method=POST>");
$cadena06= "select count(*) AS contador from `equipos_prendidos` group by `consecutivo_escaneo`;";
$resultado06=mysql_query($cadena06,$conexion) or die($cadena06 . "La consulta fallo;: " . mysql_error());
while ($fila06=mysql_fetch_array($resultado06))
{
printf("<tr>");
printf("<td>");
printf("Total de equipos prendidos");
printf("</td>");
printf("<td>");
printf($fila06['contador']);
printf("</td>");
printf("</tr>");
}
printf("<tr>");
printf("<td>");
printf("Total de ips registradas");
printf("</td>");
printf("<td>");
printf($fila05['contador']);
printf("</td>");
printf("</tr>");
printf("<tr>");
printf("<td>");
printf("Equipos que actualmente registran snmp");
printf("</td>");
printf("<td>");
printf($fila02['contador']);
printf("</td>");
printf("</tr>");
printf("<tr>");
printf("<td>");
printf("Telefonos");
printf("</td>");
printf("<td>");
printf($fila03['contador']);
printf("</td>");
printf("</tr>");
printf("<tr>");
printf("<td>");
printf("IP de Switch");
printf("</td>");
printf("<td>");
printf($fila04['contador']);
printf("</td>");
printf("</tr>");
printf("<tr>");
printf("<td>");
printf("Para una nueva exploracion de red seleccione los elementos que necesita actualizar");
printf("</td>");
printf("</tr>");
printf("<tr>");
printf("<td>");
printf("Exploracion rapida nmap, obligatoria,(40 sg)");
printf("</td>");
printf("<td>");
printf("<input type=radio name=exploracion_rapida_nmap value=\"si\" checked>Si ");
//printf("<input type=radio name=exploracion_rapida_nmap value=\"no\">No ");
printf("</td>");
printf("</tr>");
printf("<tr>");
printf("<td>");
printf("NetBios Name (sumele 4 minutos)");
printf("</td>");
printf("<td>");
printf("<input type=radio name=netbios_name_activar value=\"si\">Si ");
printf("<input type=radio name=netbios_name_activar value=\"no\" checked>No ");
printf("</td>");
printf("</tr>");
printf("<tr>");
printf("<td>");
printf("SNMP profunda (sumele 50sg)");
printf("</td>");
printf("<td>");
printf("<input type=radio name=snmp_exploracion value=\"si\">Si ");
printf("<input type=radio name=snmp_exploracion value=\"no\" checked>No ");
printf("</td>");
printf("</tr>");
printf("</tr>");
printf("<form>");
printf("</table>");
printf("<input type=submit name=boton_ace value=\"Mandar Exploracion\">");
function estudiar_red($ip,$fila_consecutivo)
{
// echo "IP:".$ip."<br>";
$conexion=Conectarse();
$cadena01= "select * from `equipos_snmp` where `ip` = '$ip';";
$resultado01=mysql_query($cadena01,$conexion) or die($cadena01 . "La consulta fallo;: " . mysql_error());
$fila01=mysql_fetch_array($resultado01);
if($fila01)
{
$host_name_aux=$fila01['host_name'];
$pos=strpos($host_name_aux,".mlegal.gov.co");
$host_name_aux=substr($host_name_aux,0,$pos);
$host_name_aux=str_replace(" ","", $host_name_aux);
$host_name_aux=str_replace(".","", $host_name_aux);
$netbios_name_aux=strtolower($fila01['netbios_name']);
$netbios_name_aux=str_replace(".","",$netbios_name_aux);
$netbios_name_aux=str_replace("","",$netbios_name_aux);
printf("<tr onMouseOver='this.bgColor = #EDF3FE' onMouseOut ='this.bgColor = #FFFFFF'>");
printf("<td>");
printf ("<a href=explorar_equipo01.php?index=%s>%s",$fila01[index],$fila01[index]);
printf("</td>");
printf("<td>");
printf($fila01['ip']);
printf("</td>");
printf("<td>");
printf($fila01['mac']);
printf("</td>");
printf("<td>");
printf($fila01['fabricante']);
printf("</td>");
printf("<td>");
//if(strcmp($host_name_aux,$netbios_name_aux) == 1){}
//else{
//printf("<font color=red>DNS Problem");
echo $host_name_aux;
printf("<font color=red>");
if ($netbios_name_aux== "")
{//echo " - vacio";
}
else
{
//echo " - lleno";
echo str_replace( $host_name_aux , "", $netbios_name_aux);
/* if ('$host_name_aux'=='$netbios_name_aux')
{}
else
{
echo " - Revisar DNS";
}*/
}
//echo $host_name_aux." ".$netbios_name_aux." ".strcmp($host_name_aux,$netbios_name_aux)." ";
// echo "diferencia DNS";
printf("</font>");
//}
//printf($host_name_aux);
printf("</td>");
printf("<td>");
printf($netbios_name_aux);
printf("</td>");
printf("<td>");
printf($fila01['snmp']);
printf("</td>");
printf("<td>");
printf("<a href=explorar_equipo01.php?index=%s><IMG SRC=analisis.png WIDTH=15 HEIGHT=15 BORDER=0 ALT=Analisis_rapido>",$fila01['index']);
printf("</td>");
printf("<td>");
printf("<a href=explorar_red04.php?exploracion_solo_una_ip=%s><IMG SRC=reanalisis.png WIDTH=15 HEIGHT=15 BORDER=0 ALT=Analisis_rapido>",$fila01['ip']);
printf("</td>");
for ($consecutivo=$fila_consecutivo-3;$consecutivo<=$fila_consecutivo;$consecutivo++)
{
$index=$fila01['index'];
$cadena_prendido= "select * from `equipos_prendidos` where `index_equipo` = '$index' and `consecutivo_escaneo` = '$consecutivo';";
//echo $cadena_prendido."<br>";
$resultado_prendido=mysql_query($cadena_prendido,$conexion) or die($cadena_prendido . "La consulta fallo;: " . mysql_error());
$fila_prendido=mysql_fetch_array($resultado_prendido);
if ($fila_prendido) {
printf("<td>");
printf("1");
printf("</td>");
}
else {
printf("<td>");
printf("0");
printf("</td>");
}
}
$mac_address=$fila01['mac'];
$cadena_sw_fdb=("SELECT * FROM `swithes` WHERE `mac_address` LIKE '$mac_address' order by `switch_ip`" );
$resultado_sw_fdb=mysql_query($cadena_sw_fdb,$conexion)or die($cadena_sw_fdb . "La consulta fallo;: " . mysql_error());
while ($fila1_sw_fdb=mysql_fetch_array($resultado_sw_fdb))
{
if ($fila1_sw_fdb)
{
printf("<td>");
printf($fila1_sw_fdb['switch_ip'].": ".$fila1_sw_fdb['port_list']." ");
$sw=$fila1_sw_fdb['switch_ip'];
$port=$fila1_sw_fdb['port_list'];
printf("</td>");
$cadena_sw_fdb_reuso=("select count(*) AS contador FROM `swithes` WHERE `switch_ip` LIKE '$sw' and `port_list` LIKE '$port'" );
$resultado_sw_fdb_reuso=mysql_query($cadena_sw_fdb_reuso,$conexion)or die($cadena_sw_fdb_reuso . "La consulta fallo;: " . mysql_error());
$fila1_sw_fdb_reuso=mysql_fetch_array($resultado_sw_fdb_reuso);
if ($fila1_sw_fdb_reuso['contador']==1)
{
printf("<td><font color=red>");
printf($fila1_sw_fdb_reuso['contador']);
printf("</td></font>");
}
else
{
printf("<td>");
printf($fila1_sw_fdb_reuso['contador']);
printf("</td>");
}
printf("<td>");
printf($fila1_sw_fdb['vlan']);
printf("</td>");
}
else
{
printf("<td>");
printf("0");
printf("</td>");
printf("<td>");
printf("0");
printf("</td>");
}
}
printf("</tr>");
}//fin del if($fila01)
}
?>
</tbody>
</body>
</html>
Llame a este codigo explorar_red04.php
<STYLE TYPE=text/css>
<!--
body {
font-family:Verdana,sans-serif;
font-size:10pt;
color:#082A42;
background-image: url(fondo_contenido6.jpg);
margin-left:1px;
padding-left:1px
}
a:link {text-decoration:none;color:#082A42}
a:visited {text-decoration:none;color:#082A42}
a:active {text-decoration:none;color:#082A42}
a:hover {text-decoration:underline;color:#000000;font-weight:bold}
H1,h1 {font-weight: bold;
font-style: italic;
font-variant: small-caps;
font-family: Verdana,sans-serif;
font-size:12pt;
color:#082A42;
text-decoration:none
}
H2,h2 {font-weight: bold;
font-style: italic;
font-variant: small-caps;
font-family: Verdana,sans-serif;
font-size:8pt;
color:#082A42
}
TH,th {
font-family:Verdana,sans-serif;
font-size:8pt;
color:#082A42
}
TR,tr {
font-family:Verdana,sans-serif;
font-size:8pt;
color:#082A42;
// border: 0px;
border:transparent
}
TD,td {
font-family:Verdana,sans-serif;
font-size:8pt;
color:#082A42;
background: transparent;
// border: 0px;
border:transparent
}
B,b {
font-family:Verdana,sans-serif;
font-size:8pt;
color:#082A42
}
BIG,big {
font-family:Verdana,sans-serif;
font-size:16pt;
color:#082A42
}
INPUT {
font-family: Verdana,sans-serif;
font-size: 10pt;
color: #082A42;
background: transparent;
border-color: #E8D1BD
}
SELECT {
font-family:Verdana,sans-serif;
font-size:10pt;
color:#082A42;
background:#E1E5E8;
border-color:#E8D1BD;
text-align:left
}
OPTION {
font-family:Verdana,sans-serif;
font-size:10pt;
color:#082A42;
background:#E1E5E8;
border-color:#8C6B4C;
text-align:left;
padding-right:10px
}
VALUE{
font-family:Verdana,sans-serif;
font-size:10pt;
color:#082A42;
background:#E1E5E8;
border-color:#8C6B4C
}
FORM {
font-family:Verdana,sans-serif;
font-size:10pt;
color:#082A42;
background: transparent
}
PRE, CODE {
font-family:Verdana,sans-serif;font-size:9pt;
color:#8C6B4C
}
TT {
font-family:Verdana,sans-serif;
font-size:34pt;
color:red;
background: transparent
}
TABLE {
font-family:Verdana,sans-serif;
font: menu;
margin: 0px;// #EEEEEE inset;
border: 0px;// #EEEEEE inset;
padding: 0px;// #EEEEEE inset;
padding-right: 0px;
padding-left: 0px;
padding-top: 0px;
padding-botton: 0px;
border-left: 0px; // #EEEEEE inset;
border-right: 0px; // gray inset;
border-bottom: 0px; // gray inset;
border-top: 0px; // #EEEEEE inset;
// border: 0px;
bordercolor:transparent;
width:90%%
}
TEXTAREA {
font-family:Verdana,sans-serif;
font-size:10pt;
color:#082A42;
background: transparent;
// border: 0px;
bordercolor: #846344;
border-left: 2px #846344 inset;
border-right: 2px #846324 inset;
border-bottom: 2px #846324 inset;
border-top: 2px #846344 inset
}
.fondo_body_index {
font-family:Verdana,sans-serif;
font-size:10pt;
color:#082A42;
background-image: url(fondo_index6.JPG);
margin-left:1px;
padding-left:1px
}
.fondo_encabezado_index {
font-family:Verdana,sans-serif;
font-size:10pt;
color:#082A42;
background-image: url(fondo_logo6.JPG);
margin-left:1px;
padding-left:1px;
background-repeat: repeat-x
}
.fondo_pie_pagina_index {
font-family:Verdana,sans-serif;
font-size:10pt;
color:#082A42;
background-image: url(fondo_pie_de_pagina6.JPG);
margin-left:1px;
padding-left:1px
}
//-->
</STYLE>
<STYLE TYPE=text/css>
<!--
table {
margin: 0px solid #000000;
padding:2px solid #000000;
border: 1px solid #000000
}
tbody {
margin: 0px solid #000000;
padding:0px solid #000000;
border: 1px solid #000000
}
TR {
margin: 0px solid #000000;
padding:0px solid #000000;
clear:right ;
border: 1px solid #aaaaaa
}
TD {
margin: 0px solid #000000;
padding:0px solid #000000;
border: 1px solid #aaaaaa
}
//-->
</STYLE>
<?
function Conectarse()
{
if (!($conexion=mysql_connect("192.168.1.219","root","aw321bjr")))
{
echo "Error conectando a la base de datos.";
exit();
}
if (!($p_base =mysql_select_db("servicios3",$conexion)))
{
mysql_error($p_base);
echo "Error seleccionando la base de datos.";
exit();
}
return $conexion;
}
?>
<!-- Manual de PHP de WebEstilo.com -->
<html>
<head>
<title>explorar04</title>
</head>
<body>
Parte de HTML normal.
<BR><BR>
Para que esta aplicacion funcione usted debe:
http://www.comptechdoc.org/os/linux/usersguide/linux_ugfilesp.html<BR>
cd /usr/bin<BR>
ll nmap<BR>
chmod +s nmap<BR>
y probar que el comando funciona: nmap -v -sP 192.168.0.0/24<BR>
<?php
//coloque aqui las variables que usted quiere se investigen por snmp!
$community = "public";
$object_id[0] = "sysDescr";
$object_id[1] = "sysName";
$object_id[2] = "sysServices";
$object_id[3] = "ifDescr";
$object_id[4] = "ifPhysAddress";
$object_id[5] = "hrStorageDescr";
$object_id[6] = "hrStorageSize";
$object_id[7] = "hrStorageUsed";
$object_id[8] = "hrDeviceDescr";
$object_id[9] = "hrPartitionSize";
$object_id[10] = "hrSWInstalledName";
$sysDescr="";
$sysName="";
$sysServices="";
$ifDescr="";
$ifPhysAddress="";
$hrStorageDescr="";
$hrStorageSize="";
$hrStorageUsed="";
$hrDeviceDescr="";
$hrPartitionSize="";
$ip="";
$host_name="";
$mac_address="";
$fabricante="";
$snmp_status="no";
$netbios_name_activar="si";
$snmp_exploracion="si";
$exploracion_solo_una_ip=$_REQUEST['exploracion_solo_una_ip'];
$exploracion_rapida_nmap=$_REQUEST['exploracion_rapida_nmap'];
$netbios_name_activar=$_REQUEST['netbios_name_activar'];
$snmp_exploracion=$_REQUEST['snmp_exploracion'];
/*if ($exploracion_rapida_nmap=="si") {echo "exploracion nmap"."<br>";}
if ($netbios_name_activar=="si") {echo "netbios_name_activar"."<br>";}
if ($snmp_exploracion=="si") {echo "snmp_exploracion"."<br>";}*/
$networks = array("172.28.247.96/27","172.28.248.96/27","192.168.0.0/24","192.168.1.0/24","192.168.2.0/24","192.168.3.0/24","192.168.16.0/24","192.168.17.0/24","192.168.18.0/24","192.168.19.0/24"); //con esto se estudian varios segmentos de red
//$networks = array("192.168.1.64/27"); //con esto se estudian varios segmentos de red ,"192.168.3.0/24","192.168.16.0/24"
//http://www.php.net/foreach
function limpiar_ip($row)
{
$ip_temp=strstr($row,"(");
$ip_temp=str_replace("(","", $ip_temp);
$pos=strpos($ip_temp,")"); //con estas dos operaciones se puede extraer la parte de una cadena que uno quiere quitar
$ip_temp=substr($ip_temp,0,$pos);
$ip_temp=str_replace(" ","", $ip_temp);
if($ip_temp=="")
{
$ip_temp=strstr($row,"Host");
$ip_temp=str_replace("Host ","", $ip_temp);
$pos=strpos($ip_temp,"appears to be up"); //con estas dos operaciones se puede extraer la parte de una cadena que uno quiere quitar
$ip_temp=substr($ip_temp,0,$pos);
$ip_temp=str_replace(" ","", $ip_temp);
}
$ip=$ip_temp;
return $ip;
}
function limpiar_hostname($row,$ip)
{
$cadena_original=$row;
$host_name=strstr($row,"Host");
$host_name=str_replace("Host ","", $host_name);
$pos=strpos($host_name," ("); //con estas dos operaciones se puede extraer la parte de una cadena que uno quiere quitar
$host_name=str_replace(" ","", $host_name);
$host_name=substr($host_name,0,$pos);
if($host_name=="")
{
$cadena_switch="Host ".$ip." appears to be up.";
//echo "mi cadena: ".$cadena_switch."<br>";
//echo "mi cadena: ".$cadena_original."<br>";
if(stristr($cadena_original, $cadena_switch) == TRUE){"Esto es un switch"; $host_name="";}
}
return $host_name;
}
function limpiar_mac($row,$ip)
{
$mac_address_temp=$row;
$fabricante=$row;
if(stristr($row, 'MAC Address') == TRUE)
{
$mac_address_temp=strstr($mac_address_temp,"MAC Address: ");
$mac_address_temp=str_replace("MAC Address: ","", $mac_address_temp);
$pos=strpos($mac_address_temp," ("); //con estas dos operaciones se puede extraer la parte de una cadena que uno quiere quitar
$mac_address_temp=substr($mac_address_temp,0,$pos);
$mac_address=$mac_address_temp;
$fabricante=strstr($fabricante,"(");
$fabricante=str_replace("(","", $fabricante);
$pos=strpos($fabricante,")"); //con estas dos operaciones se puede extraer la parte de una cadena que uno quiere quitar
$fabricante=substr($fabricante,0,$pos);
//echo "fabricante: ".$fabricante."<br>";
}
else
{
echo $ip." ".$host_name." No se pudo averiguar la mac con nmap<br>";
$mac_address="";
$fabricante="";
$fila--;
}
return array ($mac_address,$fabricante);
}
function nmblookup($ip)
{
$cmd_nmblookup = "nmblookup -A ".$ip;
$results_nmblookup='NULL';
$netbios_name="";
exec($cmd_nmblookup, $results_nmblookup, $error);
$netbios_name=str_replace(" ","", $results_nmblookup[1]);
$pos=strpos($netbios_name,"<"); //con estas dos operaciones se puede extraer la parte de una cadena que uno quiere quitar
$netbios_name=substr($netbios_name,0,$pos);
$netbios_name=str_replace(" ","", $netbios_name);
echo "net_bios_name: ".$netbios_name."<br>";
//segmento adicional para averiguar mac address
foreach($results_nmblookup as $row_nb)
{
if(stristr($row_nb, 'MAC Address = ') == TRUE)
{
$nb_mac_address=strstr($row_nb,"MAC Address = ");
$nb_mac_address=str_replace("MAC Address = ","", $nb_mac_address);
$nb_mac_address=str_replace(" ","", $nb_mac_address);
$nb_mac_address=str_replace("-",":", $nb_mac_address);
$mac_address=$nb_mac_address;
}
}
return array ($netbios_name,$mac_address);
}
function nslookup($ip)
{
$cmd_nslookup = "nslookup ".$ip;
exec($cmd_nslookup, $results_nslookup, $error);
for ($fila='0';$fila<count($results_nslookup);$fila++) //http://www.php.net/manual/es/function.count.php
{
$row=$results_nslookup[$fila];
//echo $row;
$row=stristr($row,"name = ")."<br>"; // http://es.php.net/manual/es/function.stristr.php
$row=str_replace("name =","", $row);
$row=str_replace(" ","", $row);
$row=str_replace(9,"", $row);
$row=str_replace(10,"", $row);
$row=str_replace(11,"", $row);
$row=str_replace(12,"", $row);
$row=str_replace(13,"", $row);
$row=str_replace(14,"", $row);
//echo strlen($row)."<br>";
if (strlen($row)>'10') {$host_name=$row;}
}
return $host_name;
}
function analisis_snmp($ip,$host_name,$totalequiposconsnmp,$totalequipossinsnmp)
{
$community = "public";
$sysDescr="";
$sysName="";
$sysServices="";
$ifDescr="";
$ifPhysAddress="";
$hrStorageDescr="";
$hrStorageSize="";
$hrStorageUsed="";
$hrDeviceDescr="";
$hrPartitionSize="";
$object_id[0] = "sysDescr";
$object_id[1] = "sysName";
$object_id[2] = "sysServices";
$object_id[3] = "ifDescr";
$object_id[4] = "ifPhysAddress";
$object_id[5] = "hrStorageDescr";
$object_id[6] = "hrStorageSize";
$object_id[7] = "hrStorageUsed";
$object_id[8] = "hrDeviceDescr";
$object_id[9] = "hrPartitionSize";
$object_id[10] = "hrSWInstalledName";
$conexion=Conectarse();
$a = snmpwalk($ip, $community, "sysDescr" ,'25000','2'); //timeout de 1ms = 1000 y 2 reintentos
//http://es.php.net/manual/es/function.snmpwalk.php
//$res_cmp_snmp=strcmp($a['0'],"No Response from");
//echo "respuesta strcmp".$res_cmp_snmp."valor obtenido snmp: ".$a['0']."<br>";
// if ($res_cmp_snmp>0)
if(strlen($a['0']) <1) //si hay respuesta
{
$snmp_status="no";
$totalequipossinsnmp++;
echo "SNMP abajo"."<br>";
}
else
{
$snmp_status="si";
$cadena_snmp=("UPDATE `servicios3`.`equipos_snmp` SET `snmp` = '$snmp_status'
WHERE `equipos_snmp`.`ip` ='$ip'");
$resultado_snmp=mysql_query($cadena_snmp,$conexion)
or die($cadena_snmp . "La consulta fallo;: " . mysql_error());
$totalequiposconsnmp++;
//echo "entro"."<br>";
for ($objeto=0; $objeto<11; $objeto++)
{
$snmp_obj=$object_id[$objeto];
//echo "snmpwalk -v 2c -c "." ". $community." ".$ip." ".$snmp_obj."<br>";
$a = snmpwalk($ip, $community, $snmp_obj,'100000','2');
for ($i=0; $i<count($a); $i++)
{
$dato=$a[$i];
$dato=str_replace("STRING:","", $dato);
$dato=str_replace("INTEGER:","", $dato);
printf("..........%s::%s%s",$snmp_obj,$dato,"<br>");
$dato=str_replace("'","", $dato);
$dato=str_replace("/","", $dato);
$dato=str_replace("\\","-", $dato);
if ($objeto==0) {if (strlen($sysDescr)<120){ $sysDescr=$sysDescr." ".$dato."--";}}
if ($objeto==1) {if (strlen($sysName)<120){ $sysName=$sysName." ".$dato."--";}}
if ($objeto==2) {if (strlen($sysServices)<70){ $sysServices=$sysServices." ".$dato."--";}}
if ($objeto==3) {if (strlen($ifDescr)<70){ $ifDescr=$ifDescr." ".$dato."--";}}
if ($objeto==4) {if (strlen($ifPhysAddress)<40){ $ifPhysAddress=$ifPhysAddress." ".$dato."--";}}
if ($objeto==5) {if (strlen($hrStorageDescr)<120){ $hrStorageDescr=$hrStorageDescr." ".$dato."--";}}
if ($objeto==6) {if (strlen($hrStorageSize)<120){ $hrStorageSize=$hrStorageSize." ".$dato."--";}}
if ($objeto==7) {if (strlen($hrStorageUsed)<120){ $hrStorageUsed=$hrStorageUsed." ".$dato."--";}}
if ($objeto==8) {if (strlen($hrDeviceDescr)<120){ $hrDeviceDescr=$hrDeviceDescr." ".$dato."--";}}
if ($objeto==9) {if (strlen($hrPartitionSize)<120){ $hrPartitionSize=$hrPartitionSize." ".$dato."--";}}
if ($objeto==10) //para investigar el objeto hrSWInstalledName
{
$dato=str_replace("'","", $dato);
$dato=str_replace("/","", $dato);
$dato=str_replace("\\","-", $dato);
$cadena= "SELECT * FROM `servicios3`.`snmp_software` WHERE `software` LIKE '$dato';";
//echo $cadena."<br>";
$consulta01=mysql_query($cadena,$conexion) or die($cadena . "La consulta fallo;: " . mysql_error());
$fila1=mysql_fetch_array($consulta01);
if ($fila1) //si existe software hacer:
{
//printf("Ya esta en base de datos %s<br>",$fila1['ip']);
if ($fila1['software']!="$dato")
{
printf("<h1>Pilas el varlor cambio de %s a %s</h1><br>",$fila1['software'],$host_name);
}
}
else
{
//seccion de insercion en la base de datos:
echo "Se detecto software nuevo no instalado en ninguna maquina de medicina legal a la fecha"."<br>";
$index='';
$cadena=("INSERT INTO `servicios3`.`snmp_software` (`index` ,`software` ,`utilidad`)VALUES ( NULL , '$dato', '');");
//echo $cadena;
$resultado=mysql_query($cadena,$conexion) or die($cadena . "La consulta fallo;: " .
mysql_error());
}
//desde aqui se hace la pregunta:
//1. La ip ya esta en lista? y cual es su index?
$cadena2="SELECT * FROM `equipos_snmp` WHERE `ip` LIKE '$ip';";
//echo $cadena2;
$resultado2=mysql_query($cadena2,$conexion) or die($cadena2 . "La consulta fallo;: " .
mysql_error());
$fila2=mysql_fetch_array($resultado2);
if ($fila2){
$index_equipos_snmp=$fila2['index'];
//2. el programa ya esta en lista? y cual es el index?
$cadena3="SELECT * FROM `snmp_software` WHERE `software` LIKE '$dato';";
//echo $cadena;
$resultado3=mysql_query($cadena3,$conexion) or die($cadena3 . "La consulta fallo;: " .
mysql_error());
$fila3=mysql_fetch_array($resultado3);
if ($fila3)
{
$index_snmp_software=$fila3['index'];
}
// echo "index_equipos_snmp:".$index_equipos_snmp." index_snmp_software".$index_snmp_software."<br>";
$cadena4="SELECT * FROM `snmp_software_por_equipo`
WHERE `index_snmp_software` = '$index_snmp_software'
and `index_equipos_snmp` = '$index_equipos_snmp';";
//echo $cadena4;
$resultado4=mysql_query($cadena4,$conexion) or die($cadena4 . "La consulta fallo;: " .
mysql_error());
$fila4=mysql_fetch_array($resultado4);
if ($fila4){
//echo "No se debe hacer el insert<br>"; //$index_snmp_software=$fila4['index'];
}
else{
$cadena5=("INSERT INTO `servicios3`.`snmp_software_por_equipo`
(`index` ,`index_snmp_software` ,`index_equipos_snmp`)
VALUES ( NULL , '$index_snmp_software', '$index_equipos_snmp');");
echo "cadena5:".$cadena5."<br>";
$resultado5=mysql_query($cadena5,$conexion) or die($cadena5 . "La consulta fallo;: " .
mysql_error());
echo "se detecto software nuevo en esta maquina<br>";
}
}
}
}
}
}
return array($totalequiposconsnmp,$totalequipossinsnmp,$snmp_status,$sysDescr,$sysName,$sysServices,$ifDescr,$ifPhysAddress,$hrStorageDescr,$hrStorageSize,$hrStorageUsed,$hrDeviceDescr,$hrPartitionSize);
}
function actualizar_campos($campo,$campo_valor,$variable,$ip,$index)
{
if ("$campo_valor"!="$variable")
{
if ("$variable"!=""){
$conexion=Conectarse();
$date = getDate();
$fecha=$date['year']."-".$date['mon']."-".$date['mday']." ".$date['hours'].":".$date['minutes'].":".$date['seconds'];
$cambio="En el campo: ".$campo." con la ip: ". $ip. " cambio de ". $campo_valor ." a ".$variable;
echo $cambio."<br><br>";
$cadena_log=("INSERT INTO `servicios3`.`log` (`index` ,`evento` ,`fecha`)VALUES (NULL , '$cambio', '{$fecha}');");
$resultado_log=mysql_query($cadena_log,$conexion)
or die($cadena_log . "La consulta fallo;: " . mysql_error());
$cadena_snmp=("UPDATE `servicios3`.`equipos_snmp` SET `$campo` = '$variable'
WHERE `equipos_snmp`.`index` ='$index'");
$resultado_snmp=mysql_query($cadena_snmp,$conexion)
or die($cadena_snmp . "La consulta fallo;: " . mysql_error());
}
}
return 0;
}
function insertar_actualizar_equipo($ip,$mac_address,$fabricante,$host_name,$snmp_status,$netbios_name,$sysDescr,$sysName,$sysServices,$ifDescr,$ifPhysAddress,$hrStorageDescr,$hrStorageSize,$hrStorageUsed,$hrDeviceDescr,$hrPartitionSize)
{
$conexion=Conectarse();
$cadena= "SELECT * FROM `equipos_snmp` WHERE `ip` LIKE '$ip';";
//echo $cadena."<br>";
$consulta01=mysql_query($cadena,$conexion) or die($cadena . "La consulta fallo;: " . mysql_error());
$fila2=mysql_fetch_array($consulta01);
if ($fila2) //Si el equipo ya existe en la base de datos entonces actualize el respectivo equipo
{
$index=$fila2['index'];
//echo "El indice que se actualizara es:".$index."<br>";
actualizar_campos("host_name",$fila2['host_name'],$host_name,$ip,$index);
actualizar_campos("snmp",$fila2['snmp'],$snmp_status,$ip,$index);
actualizar_campos("netbios_name",$fila2['netbios_name'],$netbios_name,$ip,$index);
actualizar_campos("mac",$fila2['mac'],$mac_address,$ip,$index);
actualizar_campos("fabricante",$fila2['fabricante'],$fabricante,$ip,$index);
actualizar_campos("sysDescr",$fila2['sysDescr'],$sysDescr,$ip,$index);
actualizar_campos("sysName",$fila2['sysName'],$sysName,$ip,$index);
actualizar_campos("sysServices",$fila2['sysServices'],$sysServices,$ip,$index);
actualizar_campos("ifDescr",$fila2['ifDescr'],$ifDescr,$ip,$index);
actualizar_campos("ifPhysAddress",$fila2['ifPhysAddress'],$ifPhysAddress,$ip,$index);
actualizar_campos("hrStorageDescr",$fila2['hrStorageDescr'],$hrStorageDescr,$ip,$index);
actualizar_campos("hrStorageUsed",$fila2['hrStorageUsed'],$hrStorageUsed,$ip,$index);
actualizar_campos("hrStorageSize",$fila2['hrStorageSize'],$hrStorageSize,$ip,$index);
actualizar_campos("hrDeviceDescr",$fila2['hrDeviceDescr'],$hrDeviceDescr,$ip,$index);
actualizar_campos("hrPartitionSize",$fila2['hrPartitionSize'],$hrPartitionSize,$ip,$index);
actualizar_campos("hrStorageSize",$fila2['hrStorageSize'],$hrStorageSize,$ip,$index);
printf("Ya esta en base de datos %s<br>",$fila2['ip']);
}
else
{
//seccion de insercion en la base de datos:
echo "equipo nuevo"."<br>";
$index='';
$cadena=("INSERT INTO `servicios3`.`equipos_snmp` (
`index` ,
`ip` ,
`mac` ,
`fabricante`,
`host_name` ,
`netbios_name` ,
`snmp` ,
`sysDescr` ,
`sysName` ,
`sysServices` ,
`ifDescr` ,
`ifPhysAddress` ,
`hrStorageDescr` ,
`hrStorageSize` ,
`hrStorageUsed` ,
`hrDeviceDescr` ,
`hrPartitionSize`
)
VALUES (
NULL,
'$ip',
'$mac_address',
'$fabricante',
'$host_name',
'$netbios_name',
'$snmp_status',
'$sysDescr',
'$sysName',
'$sysServices',
'$ifDescr',
'$ifPhysAddress',
'$hrStorageDescr',
'$hrStorageSize',
'$hrStorageUsed',
'$hrDeviceDescr',
'$hrPartitionSize');"
);
//echo $cadena;
$resultado=mysql_query($cadena,$conexion) or die($cadena . "La consulta fallo;: " . mysql_error());
}
return 0;
}
if ($exploracion_solo_una_ip=="")
{
// echo "entro al uno";
$totalequiposprendidos=0;
$totalequiposconsnmp=0;
$totalequipossinsnmp=0;
$totaltelefonos=0;
//alimentar la tabla de equipos prendidos!
$conexion=Conectarse();
$cadena_prendido= "select max(`consecutivo_escaneo`) AS maximo from `equipos_prendidos`;";
$resultado_prendido=mysql_query($cadena_prendido,$conexion) or die($cadena_prendido . "La consulta fallo;: " . mysql_error());
$fila_prendido=mysql_fetch_array($resultado_prendido);
$maximo_consecutivo_escaneo=$fila_prendido['maximo']+1;
//---hasta aqui y luego el insert mas abajo entre el for
foreach($networks as $segmento)
{
$fila=0;
$results='NULL';
echo "maximo consecutivo: ".$maximo_consecutivo_escaneo."<br>";
$cmd = "nmap -v -sP ". $segmento;//la lista de mac por fabricante se puede encontrar en el archivo nmap-mac-prefixes
exec($cmd, $results, $error);
for ($fila='0';$fila<count($results);$fila++) //http://www.php.net/manual/es/function.count.php
{
$row=$results[$fila];
$netbios_name="";
$nb_mac_address="";
$host_name="";
$fabricante="";
if(stristr($row, 'appears to be up') == TRUE) // http://es.php.net/manual/es/function.strcmp.php //se escanean unicamente los equipos prendidos.
{
$totalequiposprendidos=$totalequiposprendidos+1;
$ip=limpiar_ip($row);
//alimentar la tabla de equipos prendidos
$cadena_index= "select * from `equipos_snmp` where `ip` like '$ip';";
$resultado_index=mysql_query($cadena_index,$conexion) or die($cadena_index . "La consulta fallo;: " . mysql_error());
$fila_index=mysql_fetch_array($resultado_index);
$index_equipo=$fila_index['index'];
$date = getDate();
$fecha=$date['year']."-".$date['mon']."-".$date['mday']." ".$date['hours'].":".$date['minutes'].":".$date['seconds'];
$cadena_insert_prendido= "INSERT INTO `servicios3`.`equipos_prendidos` (`index` ,`index_equipo` ,`consecutivo_escaneo` ,`fecha`)
VALUES (NULL , '$index_equipo', '$maximo_consecutivo_escaneo', '{$fecha}');";
$resultado_insert_prendido=mysql_query($cadena_insert_prendido,$conexion) or die($cadena_insert_prendido . "La consulta fallo;: " . mysql_error());
$host_name=limpiar_hostname($row,$ip);
$fila++;
$row=$results[$fila];
list($mac_address,$fabricante)=limpiar_mac($row,$ip);
echo "ip: ".$ip." Host name: ".$host_name." Mac Address: ".$mac_address." fabricante: ".$fabricante."<br>";
//segmento para encontrar el netbios name
if(stristr($host_name, '') == TRUE) //si es un telefono switch, linux o otra cosa no se debe hacer ningun otro analisis
{
echo "Esto es un telefono o un switch: ";
}
else
{
if ($netbios_name_activar=="si")
{
list( $netbios_name, $nb_mac_address )=nmblookup($ip);
if ($mac_address==''){$mac_address=$nb_mac_address;echo "entro a mac".$mac_address."<br>";}
//segmento para comparar el netbios_name con el hostname
$host_name_aux=str_replace (".mlegal.gov.co", "", $host_name);
echo "Netbios_name: ".strcmp($host_name_aux,$netbios_name)."hostname:".$host_name_aux." netbios_name:".$netbios_name."<br>";
}
if ($snmp_exploracion=="si")
{
list($totalequiposconsnmp,$totalequipossinsnmp,$snmp_status,
$sysDescr,
$sysName,
$sysServices,
$ifDescr,
$ifPhysAddress,
$hrStorageDescr,
$hrStorageSize,
$hrStorageUsed,
$hrDeviceDescr,
$hrPartitionSize )
=analisis_snmp($ip,$host_name,$totalequiposconsnmp,$totalequipossinsnmp);
}//fin de la comparacion para investigar software por snmp!
else
{
$snmp_status="";
$sysDescr="";
$sysName="";
$sysServices="";
$ifDescr="";
$ifPhysAddress="";
$hrStorageDescr="";
$hrStorageSize="";
$hrStorageUsed="";
$hrDeviceDescr="";
$hrPartitionSize="";
}
}//fin del if(stristr($host_name, 'telefono') == TRUE)
if(stristr($sysDescr, 'Summit') == TRUE)
{
$fabricante="Extreme Networks";
}
if(stristr($sysDescr, 'Windows 2000 Version 5.1') == TRUE)
{
echo "entro a win 2000";
}
insertar_actualizar_equipo($ip,
$mac_address,
$fabricante,
$host_name,
$snmp_status,
$netbios_name,
$sysDescr,
$sysName,
$sysServices,
$ifDescr,
$ifPhysAddress,
$hrStorageDescr,
$hrStorageSize,
$hrStorageUsed,
$hrDeviceDescr,
$hrPartitionSize);
echo "_ _ _ _ <br>";
}//fin del if(stristr($row, 'appears to be up') == TRUE)
}
}
echo "Total equipos prendidos ".$totalequiposprendidos."<br>";
echo "Total equipos con SNMP ".$totalequiposconsnmp."<br>";
echo "Total equipos sin SNMP ".$totalequipossinsnmp."<br>";
}
else
{
// echo "entro al dos";
$cmd = "fping ". $exploracion_solo_una_ip;
exec($cmd, $results, $error);
for ($fila='0';$fila<count($results);$fila++) //http://www.php.net/manual/es/function.count.php
{
$row=$results[$fila];
// echo $row;
$cadena=stristr($row,"alive")."<br>"; // http://es.php.net/manual/es/function.stristr.php
// echo $cadena."<br>";
if (strcmp ($cadena,"alive.")==1) // http://es.php.net/manual/es/function.strcmp.php
{
echo "Equipo prendido"."<br>";
$ip=$exploracion_solo_una_ip;
$host_name=nslookup($ip);
echo $host_name."<br>";
list( $netbios_name, $nb_mac_address )=nmblookup($ip);
analisis_snmp($ip,$host_name,$totalequiposconsnmp,$totalequipossinsnmp);
if(stristr($sysDescr, 'Summit') == TRUE)
{
$fabricante="Extreme Networks";
}
if(stristr($sysDescr, 'Windows 2000 Version 5.1') == TRUE)
{
echo "entro a win 2000";
}
insertar_actualizar_equipo($ip,
$mac_address,
$fabricante,
$host_name,
$snmp_status,
$netbios_name,
$sysDescr,
$sysName,
$sysServices,
$ifDescr,
$ifPhysAddress,
$hrStorageDescr,
$hrStorageSize,
$hrStorageUsed,
$hrDeviceDescr,
$hrPartitionSize);
echo "_ _ _ _ <br>";
}
else
{
echo "Equipo apagado";
}
}
}
?>
</body>
</html>
El segundo archivo es el conex.php
<?php
function Conectarse()
{
if (!($conexion=mysql_connect("192.168.1.153","coloqueusuarioaqui","coloquepasswordaqui")))
{
echo "Error conectando a la base de datos1.";
exit();
}
if (!($p_base =mysql_select_db("basededatosaqui",$conexion)))
{
mysql_error($p_base);
echo "Error seleccionando la base de datos.";
exit();
}
return $conexion;
}
La estructura de la base de datos es la siguiente:
-- phpMyAdmin SQL Dump
-- version 2.10.3
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 30-06-2009 a las 10:49:25
-- Versión del servidor: 5.0.51
-- Versión de PHP: 5.2.6
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de datos: 'servicios3'
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla 'equipos_snmp'
--
CREATE TABLE equipos_snmp (
`index` int(11) NOT NULL auto_increment,
ip varchar(18) NOT NULL,
mac varchar(18) NOT NULL,
fabricante varchar(200) NOT NULL,
host_name varchar(100) NOT NULL,
netbios_name varchar(100) NOT NULL,
snmp enum('si','no') NOT NULL,
sysDescr varchar(200) NOT NULL COMMENT 'systema',
sysName varchar(200) NOT NULL COMMENT 'nombre',
sysServices varchar(100) NOT NULL COMMENT 'cantidad de servicios',
ifDescr varchar(100) NOT NULL COMMENT 'tarjeta de red',
ifPhysAddress varchar(50) NOT NULL COMMENT 'MAC address',
hrStorageDescr varchar(200) NOT NULL COMMENT 'Unidades de almacenamiento',
hrStorageSize varchar(200) NOT NULL COMMENT 'Tamaño de almacenamiento',
hrStorageUsed varchar(200) NOT NULL COMMENT 'Tamaño utilizado utilizada',
hrDeviceDescr varchar(200) NOT NULL COMMENT 'dispositivos',
hrPartitionSize varchar(200) NOT NULL,
PRIMARY KEY (`index`),
UNIQUE KEY ip (ip),
UNIQUE KEY ip_2 (ip)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;