Рассмотрим возможность создания резервного копирования в облачное хранилище WebDav на примере Яндекс.Диска при помощи виртуальной файловой системы davfs2, утилиты cadaver и небольшого PHP-скрипта.
Может возникнуть закономерный вопрос: зачем изобретать велосипед и почему бы не использовать обычный rsync для копирования данных напрямую в davfs2? Ответ простой: это… не работает как надо. Во всяком случае, с Яндекс.Диском, и если запускать процедуру на роутере под управлением OpenWrt.
То ли из-за особой неторопливости Яндекс.Диска, то ли из-за особенностей davfs2, но при попытке копирования большого количества файлов (а иногда такое случается и с единичными файлами!), большая их часть оказывалась в каталоге lost+found, служащем для локальных копий файлов, загрузка которых в WebDav провалилась. И всё это несмотря на достаточный объем выделенного кэша, стандартные настройки davfs2 для повторной загрузки файлов в случае ее неудачи, и довольно широкого канала связи.
Итак, для самописного и более надежного бэкапера в WebDav нам понадобятся:
- davfs2 – стандартный пакет из репозитория OpenWrt;
- cadaver – модифицированная версия утилиты для прямого копирования файлов в WebDav из нашего архива;
- 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’ом.
Если все завершилось успешно – теперь можем добавить автоматический вызов данного скрипта через кронтаб в ночное время и более не беспокоиться о создании резервных копий.
Нет ли у вас уже скомпилированного пакета cadaver? Силами openwrt самому скомпилировать не получается…
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.
Получилось собрать самому через customfeed. Спасибо за статьи)