Скрипт удобной работы с WebDAV в Ubuntu

Однажды зайдя на любимый блог меня очень заинтересовала статья, посвященная технологии WebDAV. Эта статья впоследствии вдохновила на написание скрипта, упрощающего работу с этой технологией в Ubuntu. Данным скриптом я и хочу поделиться с аудиторией Habrahabr.

В скрипте я постарался учесть три основных операции:
  1. Монтирование каталогов WebDAV
  2. Синхронизация (это та проблема, которая осталась нерешенной в указанной выше статье)
  3. Размонтирование


Суть идеи


Я попытался воплотить замысел, который высказывался в комментариях к указанной выше статье. У нас есть 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. Скрипт еще достаточно сырой. Статья будет обновляться и дополняться. В планах сделать защиту «от дурака», с проверкой директорий монтирования на пустоту. Следите за разработкой
  • +17
  • 19,5k
  • 5
Поделиться публикацией

Комментарии 5

    0
    Как работает rsync с примонтированным разделом webdav? Сравнивает файлы побайтово?
      +1
      rsync — это обычная утилита синхронизации. Ей все равно с чем работать, хоть с обычными папками, хоть с WebDAV, хоть даже по ssh. Про принципы работы можно прочитать здесь.
      0
      меня тоже вдохновила та статья, и я сделал следующее.
      # tar -cjf — ./www/* | split -b 100m — /mnt/webdav/backup132/www.tbz
        0
        ой рано отправил. ну в общем пару однострочников, сделал простецкий бекап отдельных директорий типа /var/www, /var/lib/mysql. сжимаем их, а чтобы команда не отжирала всё свободное место, то я делю архив на лету на куски по 100 метров. ведь webdav синхронизирует файлы только после того, как закончится запись.
        # tar -cjf — /var/lib/mysql/* | split -b 100m — /mnt/webdav/backup132/www.tbz
          0
          По сути я делал не бэкап, а просто дублировал файлы. Так удобнее к ним добираться.
          Но, при желании, можно и уже к готовому скрипту прикрутить функции бэкапа (кстати, в планах). Но эту функцию можно реализовать и тем же rsync (здесь подробнее).
          sudo rsync --archive --one-file-system /var/www --delete /mnt/webdav/backup/`date +%F--%H-%M`

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое