Резервное копирование в WebDav на OpenWrt

Рассмотрим возможность создания резервного копирования в облачное хранилище WebDav на примере Яндекс.Диска при помощи виртуальной файловой системы davfs2, утилиты cadaver и небольшого PHP-скрипта.

Может возникнуть закономерный вопрос: зачем изобретать велосипед и почему бы не использовать обычный rsync для копирования данных напрямую в davfs2? Ответ простой: это… не работает как надо. Во всяком случае, с Яндекс.Диском, и если запускать процедуру на роутере под управлением OpenWrt.

То ли из-за особой неторопливости Яндекс.Диска, то ли из-за особенностей davfs2, но при попытке копирования большого количества файлов (а иногда такое случается и с единичными файлами!), большая их часть оказывалась в каталоге lost+found, служащем для локальных копий файлов, загрузка которых в WebDav провалилась. И всё это несмотря на достаточный объем выделенного кэша, стандартные настройки davfs2 для повторной загрузки файлов в случае ее неудачи, и довольно широкого канала связи.

Итак, для самописного и более надежного бэкапера в WebDav нам понадобятся:

  1. davfs2 – стандартный пакет из репозитория OpenWrt;
  2. cadaver – модифицированная версия утилиты для прямого копирования файлов в WebDav из нашего архива;
  3. php-cli – стандартный интерпретатор PHP, при помощи которого мы сгенерируем набор команд для cadaver’а.

Добавленные в cadaver патчи позволяют при помощи нового ключа -F пропускать проверку подлинности сертификатов (а под OpenWrt у нас все используемые в WebDav SSL-сертификаты считаются подозрительными и требуют ручного подтверждения), а также указывать с помощью ключа -n нестандартный путь к хранилищу паролей для автоматической авторизации на WebDav-сервере. Внесенные изменения позволяют создать для cadaver файл с набором команд, которые будут выполняться автоматически без участия человека.

Теперь обратим внимание на скрипт phpsync.php.

У этого скрипта две задачи:
Во-первых, он отвечает за “обратную синхронизацию” – в скрипте производится проверка, все ли находящиеся в WebDav-хранилище файлы продолжают находиться на локальном диске. В случае обнаружения в удаленном хранилище файлов, которые были локально удалены, скрипт удалит их и из WebDav – обычным вызовом unlink() на смонтированном разделе davfs2.
Во-вторых, скрипт генерирует набор команд для cadaver‘а для загрузки локально измененных или отсутствующих в WebDav файлов в удаленное хранилище.
В скрипте есть ряд параметров, которые нужно настроить. Так, параметром $outfile определяется путь к файлу, в который будет записан сгенерированный набор команд, в параметре $remotebase необходимо указать точку монтирования davfs2. Также в нем указывается адрес WebDav сервера, к которому должен подключаться cadaver – по умолчанию это https://webdav.yandex.ru. Затем следует указать каталоги, которые требуется синхронизировать, например:

phpsync("/srv/content","/backup/content");
phpsync("/srv/otherdir","/backup/otherdir");

Так будут сгенерирован набор команд для отражения локальных каталогов /srv/content и /srv/otherdir в удаленные WebDav-каталоги /backup/content и /backup/otherdir соответственно. Обратите внимание – удаленные пути указываются относительно корня WebDav-диска, без привязки к локальной точке монтирования davfs2!

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

machine webdav.yandex.ru login вашлогин password вашпароль

Наконец, создаем ash-скрипт, который мы будем вызывать через кронтаб:

#!/bin/ash
/usr/bin/php-cgi -f /srv/phpsync.php

if [ -e "/var/.phpsync.list" -a $(wc -l "/var/.phpsync.list" | awk '{print $1;}') -gt 2 ]
then
        /usr/bin/cadaver -F -r "/var/.phpsync.list" -n "/srv/auth.rc"
fi

Подставляем ваши значения:

  • /srv/phpsync.php — путь к PHP-скрипту;
  • /srv/auth.rc — путь к парольному файлу;
  • /var/.phpsync.list — путь к файлу с набором команд для cadaver.

Не забываем сделать скрипт исполняемым, выполнив команду chmod +x на данном файле. Теперь мы можем проверить работоспособность копирования, запустив этот скрипт. В терминал при этом будет выведен результат работы PHP-генератора, а также будет показан процесс выполнения задания cadaver’ом.

Если все завершилось успешно – теперь можем добавить автоматический вызов данного скрипта через кронтаб в ночное время и более не беспокоиться о создании резервных копий.

This entry was posted in Сеть и интернет and tagged , , . Bookmark the permalink.

3 Responses to Резервное копирование в WebDav на OpenWrt

  1. Alex_T says:

    Нет ли у вас уже скомпилированного пакета cadaver? Силами openwrt самому скомпилировать не получается…

    • alex says:

      Eu acabei de compilar normalmente, vá em /feeds/packages/net/ crie a pasta do cadaver, va no site: http://fs.erinome.net/openwrt/packages/cadaver e copie o conteudo na pasta cadaver “seguindo o modelo do diretorio” depois faça (./scripts/feeds update -i) para atualizar os dados no build e depois faça (./scripts/feeds install -a) isto irá instalar cadaver, depois faça (make menuconfig, vá em -> Network -> Filesystem e marcque cadaver, salve e faça (make V=s) Pronto ao final o ipk estará no diretorio /bin/”arch”/packages.

  2. Alex_T says:

    Получилось собрать самому через customfeed. Спасибо за статьи)

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>