16 апреля 2010

Резервное копирование документов пользователей

Как я писал ранее, мы решили отказаться от Microsoft Solution (перенаправление пользовательских документов на сервер и включение автономных файлов). Но необходимость создавать архивные копии пользовательских документов осталась.

Необходимо найти новое решение со следующими параметрами:

  • Тупое, простое, понятное даже самому пользователю
  • Решение должно быть построено на бесплатных для коммерческого использования компонентах
  • Пользователь может сам прервать процесс создания резервной копии, при необходимости
  • Решение не должно "нагружать" систему на стороне пользователя
  • Должен быть простой способ восстановления документов


Синхронизация

Первое что пришло в голову - GoodSync. Отличная программа по синхронизации файлов, но платная. Существует множество решений (и бесплатных) по синхронизации файлов, но у них у всех есть один минус - они не сохраняют удалённые пользователем файлы. (Здесь я не прав - тот же GoodSync умеет сохранять, скорее всего остальные тоже это умеют, но я такие не нашел). ...Вобщем не пошли мы этим путём.

Мы пойдём другим путём!
Способ должен быть простым! Значит необходима некая софтина, которая делает бекап документов пользователей на сервер каждый раз при вход или выходе пользователя, а потом имеется некий способ восстановить из бекапа файлы. Желательно бекап сжать. Архиватор подойдёт. Да, архиватор подойдёт. Только надо так настроить архиватор, чтобы он удалённые файлы пользователем не удалял их архива (бекапа). Но при восстановлении, эти файлы не восстанавливал. Ну вобщем, что-то наподобие ShadowCopy в Windows.

1996
Я вспомнил 1996 год, FIDO, модемы, MP3, JPEG... А именно вспомнил разговор с Serg UnTyped. Он тогда увлекался методами архивации и оптимизацией кода, а я ему поставлял свежую информацию. Так вот, при осмотре очередного нового архиватора он сказал что архиватор UC2 умеет хранить версии файлов. Не заменять старые версии при добавлении, а именно хранить все сразу в одном архиве. А при разархивации можно указать дату на которую необходимо восстановить файлы из архива. Тогда я сделал отметочку, что это интересно только для хранения исходников.

А сейчас я вспомнил тот разговор. И понял, что вот оно - то что искал! И думаю, что с 1996 года прошло много времени и современные архиваторы умеют версионность. Значит надо искать как-то архиватор которые умеет внутри своего архива хранить версионность файлов. С чего начнём? С самого популярного и бесплатного - 7-Zip.

C 7-zip облом. В нём версионность файлов заявлена, но не реализована. И судя по всему не скоро будет реализована. Грустно. Нахожу Сергея, списываюсь, (это ж сколько мы не виделись!) выпытываю у него текущее состояние дел. Грустно. UC2, ARJ, JAR. Сергей рекомендует ARJ только не тот который Роберта К.Янга, а тот который на SourceForge выложен.

Смотрим. Качаем. Играемся. Нравится.


Пишем батник
Батник простой:
Если нет папки на сетевом ресурсе, то создаём её. На сервере специально выставлены права на NTFS, так чтобы СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ мог проводить операции только внутри своего каталога, а другие каталоги не видел.
if NOT EXIST \\OSPREY\Archives\%USERNAME% MD \\OSPREY\Archives\%USERNAME% > %TEMP%\arj_backup.txt
Определяем местонахождение каталога "Рабочий стол". Перед этим устанавливаем кодовую страницу 1251

chcp 1251>nul  
for /f "tokens=2*" %%i in ('reg query "hkcu\software\microsoft\windows\currentversion\explorer\shell folders" /v desktop ^| findstr /s /i reg_sz') do (
set Desktop=%%j  
)
Аналогично определяем местонахождение каталога "Мои документы"
Аналогично Определяем местонахождение каталога "Избранное"
Архивируем на сервер "Рабочий стол". Считаем что профили находятся на диске С
c:
cd %MyDocs%
echo == Каталог == >> \\OSPREY\Archives\%USERNAME%\log.txt
cd >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == Архивируем == %TIME% == >> \\OSPREY\Archives\%USERNAME%\log.txt
\\OSPREY\GPO\ARJ\arj.exe ac -r -i -x*.mp* -x*.avi -x*.flv -x*.wma -x$* -x*.tmp -xthumbs.db -xdesktop.ini -m4 -hm65000 -hy \\OSPREY\Archives\%USERNAME%\%USERNAME%-Documents >> \\OSPREY\Archives\%USERNAME%\log.txt
Аналогично архивируем на сервер "Мои документы"
Аналогично архивируем на сервер "Избранное"

Относительно ключей архиватора ARJ

arj.exe ac -r -i -x*.mp* -x*.avi -x*.flv -x*.wma -x$* -x*.tmp -xthumbs.db -xdesktop.ini -m4 -hm65000 -hy

  • ac - Архивируем добавлением с чаптерами (Chapters). Эта команда создаёт чаптеры - т.е. срезы на каждую архивацию.
  • -i - Индикатор не показывать, а то в логах будет много мусора
  • -x*.avi - Исключить указанные файлы
  • -m4 - Быстрый и лёгкий метод сжатия. 
  • -hm65000 - Увеличиваем буфер
  • -hy - Указываем что файлы у нас в кодовой странице ANSI, без этого ключа не архивировались файлы с украинскими буковками.


Итого
Не нагружает систему. В памяти занимает аж 2Мбайта. Кушает только одно ядро.
В архиве русские имена файлов представлены в виде кракозябликов. Но разархивируются нормально, при указании ключа -hy
В 1 из 20 случаев на Windows 7 падает. Виннда честно пытается найти решение этой проблемы в Интернете. :-(
Если русские и украинские буковки побеждены, то с польскими и турецкими - проблема. UTF не хватает. :-(
В 1 из 30 случаев зацикливается внутри процесса архивации :-(
В 1 из 100 случаев при сравнении файлов выдаёт что файлы разные и их всех снова архивирует в архив. В такой архив будет всегда добавляться все файлы. Архив будет пухнуть. :-(

Решение
Дошли до стадии RC. Потестировали и остановились. Как-то нестабильно. глаз да глаз нужен... а так красиво начиналось...

Сейчас кое-что делаем с другим архиватором. Результаты опубликую в следующем посте.

Батник полностью

chcp 1251>nul  
if NOT EXIST \\OSPREY\Archives\%USERNAME% MD \\OSPREY\Archives\%USERNAME% > %TEMP%\arj_backup.txt
echo =S=== %DATE% ==== %TIME% ==== >> \\OSPREY\Archives\%USERNAME%\log.txt
echo =S=== %DATE% ==== %TIME% ==== >> %TEMP%\arj_backup.txt

for /f "tokens=2*" %%i in ('reg query "hkcu\software\microsoft\windows\currentversion\explorer\shell folders" /v desktop ^| findstr /s /i reg_sz') do (
set Desktop=%%j  
)

for /f "tokens=2*" %%i in ('reg query "hkcu\software\microsoft\windows\currentversion\explorer\shell folders" /v personal ^| findstr /s /i reg_sz') do (
set MyDocs=%%j  
)

for /f "tokens=2*" %%i in ('reg query "hkcu\software\microsoft\windows\currentversion\explorer\shell folders" /v favorites ^| findstr /s /i reg_sz') do (
set Favorites=%%j  
)

echo ===== User Environment: >> %TEMP%\arj_backup.txt
echo == Desktop: %Desktop% >> %TEMP%\arj_backup.txt
echo == MyDocs: %MyDocs% >> %TEMP%\arj_backup.txt
echo == Favorites: %Favorites% >> %TEMP%\arj_backup.txt
echo == COMPUTER NAME: %COMPUTERNAME% >> %TEMP%\arj_backup.txt
echo == USER NAME: %USERNAME% >> %TEMP%\arj_backup.txt

echo ===== User Environment: >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == Desktop: %Desktop% >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == MyDocs: %MyDocs% >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == Favorites: %Favorites% >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == COMPUTER NAME: %COMPUTERNAME% >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == USER NAME: %USERNAME% >> \\OSPREY\Archives\%USERNAME%\log.txt


c:
cd %MyDocs%
echo == Каталог == >> \\OSPREY\Archives\%USERNAME%\log.txt
cd >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == Архивируем == %TIME% == >> \\OSPREY\Archives\%USERNAME%\log.txt
\\OSPREY\GPO\ARJ\arj.exe ac -r -i -x*.mp* -x*.avi -x*.flv -x*.wma -x$* -x*.tmp -xthumbs.db -xdesktop.ini -m4 -hm65000 -hy \\OSPREY\Archives\%USERNAME%\%USERNAME%-Documents >> \\OSPREY\Archives\%USERNAME%\log.txt
cd %Desktop%
echo == Каталог == >> \\OSPREY\Archives\%USERNAME%\log.txt
cd >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == Архивируем == %TIME% == >> \\OSPREY\Archives\%USERNAME%\log.txt
\\OSPREY\GPO\ARJ\arj.exe ac -r -i -x*.mp* -x*.avi -x*.flv -x*.wma -x$* -x*.tmp -xthumbs.db -xdesktop.ini -m4 -hm65000 -hy \\OSPREY\Archives\%USERNAME%\%USERNAME%-Desktop >> \\OSPREY\Archives\%USERNAME%\log.txt
cd %Favorites%
echo == Каталог == >> \\OSPREY\Archives\%USERNAME%\log.txt
cd >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == Архивируем == %TIME% == >> \\OSPREY\Archives\%USERNAME%\log.txt
\\OSPREY\GPO\ARJ\arj.exe ac -r -i -x*.mp* -x*.avi -x*.flv -x*.wma -x$* -x*.tmp -xthumbs.db -xdesktop.ini -m4 -hm65000 -hy \\OSPREY\Archives\%USERNAME%\%USERNAME%-Favorites >> \\OSPREY\Archives\%USERNAME%\log.txt

:next6
cd ..\Links
if NOT %ERRORLEVEL% == 0 goto next7
echo == Каталог == >> \\OSPREY\Archives\%USERNAME%\log.txt
cd >> \\OSPREY\Archives\%USERNAME%\log.txt
echo == Архивируем == %TIME% == >> \\OSPREY\Archives\%USERNAME%\log.txt
\\OSPREY\GPO\ARJ\arj.exe ac -r -u2 -i -x*.mp* -x*.avi -x*.flv -x*.wma -x$* -x*.tmp -xthumbs.db -xdesktop.ini -m4 -hm65000 -hy \\OSPREY\Archives\%USERNAME%\%USERNAME%-Links >> \\OSPREY\Archives\%USERNAME%\log.txt
cd ..

:next7
echo =F=== %DATE% ==== %TIME% ==== >> \\OSPREY\Archives\%USERNAME%\log.txt
echo =F=== %DATE% ==== %TIME% ==== >> %TEMP%\arj_backup.txt

Комментариев нет: