Однажды зайдя на любимый блог меня очень заинтересовала статья, посвященная технологии WebDAV. Эта статья впоследствии вдохновила на написание скрипта, упрощающего работу с этой технологией в Ubuntu. Данным скриптом я и хочу поделиться с аудиторией Habrahabr.
В скрипте я постарался учесть три основных операции:
Я попытался воплотить замысел, который высказывался в комментариях к указанной выше статье. У нас есть 2N аккаунтов WebDAV. N из них мы используем для хранения данных, объединив их в некое подобие RAID. Остальные N мы будем использовать для резервного хранения данных на случай, если какой-нибудь аккаунт закроют, либо будут повреждены данные.
Возможно даже хранение нескольких версий файлов, но в данной статье такой метод рассматриваться не будет.
Итак, приступим, помолясь…
Для монтирования нам понадобятся пакеты mhddfs и davfs2, которые мы сразу и поставим:
Для того, чтобы при монтировании не спрашивался пароль, пропишем его в специальном файле:
В виде:
Если URL совпадают, то можно использовать путь к директории.
Позаботимся о начальных переменных:
Сразу позаботимся о том, чтобы скрипт запускался с правами рута, так как они нам скоро понадобятся.
Пишем функцию для монтирования.
Здесь все предельно просто. Для синхронизации используем стандартную утилиту rsync:
Описание опций можно найти на просторах интернета, а конкретно здесь.
Помимо размонтирования наша функция будет удалять пустые каталоги за собой. Обратите внимания, что сначала размонтируются каталоги, в которых мы создавали подобие RAID (ну вы понимаете, почему).
Куда же нормальный скрипт без справки? Исправим положение.
Если скрипт запущен без параметров, открываем help.
Осталось дописать систему переключения наших функций, что мы и сделаем.
Вот и готов скрипт, который, при желании, можно расширить до серьезного инструмента. С помощью rsync можно организовать инкрементное копирование данных с аккаунта на аккаунт. Можно добавить синхронизацию с данными на диске, получив аналог всем известного Dropbox. Все зависит только от вашей фантазии.
Главный минус описанного выше скрипта в том, что он сам не контролирует сохранность исходных данных, а лишь копирует их в другое место. Надеюсь, я все же решу эту проблему.
Найти полную версию скрипта, а также помочь в разработке можно здесь.
P.S. Скрипт еще достаточно сырой. Статья будет обновляться и дополняться. В планах сделать защиту «от дурака», с проверкой директорий монтирования на пустоту. Следите за разработкой…
В скрипте я постарался учесть три основных операции:
- Монтирование каталогов WebDAV
- Синхронизация (это та проблема, которая осталась нерешенной в указанной выше статье)
- Размонтирование
Суть идеи
Я попытался воплотить замысел, который высказывался в комментариях к указанной выше статье. У нас есть 2N аккаунтов WebDAV. N из них мы используем для хранения данных, объединив их в некое подобие RAID. Остальные N мы будем использовать для резервного хранения данных на случай, если какой-нибудь аккаунт закроют, либо будут повреждены данные.
Возможно даже хранение нескольких версий файлов, но в данной статье такой метод рассматриваться не будет.
Итак, приступим, помолясь…
0. Начало
Для монтирования нам понадобятся пакеты mhddfs и davfs2, которые мы сразу и поставим:
sudo apt-get install mhddfs davfs2
Для того, чтобы при монтировании не спрашивался пароль, пропишем его в специальном файле:
sudo nano /etc/davfs2/secrets
В виде:
URL login pass
Если URL совпадают, то можно использовать путь к директории.
Позаботимся о начальных переменных:
# URL аккаунтов WEBDAV_URL1=URL1 WEBDAV_URL2=URL2 WEBDAV_URL3=URL3 WEBDAV_URL4=URL4 # Пути непосредственного монтирования WebDAV(по числу аккаунтов) WEBDAV_DIR1=/mnt/webdav1/ WEBDAV_DIR2=/mnt/webdav2/ WEBDAV_DIR3=/mnt/webdav3/ WEBDAV_DIR4=/mnt/webdav4/ # Пути, куда мы будем объединять каталоги WebDAV RAID_DIR=/mnt/webdav RAID_DIR_BACKUP=/mnt/webdav.backup # Для удобства создадим симлинк в домашнюю папку # Не забудьте заменить "user" на свое имя пользователя SYMLINK_WEBDAV=/home/user/webdav # Служебные переменные ROOT_UID=0 # Только пользователь с $UID 0 имеет привилегии root. E_NOTROOT=67 # Признак отсутствия root-привилегий. ME=`basename $0`
Сразу позаботимся о том, чтобы скрипт запускался с правами рута, так как они нам скоро понадобятся.
if [ "$UID" -ne "$ROOT_UID" ]; then echo "Для работы сценария требуются права root." exit $E_NOTROOT fi
1. Монтирование
Пишем функцию для монтирования.
function mount_webdav() { # Проверяем, существуют ли целевые директории монтирования, и, если нет, создаем их. if [ ! -d "$WEBDAV_DIR1" ]; then echo "Создание $WEBDAV_DIR1" mkdir $WEBDAV_DIR1 fi # Монтируем WebDAV каталоги echo "Монтирование $WEBDAV_DIR1" mount -t davfs -o rw $WEBDAV_URL1 $WEBDAV_DIR1 # ... # Повторяем для всех аккаунтов... # Таким же образом проверяем существование каталогов, # в которых солються все наши аккаунты WebDAV if [ ! -d "$RAID_DIR" ]; then echo "Создание $RAID_DIR" mkdir $RAID_DIR fi echo "Монтирование $RAID_DIR" mhddfs $WEBDAV_DIR1,$WEBDAV_DIR2 $RAID_DIR -o allow_other if [ ! -d "$RAID_DIR_BACKUP" ]; then echo "Создание $RAID_DIR_BACKUP" mkdir $RAID_DIR_BACKUP fi echo "Монтирование $RAID_DIR_BACKUP" mhddfs $WEBDAV_DIR3,$WEBDAV_DIR4 $RAID_DIR_BACKUP -o allow_other # Создаем символическую ссылку на главную папку echo "Создание ссылки $SYMLINK_WEBDAV на $SYMLINK_WEBDAV" ln -s $RAID_DIR $SYMLINK_WEBDAV
2. Синхронизация
Здесь все предельно просто. Для синхронизации используем стандартную утилиту rsync:
function sync_webdav() { # Синхронизация rsync --progress -zuogthvr --delete-after $RAID_DIR $RAID_DIR_BACKUP }
Описание опций можно найти на просторах интернета, а конкретно здесь.
3. Размонтирование
Помимо размонтирования наша функция будет удалять пустые каталоги за собой. Обратите внимания, что сначала размонтируются каталоги, в которых мы создавали подобие RAID (ну вы понимаете, почему).
function umount_webdav() { echo "Размонтирование и удаление $RAID_DIR_BACKUP" umount $RAID_DIR_BACKUP rm -rf $RAID_DIR_BACKUP echo "Размонтирование и удаление $RAID_DIR" umount $RAID_DIR rm -rf $RAID_DIR echo "Размонтирование и удаление $WEBDAV_DIR1" umount $WEBDAV_DIR1 rm -rf $WEBDAV_DIR1 # ... # Повторяем для всех примонтированных папок... # Удаляем символическую ссылку rm $SYMLINK_WEBDAV }
4. Help
Куда же нормальный скрипт без справки? Исправим положение.
function print_help() { echo "Скрипт работы с Webdav" echo echo "Использование: $ME options..." echo "Параметры:" echo " -m Монтировать директории webdav." echo " -u Размонтировать директории." echo " -s Резервное копирование." echo " -h Справка." echo }
Если скрипт запущен без параметров, открываем help.
if [ $# = 0 ]; then print_help fi
5. Почти готово
Осталось дописать систему переключения наших функций, что мы и сделаем.
while getopts msuh opt ; do case $opt in m) mount_webdav; ;; s) sync_webdav; ;; u) umount_webdav; ;; h) print_help ;; *) echo "Неверный параметр"; echo "Для вызова справки выполните $ME -h"; exit 1 ;; esac done
Итоги
Вот и готов скрипт, который, при желании, можно расширить до серьезного инструмента. С помощью rsync можно организовать инкрементное копирование данных с аккаунта на аккаунт. Можно добавить синхронизацию с данными на диске, получив аналог всем известного Dropbox. Все зависит только от вашей фантазии.
Главный минус описанного выше скрипта в том, что он сам не контролирует сохранность исходных данных, а лишь копирует их в другое место. Надеюсь, я все же решу эту проблему.
Найти полную версию скрипта, а также помочь в разработке можно здесь.
P.S. Скрипт еще достаточно сырой. Статья будет обновляться и дополняться. В планах сделать защиту «от дурака», с проверкой директорий монтирования на пустоту. Следите за разработкой…