Categories: Python

webdav/

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 . В общем, звучит как что-то, что полезно держать на вооружении.

admin

Recent Posts

vim-commands/

Самое главное — побороть боязнь белого листа. Я всегда говорю это себе, когда нужно начать…

1 месяц ago

firefox-thunderbird-en-ru-dict/

По не вполне ясным причинам, Firefox умеет проверять орфографию либо только в русских, либо только…

1 месяц ago

perl-hacks/

Около месяца собирал разные «хаки» на языке программирования Perl. Эта подборка наглядно демонстрирует, как в…

1 месяц ago

perl-cy-check/

C недавних пор я стал увлекаться SEO. Порой передо мной встает задача быстро проверить индекс…

1 месяц ago

which-cms-perl/

Недавно написал несколько скриптов, позволяющих автоматически определять, какая CMS (Content Management System, система управления контентом)…

1 месяц ago

smtp-descr/

Я так подозреваю, что среди вас найдется те, кто скажет, что этот пост боян и…

1 месяц ago