Корзина samba на сервере FreeBSD

Наверняка все знают, что при удалении файлов в ОС Windows сначала они перемещаются в корзину с возможностью восстановления. Однако, при работе с открытыми по сети папками шансов восстановить ошибочно удаленный файл практически нет. Это может создать дополнительное беспокойство для администратора сервера со стороны пользователей с просьбой восстановить какой-либо файл. При использовании в качестве файлового сервера ОС FreeBSD и пакета samba задачу восстановления «случайно» удаленных файлов достаточно просто решить.

1. Устанавливаем порт samba. Данный вопрос выходит за рамки статьи и не будет описан, можно найти массу инструкций в сети.

По-умолчанию удаленные файлы складываются сервером в ту же общую папку, откуда они были удалены, в корень, в папку .recycle. На мой взгляд это не очень удобно, поэтому создадим одну корзину под все имеющиеся общие папки.

2. Переходим в каталог пользователя самба, у меня это:
cd /usr/home/samba

3. Создаем папку trash:
mkdir trash

4. Даем на нее полные права всем, иначе не все удаляемые пользователями файлы попадут в корзину:
chmod -R 777 trash

5. Открываем конфигурационный файл samba любимым текстовым редактором, я пользуюсь ее:
ee /usr/local/etc/smb.conf

6. Вносим изменения в секцию [global], дописываем в конец секции:

# Connect vfs object - Recycle Bin
vfs object = recycle

# Path to Recycle folder
recycle:repository = /usr/home/samba/trash/%U

recycle:mode = KEEP_DIRECTORIES|VERSIONS|TOUCH

# Maximum file size for put in recycle, 0 - without limit.
recycle:maxsize = 0

# Files with follow extensions will't put in recycle and will be deleted immediately
recycle:exclude = *.tmp, *.temp, *.o, *.obj, ~$*, *.~??, *.trace, *.avi, *.wmv, *.wma, *.mp3, *.mkv, *.TMP, *.TEMP, *.O, *.OBJ, *.TRACE, *.AVI, *.WMV, *.WMA, *.MP3, *.MKV

# Folders with follow names will't put to recycle
recycle:excludedir = /tmp|/temp|/cache

#exception for new versions (these files will not be saved when removing multiple copies)
recycle:noversions = *.doc|*.ppt|*.dat|*.ini

# Save folders
recycle:keeptree = Yes

# To make versioning of the files if the names are the same
recycle:versions = Yes

7. Не выходим из конфигурационного файла, создаем под корзину общую папку, добавляем в секцию общих папок:

[Trash]
    comment = Recycle folder
    path = /usr/home/samba/trash
    public = no
    browseable = no
    guest ok = yes
    writable = yes
    printable = no
    create mask = 0777
    directory mask = 0777

8. Сохраняем изменения, выходим и перезапускаем демон samba:
/usr/local/etc/rc.d/samba restart

9. Так же необходимо позаботиться об очистке корзины. Это можно делать вручную, либо автоматически, для этого подготовим небольшой скрипт. Создадим его прямо в папке пользователя samba:
touch clean_trash

10. Открываем текстовым редактором:
ee clean_trash

11. Пишем следующее:

#!/bin/sh
#
# Trash folder cleaning script
# Auth.: Alex
#
# v.1.0.0       25.04.2016      Initial version
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin
SHELL=/bin/sh
DIR=/usr/home/samba/trash/
DAYS=1

# Check that trash folder is not empty
for i in $DIR/*
do
    if [ "$i" != "$DIR/*" ]
        then
            # Delete files older than $DAYS
            find $DIR* -type f -atime +$DAYS -delete

            # Delete empty folders
            find $DIR* -type d -atime +$DAYS -exec rmdir {} \; >/dev/null 2>&1
            logger "Recycle bin was maintained successfully!"
        else
            logger "Recycle bin empty. Nothing to delete."
        fi
        break
done

В данном случае удаленные файлы хранятся сутки, за это в скрипте отвечает переменная DAYS, выставляйте по вкусу.

12. Сохраняем, выходим и даем права на исполнение:
chmod 755 clean_trash

13. Необходимо это дело автоматизировать, открываем текстовым редактором файл /etc/crontab:
ee /etc/crontab

14. В конец дописываем:

# Clean samba trash folder
0       1       *       *       *       root    /usr/home/samba/clean_trash

15. Сохраняем, выходим.

Резюме. Теперь все удаленные пользователями файлы будут складываться в скрытую общедоступную папку в сети вида \\COMPUTERNAME\Trash, где внутри при удалении файлов автоматически будет создана папка с именем пользователя, удалившего эти файлы, а также будет создана иерархия папок для восстановления полного пути к файлу, это значительно облегчает работу. Согласно моей конфигурации, определенные типы файлов, такие как музыка и фильмы, не будут помещены в корзину и будут удалены сразу, а также папки именами как tmp, temp, cache. Каждый день, в час ночи будет происходить процедура обслуживания корзины, и в случае, если в ней найдутся файлы и папки, с момента последнего открытия которых прошло более суток — они будут безвозвратно удалены. Результаты работы будут занесены в основной лог системы /var/log/messages. Имеющуюся конфигурацию легко изменить под свои нужды.

Теперь ни один важный файл не потеряется.