Памятка по использованию WebDAV

18 мая 2020

WebDAV — это расширение протокола HTTP, описанное в RFC4918. WebDAV добавляет в HTTP возможность загружать файлы на сервер, а также удалять / перемещать их, и так далее. В итоге мы получаем что-то очень похожее на FTP, или даже на сетевую файловую систему типа NFS или Samba. Давайте же выясним, как этим пользоваться.

Настойка WebDAV-сервера

В качестве примера рассмотрим настройку обычного, доступного всему миру, веб-сервера, но на который авторизованные пользователи могут еще и заливать файлы по WebDAV. Примем за рабочую теорию, что у вас уже есть сервер под управлением Ubuntu, на котором поднят Nginx с прикрученным к нему Let’s Encrypt.

Далее говорим:

sudo apt install nginx-extras

Правим /etc/nginx/sites-enabled/default примерно таким образом:

server {
    charset UTF-8;
    server_name afiskon.ru;
    listen 127.0.0.1:443 ssl

    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        try_files $uri $uri/ =404;
        root /home/afiskon/afiskon.ru;
        location /public/ {
            autoindex on;
        }
        index index.html index.htm;

        dav_methods PUT DELETE MKCOL COPY MOVE;
        dav_ext_methods PROPFIND OPTIONS;
        dav_access user:rw group:r all:r;
        client_max_body_size 100m;
        create_full_put_path on;

        limit_except GET {
            auth_basic "Restricted";
            auth_basic_user_file /home/afiskon/.webdav_htpasswd;
        }
    }
}

У вас пути вряд ли будут такими. Файлы будут жить где-то в /var/www/html.

Создаем файл с логинами-паролями:

cd /home/afiskon/
htpasswd -c .webdav_htpasswd afiskon
chown afiskon:www-data .webdav_htpasswd
chmod 740 .webdav_htpasswd

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

Убедимся, что все файлы и каталоги имеют правильные права:

sudo chown -R afiskon:www-data ./afiskon.ru/
sudo chmod -R 775 ./afiskon.ru/

Просим веб-сервер перечитать конфиг:

sudo service nginx reload

Вот и вся настойка!

Работа с WebDAV через curl

Получить список доступных методов:

curl -v -X OPTIONS --user afiskon https://afiskon.ru

Получить список файлов и каталогов в XML:

curl -v -X PROPFIND --user afiskon https://afiskon.ru/

Загрузить файл:

curl -v -T file.txt --user afiskon https://afiskon.ru/

Переместить или переименовать файл:

curl -v -X MOVE --header 'Destination: https://afiskon.ru/new.txt' \
  --user afiskon https://afiskon.ru/old.txt

Создать новую директорию:

curl -v -X MKCOL --user afiskon https://afiskon.ru/new-dir/

Удалить файл или каталог:

curl -v -X DELETE --user afiskon https://afiskon.ru/some-dir/
curl -v -X DELETE --user afiskon https://afiskon.ru/some-file.txt

Таким образом, какие-то простые операции с WebDAV достаточно комфортно можно делать даже на bash.

Работа с WebDAV на Python

Но на bash мы, конечно же, ничего писать не будем. Вместо этого воспользуемся нормальным скриптовым языком. Как обычно, не засорять систему лишними пакетами поможет virtualenv.

Воспользуемся пакетом webdavclient3:

pip3 install webdavclient3

Создание нового клиента:

$ python3
>>> from webdav3.client import Client
>>> options = {
... 'webdav_hostname': 'https://afiskon.ru',
... 'webdav_login': 'afiskon',
... 'webdav_password': 's3cr3t'
... }
>>> client = Client(options)

Посмотреть файлы и каталоги:

>>> client.list()
['file1.txt', 'file2.txt' 'dir1/', 'dir2/']

Получить информацию по файлу или каталогу:

>>> client.info('file1.txt')
{'created': '2020-01-23T12:34:56Z', 'name': 'file1.txt', 'size': ⏎
'123456', 'modified': 'Thu, 23 Jan 2020 12:34:56 GMT', 'etag': ''}
>>> client.is_dir('file1.txt')
False

Залить файл на сервер:

>>> client.upload_sync(local_path='/tmp/x.txt', remote_path='x.txt')

Скачать файл с сервера:

>>> client.download_sync(local_path='/tmp/x.txt', remote_path='x.txt')

Переместить или переименовать:

>>> client.move(remote_path_from='old.txt', remote_path_to='new.txt')

Создать директорию:

>>> client.mkdir('new-dir')
True

Удалить файл или директорию:

>>> client.clean('new-dir/')

Заметьте, что когда вы хотите сделать действие с директорией, на конце ее имени обязательно должен быть слэш.

Десктоп-клиенты

В MacOS можно подключиться к WebDAV через Finder. Однако на момент написания этих строк он умел работать только в режиме чтения и заметно подтормаживал.

Как достойную замену можно порекомендовать бесплатную программу Cyberduck. Программа умеет работать не только с WebDAV, но также и с FTP, SFTP, S3, Google Drive, Dropbox и много чем еще. Cyberduck работает под Windows и MacOS. Существует консольный вариант под названием duck. Он работает еще и под Linux. Для тех, кому очень хочется виртуальный жесткий диск, есть вариация под названием Mountain Duck, но только за деньги.

Если Cyberduck вам по каким-то причинам не подошел, рассмотрите альтернативу в лице Transmit. Касаемо текущей ситуации с клиентами под Linux лучше всего обратиться к соответствующей странице на Arch Linux Wiki.

Существуют также мобильные клиенты. Впрочем, я их особо не изучал. Заинтересованным читателям предлагается исследовать этот вопрос самостоятельно.

Заключение

Как видите, с WebDAV трудно соревноваться в простоте. WebDAV может быть неплохим выбором, если вы хотите сделать небольшую файлопомойку на Raspberry Pi. Или, например, вам нужен обычный статический сайт. Но чтобы страницы на нем время от времени обновлялись скриптами, которые запускаются по расписанию в GitHub Actions. В общем, звучит как что-то, что полезно держать на вооружении.

А пользуетесь ли вы WebDAV? Если да, то в каких задачах его применяете?

Метки: , .