lunes, 28 de febrero de 2011

Buscador de archivos SAMBA en php

Nunca he liberado nada, ésto tampoco es que merezca la pena liberarlo, pero quizás pueda resultarle útil a alguien el planteamiento. Se distribuye con licencia GPL, sin ninguna garantía pero puede gustarle a tu tía. Se descarga abajo.

Un par de veces me han cogido de primo para montar un servidor de archivos compartidos. Lo elegido era samba, porque eran redes heterogéneas con máquinas linux y máquinas W... Cuando estaba todo montado y parecía que funcionaba me puse a escuchar a ver que decía la gente.
- "Oye pepito cómo se llamaba el archivo donde estaban los contactos que hice y dónde estaba"
- "No me acuerdo, mira a ver por ahí"

Entonces probé a usar el buscador de archivos de gnome contra el directorio samba montado, y eso no iba bien, no sé por qué, lentitud, demasiados archivos... Lo común en ambos casos era un directorio compartido con unos 60-200 GB con total acceso para todos...

Y bueno, el caso es que hice una especie de buscador samba en php que se ejecutaba en el servidor y por lo tanto cualquier máquina de la red tenía acceso a la aplicación para buscar y abrir los archivos encontrados.


¿Cómo cojones se monta esta mierda que no interesa a nadie?
En principio, supongamos que el directorio compartido es /home/servidor/compartida y samba está ya configurado.
Tenemos instalado apache y php en el servidor.

# cd /var/www
# mkdir buscador
# cd buscador

Dentro del directorio buscador crearemos index.php

<html>
<head>
 <title>
  BUSCADOR DE ARCHIVOS SAMBA
 </title>

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

 <script type="text/javascript">

  function cargar(){

   document.buscador.abuscar.focus();  

  }

 </script>

 <style type="text/css">

  body {
   margin:50px 0px; 
   padding:0px;
   text-align:center;
  }
  a {
   color:#000000;
  }
  #Content {
   width:510px;
   margin:0px auto;
   padding:15px;
   text-align:left;
   border:1px dashed #5b197b;
   background-color:#ddc9ec;
  }
  #encuentros {
   text-align:left;
  }

 </style>


</head>

<body onload="cargar()">

<img src="logo.png">

<div id="content">

<form name="buscador" action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">

 <input type="text" size="50" name="abuscar" value="<?php echo $_POST['abuscar'] ?>">

 <input type="submit" value="BUSCAR" name="boton">

</form>

</div>

<?php


#si ha pulsado el botón buscar, buscamos

if (isset($_POST['boton'])) {

 $abuscar = $_POST['abuscar'];

 if ($abuscar==NULL) {

         echo "Por favor introduzca algo que buscar";  
 }
 else {

  #COMIENZA LA BÚSQUEDA

  $comando="find /home/servidor/compartida -iname '*". $abuscar  ."*'";

  $salida=shell_exec($comando);

  if ($salida==NULL) {

   #no se han encontrado resultados

   echo "No se han encontrado resultados coincidentes a su búsqueda, Inténtelo de nuevo o salga a tomar el aire";

  }

  else{ 

   #pasar archivos encontrados a array

   #tabla bicolor por múltiplos de 2

   #enlace a cada archivo encontrado

   $encontradosarray = explode("\n", $salida);


   #eliminamos último array que se devuelve en blanco

   $ultimo=count($encontradosarray);

   unset($encontradosarray['$ultimo']);

   echo "<div id=\"encuentros\"><pre>";

   echo "<table align=\"center\">";

   $i=1;

   foreach($encontradosarray as $valor) {

           if($valor!=NULL) {

     if ($i % 2 == 0){

      echo "<tr>";

     }  

     else{

      echo "<tr bgcolor=\"#efefef\">";

     }

    

     echo "<td>";

      echo $i;

     echo "</td>";

   

     $valori = substr($valor,26);

    

     $valori1 = str_ireplace($abuscar,"<b>".$abuscar."</b>",$valori);


     echo "<td>";

      echo "<a href=\"samba/".$valori."\">".$valori1."</a><br>";

    

     echo "</td>";



     #Cerramos fila 

     echo "</tr>";


     $i++;

    }

   }

   echo "</pre></div>";

   echo "</table>"; 

  }

 }

}

?>

</body>

</html>


Una vez tenemos ya preparado nuestro buscador nos queda un último detalle, hacer accesibles los archivos encontrados desde el navegador.

# cd /var/www/buscador
# mkdir samba
# chmod 777 samba
# chown -R www-data:www-data /var/www/buscador

Y agregamos a /etc/fstab la siguiente línea
/home/servidor/compartida   /var/www/buscador/samba   none    bind  0  0

Reiniciamos y buscador funcionando.

4 comentarios:

  1. eo explicate vien como Y agregamos a /etc/fstab la siguiente línea

    ResponderEliminar
  2. que tan dificil es que alguién tipee «algo' & rm -rf /home/ & echo '»?

    Por lo menos hazle un regex para que solo pongan letras y numeros, que simplemente poniendo una comilla se rompe tu programa.

    ResponderEliminar
  3. Esta forma de operacion me es muy util, . Hay alguna forma de que esto mismo corra sobre un Web IIS montado sobre Windows 7 y con PHP Version 5.2.13? Muchas gracias por el aporte!!

    ResponderEliminar
  4. Esto es una excelente solución como principio para reemplazar al terrible ineficiente buscador de Windows.
    Además permite usar un NAS Asustor como servidor Samba y tener buscador eficiente.
    Muchas gracias!

    ResponderEliminar