Hoy hablaremos de iNotify pues hay casos en los que necesitas saber mediante notificaciones, ya sea por motivos de algún ataque a nuestro sitio, o una mera norma de seguridad, que archivos o directorios han cambiado y asi poder tomar medidas de seguridad, o simplemente saber cuantos archivos se van creando.

Todo esto es posible mediante una extensión para php llamada iNotify. Hoy trataremos de montar una clase que trabaja con esta extensión y que te ayudara a tener un control mas amplio sobre nuestros ficheros de tu servidor, todo esto desde algún sistema o app hecha en php.

Este paquete se puede usar para recibir notificaciones de cuándo cambian los archivos del directorio. 

Puede registrar un objeto que está suscrito a eventos de cambio de archivo y directorio utilizando la extensión PHP iNotify

El paquete también puede permitir que las aplicaciones consuman los eventos de cambio para que puedan ser notificados cuando se cambian los archivos y directorios de interés.

Cabe mencionar que implementar esta extensión solo se puede hacer en servidores linux, debido a que esta extensión utiliza el subsistema, del mismo nombre, iNotify, ya que por defecto esta extensión no viene instalada en el paquete de php. Ademas de eso tampoco es posible implementarlo en windows ya sea por XAMPP o APPSERV, aunque existen alguna alternativa que pueden revisar, como para .NET, C# u otros.

Requerimiento:

Como mencione lineas arriba se necesita tener un sistema basado en Linux, con núcleo a partir de la versión 2.6.13 o superior.

Instalación:

Primero se instala la extensión en el sistema, siguiendo estos pasos vía terminal para php 7.1 en debian y ubuntu:

apt-get update
apt-get install php-pear make php7.1-dev
pecl install inotify 
echo "extension=inotify.so" >>  /etc/php/7.1/cli/php.ini

En este paso cabe mencionar que se instala usando PECL. Se puede encontrar información para la instalación de esta extensión PECL en el capítulo del manual titulado Instalación de extensiones PECL. Se puede encontrar información adicional, tal como nuevos lanzamientos, descargas, ficheros fuente, información de mantenimiento, y un CHANGELOG, aquí: » https://pecl.php.net/package/inotify.

También puedes instalar vía terminal y clonar el proyecto de github mediante:

composer require krowinski/php-inotify

Esta ultima linea creara una copia a tu equipo del proyecto, solo quedaría ejecutar el script y probar que tal funciona, recuerda que solo funcionara en linux.

Aqui el codigo de ejemplo para hacer funcionar la clase, los demas documentos estan disponibles para descarga en un link al final del articulo.

<?php
use Inotify\InotifyConsumerFactory;
use Inotify\InotifyEvent;
use Inotify\InotifyEventCodeEnum;
use Inotify\WatchedResourceCollection;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

include __DIR__ . '/../vendor/autoload.php';

$inotifyConsumerFactory = new InotifyConsumerFactory();
$inotifyConsumerFactory->registerSubscriber(
    new class implements EventSubscriberInterface
    {
        public static function getSubscribedEvents(): array
        {
            return [InotifyEvent::class => 'onInotifyEvent'];
        }

        public function onInotifyEvent(InotifyEvent $event): void
        {
            echo $event;
        }
    }
);
$inotifyConsumerFactory->consume(
    WatchedResourceCollection::createSingle(
        sys_get_temp_dir(),
        // sys_get_temp_dir() . '/test.log',
        //InotifyEventCodeEnum::ON_CREATE()->getValue() | InotifyEventCodeEnum::ON_DELETE()->getValue(),
        InotifyEventCodeEnum::ON_ALL_EVENTS()->getValue(),
        'test'
    )
);

EXTRA

¿Cómo se puede implementar iNotify?

Solo considera un escenario, en el que necesitas importar automáticamente los datos de un archivo CSV a la base de datos cada vez que se carga un nuevo archivo en una carpeta específica. Aquí hay un script de muestra como lograr lo mismo en el servidor Linux:

<?php 
stream_set_blocking($inoInst, 0);       // Establece el modo SIN BLOQUEO en un stream

$monitor_id = inotify_add_watch($inoInst, 'source_dir', IN_CREATE);    // Monitorea si un archivo es creado en el directorio a ver SOURCE

while(true)
{              
$events = inotify_read($inoInst);             // Lee eventos
if ($events[0]['wd'] === $monitor_id)         //Si el evento esta ocurriendo en el directorio 'source_dir'
    {                                                                       
	   if($events[0]['mask'] === IN_CREATE)   // Busca un nuevo archivo
		   {
			 printf("Created file: %s in source_dir\n", $events[0]['name']);
		   }            
      }
 }
inotify_rm_watch($inoInst, $monitor_id);      // Detener el monitoreo del directorrio

fclose($inoInst);                             // Cerrar la instancia de Inotify

?>

A continuación, cree un archivo como «helloclarion.csv» y muévalo a la carpeta de origen especificada. Tan pronto como se carga el archivo anterior, se activa un mensaje como se muestra a continuación:

Created file: helloclarion.csv in source_dir

¿Dónde se puede usar Inotify?

Una accion en comun en un sistema de archivos puede desencadenar estas alertas, por lo que puede ser utilizada en varios escenarios:

  • Monitorear el uso completo del disco
  • Limpieza automática ante una caida
  • Envío de notificaciones cuando finaliza la carga del archivo
  • Seguimiento de cambios en archivos del sistema
  • Alerta de cambios en los archivos de configuración

Tomado de PHPClasses,org | Clariontech.com

Shares