ZPAQ

Обсуждение программ nnCron и nnCron LITE

ZPAQ

Postby Morituruz » Fri, 08 Jul 2016, 17:19

ZPAQ это бесплатный, опенсурсный, инкрементальный, дедуплицированный, шифрованный, журналируемый бэкап. Короче аналогов нет.

Предлагаю слова для удобного инкрементального бэкапа с примером задачи в конце:
Code: Select all
<%
   \ Вспомогательные слова, которые используются в zpaq_* словах для сигнализации об ошибках.
   : TIME_STRING
      S" %YYYY%-%MM%-%DD%_%hh%-%mm%-%ss%" EVAL-SUBST
   ;
   : >RGB \ ( r g b -- color )
      SWAP 0x100 * +
      SWAP 0x10000 * +
   ;
   : mRes GetDesktopSize + 2 / ;
   : SHINT { a u c -- }
      \ 12:56 07.04.2014
      \ S" строка для вывода" <1|2|3|4 - оттенок фона (R|G|B|ANY)>
      c CASE   \ выбираем оттенок цвета:
      1 OF
         55 RANDOM 200 +   \ RED
         55 RANDOM            \ GREEN
         55 RANDOM            \ BLUE
         ENDOF
      2 OF
         55 RANDOM 51 +
         55 RANDOM 200 +
         55 RANDOM 51 +
         ENDOF
      3 OF
         55 RANDOM 100 +
         55 RANDOM 100 +
         55 RANDOM 200 +
         ENDOF
      4 OF
         55 RANDOM 200 +
         55 RANDOM 200 +
         55 RANDOM 200 +
         ENDOF
      ENDCASE
      >RGB 0x000000 HINT-COLOR
      mRes 5 / RANDOM 100 +
      mRes 5 / RANDOM 100 +
      HINT-POS
      a u HINT
   ;
   : important_error { a u -- }
      \ 12:44 25.07.2014
      \ для вывода важной ошибки на консоль, в лог, хинтом
      a u CRON-LOG
      CR TIME_STRING S"  " S+ a u S+ TYPE CR
      TIME_STRING CRLF S+ a u S+ 1 SHINT
   ;
%>

<%
   \ ++++++++++ ZPAQ WORDS ++++++++++
   \ 2016-08-22_16-07-28
   
      \ ++++++++++ SETTINGS ++++++++++
      \ Path to zpaq executable:
      : zpaq_path S" c:\soft\zpaq64.exe" ;
      \ ---------- SETTINGS ----------

   : zpaq_backup_run { sa su da du exa exu pa pu method prma prmu console? -- }
      \ sa us - source directory
      \ da du - archive destination filename with ??
      \ exa exu - exclude extension (*.log)
      \ pa pu - password
      \ method - compression level
      \ prma prmu - additional zpaq parameters 2016-08-22_16-07-28
      \ console? - run in console mode?
      \ Returns zpaq exit status

      console?
      IF
         0
      ELSE
         SWHide   \ do not use in console
         BelowNormalPriority
      THEN
      zpaq_path S"  add " S+ QUOTE S+ da du S+ QUOTE S+ S"  " S+ sa su S+
      pu IF S"  -key " S+ pa pu S+ THEN
      exu IF S"  -not " S+ exa exu S+ THEN
      S"  -method " S+ method N>S S+
      S"  " S+ prma prmu S+
      console?
      IF
         2DUP TYPE CR
         StartAppWait DROP
      ELSE
         START-APPW
      THEN
      ExitCodeProc
   ;
   : zpaq_repack_run { sa su da du spa spu dpa dpu console? -- }
      \ repack existing archives to solid new
      \ sa su - source archive full NAME with ??
      \ da du - destination archive name (zpaq extension will be added automatically, see below)
      \ spa spu - source archive password
      \ dpa dpu - destination archive password
      \ console? - run from console?
      \ returns zpaq exit status
      console?
      IF
         0
      ELSE
         SWHide   \ do not use in console
         BelowNormalPriority
      THEN
      zpaq_path S"  extract " S+ QUOTE S+ sa su S+ QUOTE S+
      spu IF S"  -key " S+ spa spu S+ THEN
      S"  -all -repack " S+ QUOTE S+ da du S+ S" .zpaq" S+ QUOTE S+
      dpu IF S"  " S+ dpa dpu S+ THEN
      console?
      IF
         2DUP TYPE CR
         StartAppWait DROP
      ELSE
         START-APPW
      THEN
      ExitCodeProc
   ;
   : zpaq_repack { sa su da du spa spu dpa dpu console? \ e r -- }
      \ run zpaq_repack_run and dealing with errors
      \ sa su - source archive full NAME with ??
      \ da du - destination archive name (zpaq extension will be added automatically, see below)
      \ spa spu - source archive password
      \ dpa dpu - destination archive password
      \ console? - run from console?
      \ returns TRUE in case of problem
      FALSE TO r
      sa su da du spa spu dpa dpu console? zpaq_repack_run TO e
      e 2 =
      IF
         S" zpaq repack error" CRLF S+ sa su S+ important_error
         TRUE TO r
      THEN
      e 1 =
      IF
         S" zpaq repack warning" CRLF S+ sa su S+ 4 SHINT
         TRUE TO r
      THEN
      r
   ;
   : zpaq_last? { sa su -- }
      \ last archive exist?
      \ sa su - full filename with ??
      sa su S" ?" S" 9" StringReplace S" .zpaq" S+ EXIST?
   ;
   \ can't use local variables inside FOR-FILES:
   USER zpaq_i
   USER zpaq_d
   : zpaq_delete_excess_circles { fa fu c -- }
      \ delete excessive circles of backup
      \ fa fu - fullpath with ??
      \ c - number of full backups that we need to keep
      0 zpaq_i ! 0 zpaq_d !
      fa fu S" ?" S" " StringReplace S" full*.zpaq" S+ FOR-FILES
         zpaq_i 1+!
      ;FOR-FILES
      c zpaq_i @ <
      IF
         \ how much full backups we should delete:
         zpaq_i @ c - zpaq_d !
         0 zpaq_i !
         fa fu S" ?" S" " StringReplace S" full*" S+ FOR-FILES
            zpaq_i 1+!
            \ minus one because we cannot use «<=»:
            zpaq_i @ 1 - zpaq_d @ <
            IF
               TIME_STRING S"  DELETE " S+ FOUND-FULLPATH S+ TYPE CR
               FOUND-FULLPATH FDELETE
            THEN
         ;FOR-FILES
      THEN
   ;
   : zpaq_backup { sa su da du exa exu pa pu method prma prmu full_backups console? \ e -- }
      \ run zpaq and dealing with errors
      \ sa us - source directory
      \ da du - archive destination filename with ??
      \ exa exu - exclude extension (*.log)
      \ pa pu - password
      \ method - compression level
      \ prma prmu - additional zpaq parameters 2016-08-22_16-07-28
      \ full_backups - number of full backups that we need to keep
      \ console? - run in console mode?
      
      da du zpaq_last?
      IF   \ последний возможный архив уже создан. Нужно перепаковать все архивы в единый файл, а всё старое удалить.
         da du
         da du S" ?" S" " StringReplace S" full_" S+ TIME_STRING S+
         pa pu
         pa pu
         FALSE
         zpaq_repack
         IF
            EXIT   \ just exit, important error will shown inside zpaq_repack
         THEN
         \ delete old files:
         da du S" .zpaq" S+ FDELETE
         \ delete old full backups:
         da du full_backups zpaq_delete_excess_circles
      THEN
      
      sa su da du exa exu pa pu method prma prmu console? zpaq_backup_run TO e
      e 2 =
      IF
         S" zpaq backup error" CRLF S+ sa su S+ important_error
         EXIT
      THEN
      e 1 =
      IF
         S" zpaq backup warning" CRLF S+ sa su S+ 4 SHINT
         EXIT
      THEN
   ;
   : zpaq_s+ { a u -- }
      \ add quoted string to parameter
      S"  " QUOTE S+ a u S+ QUOTE S+ S+
   ;
   \ ---------- ZPAQ WORDS ----------
%>


#( zpaq_backup_example
\ В 20:15 каждую пятницу:
Time: 15 20 * * 5
SingleInstance NoLog
Action:
   S" c:\nncron"   \ source DIR
      S" c:\Program Files\nncron" zpaq_s+
   S" b:\backup\nncron\nncron_??"   \ destination archive name with ??
   S" c:\nncron\log\*.log"   \ exclude FILES
      S" c:\Program Files\nncron\log\*.log" zpaq_s+
   S" ave_satan"   \ password
   1   \ method
   S" "   \ additional zpaq parameters
   1 \ number of full backups that we need to keep
   FALSE   \ for use in Console
   zpaq_backup
)#


Конечное слово для использования это zpaq_backup (см. пример задачи в коде). Пояснения:
S" c:\nncron\" — папки/файлы, которые архивируем. Если их несколько, то указываем через пробел. Если в пути содержится пробел, то заключаем его в кавычки (это делает слово zpaq_s+)
S" s:\backup\nncron\nncron_??" — Указываем конечное имя архива, где знак вопроса это количество цифр в инкременте, т.е. ?? означает создание файлов с двумя цифрами: nncron_01.zpaq, nncron_02.zpaq и т.д.
S" c:\nncron\log\*.log" — исключаемые из бэкапа файлы
S" ave_satan" — пароль
1 — метод сжатия:
  • 0 — без сжатия, только шифрование и дедупликация
  • 1 — быстрое сжатие, быстрая распаковка
  • 2 — более сильное и медленное сжатие, быстрая распаковка
  • 3-5 — всё очень медленно =)
S" " — дополнительные параметры для zpaq, если в них есть необходимость.
1 — количество полных кругов бэкапа, которые храним, пояснение ниже.
FALSE — для тестирования в консоли. Выводит в консоль итоговую командную строку для zpaq, не скрывает окно самого zpaq, не запускает с пониженным приоритетом.

По поводу кругов бэкапа и зачем такие сложности: если запустить zpaq когда в наличии имеется файл с последним возможным номером (archive_9.zpaq, archive_99.zpaq и т.д.) то он вернёт ошибку. Чтобы вручную не решать эту проблему, в коде выше реализована следующая логика: при достижении последнего номера весь текущий стек файлов (archive_1.zpaq ... archive_9.zpaq) перепаковывается в archive_full_yyyy-mm-dd_hh-mm-ss, после чего проверяется сколько таких полных архивов уже есть, и если они превышают указанное количество, которое нужно хранить, то лишние полные архивы удаляются. При следующем запуске бэкапа инкрементный отсчёт начнётся заново.
Last edited by Morituruz on Tue, 23 Aug 2016, 16:07, edited 2 times in total.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: ZPAQ

Postby Morituruz » Tue, 23 Aug 2016, 16:03

Обновил
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: ZPAQ

Postby ANR Daemon » Sat, 27 Aug 2016, 01:03

Morituruz wrote:Короче аналогов нет.

ZFS/BTRFS.
ANR Daemon
 
Posts: 234
Joined: Mon, 26 Feb 2007, 22:59


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 4 guests