Este ha sido uno de mis últimos descubrimientos, Samba (implementación libre de SMB/CIFS para UNIX) puede proporcionar papelera de reciclaje para poder recuperar los archivos después de eliminarlos.
El hecho está en que Samba 3 proporciona un sistema de módulos llamado VFS (Virtual File System) para su servidor de ficheros que amplia sus posibilidades. Uno de esos módulos es recycle, aunque hay otros como audit, default_quota, extd_audit, fake_perms, netatalk y shadow_copy que en general se autoexplican por sus nombres. Además de estos, que vienen incorporadas en el código de Samba, hay módulos de terceros como databasefs, vscan o vscan-clamav. En este artículo sólo voy a comentar como configurar un recurso de red con papelera de reciclaje gracias al módulo recycle.
Vemos un ejemplo simple, en el que los usuarios pueden acceder al recurso compartido DATOS que está situado en /mnt/datos y que contiene una papelera de reciclaje en /mnt/datos/.papelera que se muestra como un directorio oculto tanto desde Windows como desde el servidor Samba.
[DATOS] comment = Recurso de Datos path = /mnt/datos writeable = yes vfs object = recycle recycle:repository = .papelera
Como vemos, el directorio que va a hacer la función de papelera se define como una ruta relativa al recurso que estamos compartiendo en la red. ¿Pinta bien, eh? Pues se puede mejorar, y mucho.
Por ejemplo si queremos que los archivos eliminados se guarden en su propia estructura de directorios dentro de la papelera, tenemos que añadir:
recycle:keeptree = yes
Si queremos que ciertos tipos de archivo se eliminen directamente sin pasar por la papelera, por ejemplo archivos temporales y de backup que crean las aplicaciones y que en el momento de restaurar no nos van a servir de nada, añadimos:
recycle:exclude = *.tmp,*.bak
En estos momentos los usuarios que entren en la papelera no podrán acceder a los archivos de otros usuarios ya que por defecto todo allí se crea con permisos 700. Si queremos acceso total a la papelera podemos modificar los permisos a nuestro gusto. En el siguiente ejemplo damos acceso total:
recycle:directory_mode = 0777
Si en nuestro sistema acceden muchos usuarios, podemos diferenciar lo que ha eliminado cada uno creando subpapeleras específicas dentro de la papelera principal, esto es muy fácil, sólo tenemos que modificar la linea recycle:repository que hemos visto antes para que ponga:
recycle:repository = .papelera/%U
Esto creará directorios con el nombre de cada usuario dentro de la papelera de reciclaje y así cada uno podrá recuperar sus archivos sabiendo cuáles son los que ha eliminado el. Además hay más opciones todavía, como recycle:versions para que se guarden múltiples versiones de un fichero eliminado varias veces, recycle:maxsize para limitar el tamaño máximo de los archivos que gardamos en la papelera o recycle:exclude_dir para definir en qué directorios no se aplicará ninguna regla de estas.
¿Y si la papelera de reciclaje crece tanto de tamaño que esto termina afectando al espacio libre en el disco del servidor? Pues podemos aplicar una solución bastante simple. Con el uso de cron y find eliminaremos los archivos que lleven en la papelera más de 7 dias. Pero la fecha de los archivos puede que sea anterior al momento en que se movieron a la papelera, por lo que tenemos que añadir una opción final al módulo recycle de Samba:
recycle:touch = yes
Ahora los archivos llevan la fecha y hora del momento en que fueron eliminados, por lo que ya estamos en disposición de eliminar los que llevan más de una semana gracias al comando:
find /mnt/datos/.papelera -mtime +7 -exec rm -f {} \;
Si queremos automatizar este proceso, abrimos el crontab para editar:
# crontab -e
Y añadimos la línea:
00 00 * * * find /mnt/datos/.papelera -mtime +7 -exec rm -f {} \;
Salimos guardando con <ESC>, <:>, <wq>, <ENTER> y a partir de este momento, todos los dias a las doce de la noche se eliminarán los archivos antiguos que se encuentren dentro de la papelera de reciclaje.