summary refs log tree commit diff
path: root/gnu/packages/backup.scm
diff options
context:
space:
mode:
authorMaxim Cournoyer <maxim.cournoyer@gmail.com>2022-01-25 22:07:13 -0500
committerMaxim Cournoyer <maxim.cournoyer@gmail.com>2022-01-25 22:07:13 -0500
commit1a5302435ff0d2822b823f5a6fe01faa7a85c629 (patch)
treeac7810c88b560532f22d2bab2e59609cd7305c21 /gnu/packages/backup.scm
parent3ff2ac4980dacf10087e4b42bd9fbc490591900c (diff)
parent070b8a893febd6e7d8b2b7c8c4dcebacf7845aa9 (diff)
downloadguix-1a5302435ff0d2822b823f5a6fe01faa7a85c629.tar.gz
Merge branch 'master' into staging.
With "conflicts" solved (all in favor of master except git) in:
	gnu/local.mk
	gnu/packages/databases.scm
	gnu/packages/glib.scm
	gnu/packages/gnome.scm
	gnu/packages/gnupg.scm
	gnu/packages/gnuzilla.scm
	gnu/packages/graphics.scm
	gnu/packages/gstreamer.scm
	gnu/packages/gtk.scm
	gnu/packages/linux.scm
	gnu/packages/machine-learning.scm
	gnu/packages/networking.scm
	gnu/packages/polkit.scm
	gnu/packages/pulseaudio.scm
	gnu/packages/rpc.scm
	gnu/packages/rust.scm
	gnu/packages/version-control.scm
	gnu/packages/w3m.scm
Diffstat (limited to 'gnu/packages/backup.scm')
-rw-r--r--gnu/packages/backup.scm403
1 files changed, 248 insertions, 155 deletions
diff --git a/gnu/packages/backup.scm b/gnu/packages/backup.scm
index 74e3f2ce01..5c92d401bd 100644
--- a/gnu/packages/backup.scm
+++ b/gnu/packages/backup.scm
@@ -4,9 +4,9 @@
 ;;; Copyright © 2015, 2016, 2017 Leo Famulari <leo@famulari.name>
 ;;; Copyright © 2017–2021 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Thomas Danckaert <post@thomasdanckaert.be>
-;;; Copyright © 2017 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2017, 2021 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2017 Kei Kebreau <kkebreau@posteo.net>
-;;; Copyright © 2017, 2020 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017 Christine Lemmer-Webber <cwebber@dustycloud.org>
 ;;; Copyright © 2017 Rutger Helling <rhelling@mykolab.com>
 ;;; Copyright © 2018 Mark H Weaver <mhw@netris.org>
@@ -21,6 +21,7 @@
 ;;; Copyright © 2021 Timothy Sample <samplet@ngyro.com>
 ;;; Copyright © 2021 Brice Waegeneire <brice@waegenei.re>
 ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev>
+;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -38,6 +39,7 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages backup)
+  #:use-module (guix gexp)
   #:use-module (guix packages)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix git-download)
@@ -46,10 +48,12 @@
   #:use-module (guix build-system cmake)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system go)
+  #:use-module (guix build-system perl)
   #:use-module (guix build-system python)
   #:use-module (gnu packages)
   #:use-module (gnu packages acl)
   #:use-module (gnu packages autotools)
+  #:use-module (gnu packages bash)
   #:use-module (gnu packages base)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
@@ -70,6 +74,7 @@
   #:use-module (gnu packages mcrypt)
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages nettle)
+  #:use-module (gnu packages networking)
   #:use-module (gnu packages onc-rpc)
   #:use-module (gnu packages pcre)
   #:use-module (gnu packages perl)
@@ -80,6 +85,8 @@
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages rsync)
+  #:use-module (gnu packages ruby)
+  #:use-module (gnu packages serialization)
   #:use-module (gnu packages ssh)
   #:use-module (gnu packages tls)
   #:use-module (gnu packages valgrind)
@@ -88,7 +95,7 @@
 (define-public duplicity
   (package
     (name "duplicity")
-    (version "0.8.20")
+    (version "0.8.21")
     (source
      (origin
       (method url-fetch)
@@ -97,7 +104,7 @@
                           "-series/" version "/+download/duplicity-"
                           version ".tar.gz"))
       (sha256
-       (base32 "0d125mxknpn44xwgqzzak9y5ydigscrpjv9d63126mfc6yfngr5v"))))
+       (base32 "0ld4bhsi6iv4bvy99pblbr7vlwy9jbgfd6flyvb8qwbl8rvadzjp"))))
     (build-system python-build-system)
     (native-inputs
      `(("gettext" ,gettext-minimal)     ; for msgfmt
@@ -114,12 +121,14 @@
        ("mock" ,python-mock)))
     (propagated-inputs
      `(("lockfile" ,python-lockfile)
+       ("pygobject" ,python-pygobject)
        ("urllib3" ,python-urllib3)))
     (inputs
-     `(("librsync" ,librsync)
-       ("lftp" ,lftp)
-       ("gnupg" ,gnupg)                 ; gpg executable needed
-       ("util-linux" ,util-linux)))     ; for setsid
+     (list dbus ; dbus-launch (Gio backend)
+           librsync
+           lftp
+           gnupg ; gpg executable needed
+           util-linux))     ; for setsid
     (arguments
      `(#:test-target "test"
        #:phases
@@ -129,22 +138,23 @@
              (substitute* "duplicity/gpginterface.py"
                (("self.call = u'gpg'")
                 (string-append "self.call = '" (assoc-ref inputs "gnupg") "/bin/gpg'")))
-
+             (substitute* "duplicity/backends/giobackend.py"
+               (("subprocess.Popen\\(\\[u'dbus-launch'\\]")
+                (string-append "subprocess.Popen([u'"
+                               (assoc-ref inputs "dbus")
+                               "/bin/dbus-launch']")))
              (substitute* '("testing/functional/__init__.py"
                             "testing/overrides/bin/lftp")
-               (("/bin/sh") (which "sh")))
-             #t))
+               (("/bin/sh") (which "sh")))))
          (add-before 'check 'set-up-tests
            (lambda* (#:key inputs #:allow-other-keys)
              (setenv "HOME" (getcwd))   ; gpg needs to write to $HOME
              (setenv "TZDIR"            ; some timestamp checks need TZDIR
-                     (string-append (assoc-ref inputs "tzdata")
-                                    "/share/zoneinfo"))
+                     (search-input-directory inputs "share/zoneinfo"))
              ;; Some things respect TMPDIR, others hard-code /tmp, and the
              ;; defaults don't match up, breaking test_restart.  Fix it.
-             (setenv "TMPDIR" "/tmp")
-             #t)))))
-    (home-page "http://duplicity.nongnu.org/index.html")
+             (setenv "TMPDIR" "/tmp"))))))
+    (home-page "https://duplicity.gitlab.io/duplicity-web/")
     (synopsis "Encrypted backup using rsync algorithm")
     (description
      "Duplicity backs up directories by producing encrypted tar-format volumes
@@ -169,8 +179,7 @@ spying and/or modification by the server.")
                (base32
                 "11mx8q29cr0sryd11awab7y4mhqgbamb1ss77rffjj6in8pb4hdk"))))
     (native-inputs
-     `(("automake" ,automake)
-       ("autoconf" ,autoconf)))
+     (list automake autoconf))
     (build-system gnu-build-system)
     (synopsis "File verification and repair tools")
     (description "Par2cmdline uses Reed-Solomon error-correcting codes to
@@ -196,14 +205,14 @@ can even repair them.")
        (base32
         "02bnczg01cyhajmm4rhbnc0ja0dd9ikv9fwv28asxh1rlx9yr0b7"))))
     (build-system gnu-build-system)
-    (native-inputs `(("pkg-config" ,pkg-config)))
+    (native-inputs (list pkg-config))
     (inputs
-     `(("glib" ,glib)
-       ("tar" ,tar)
-       ("lzop" ,lzop)
-       ("mcrypt" ,mcrypt)
-       ("openssh" ,openssh)
-       ("gnupg" ,gnupg-1)))
+     (list glib
+           tar
+           lzop
+           mcrypt
+           openssh
+           gnupg-1))
     (arguments
      `(#:configure-flags
        `(,(string-append "--sbindir=" (assoc-ref %outputs "out") "/bin"))
@@ -221,7 +230,7 @@ backups (called chunks) to allow easy burning to CD/DVD.")
 (define-public libarchive
   (package
     (name "libarchive")
-    (version "3.4.2")
+    (version "3.5.1")
     (source
      (origin
        (method url-fetch)
@@ -232,16 +241,16 @@ backups (called chunks) to allow easy burning to CD/DVD.")
                                  version ".tar.xz")))
        (sha256
         (base32
-         "18dd01ahs2hv74xm7axjc3yhq839p0x0s4vssvlmm8fknja09qfq"))))
+         "16r95rlmikll1k8vbhh06vq6x3srkc10hzxjjf3021mjs2ld65qf"))))
     (build-system gnu-build-system)
     (inputs
-     `(("bzip2" ,bzip2)
-       ("libxml2" ,libxml2)
-       ("lzo" ,lzo)
-       ("nettle" ,nettle)
-       ("xz" ,xz)
-       ("zlib" ,zlib)
-       ("zstd" ,zstd "lib")))
+     (list bzip2
+           libxml2
+           lzo
+           nettle
+           xz
+           zlib
+           `(,zstd "lib")))
     (arguments
      `(#:configure-flags '("--disable-static")
        #:phases
@@ -333,21 +342,15 @@ random access nor for in-place modification.")
         (base32 "0bzyv6qmnivxnv9nw7lnfn46k0m1dlxcjj53zcva6v8y8084l1iw"))))
     (build-system gnu-build-system)
     (native-inputs
-     `(("autoconf" ,autoconf)
-       ("automake" ,automake)
-       ("pkg-config" ,pkg-config)
-
-       ;; For tests.
-       ("dejagnu" ,dejagnu)))
+     (list autoconf automake pkg-config
+           ;; For tests.
+           dejagnu))
     (inputs
      ;; XXX Compiling with nettle (encryption) support requires patching out
      ;; -Werror from GNUmakefile.in.  Then, rdup-tr-{en,de}crypt tests fail:
      ;; free(): invalid pointer
      ;; ** rdup-tr: SIGPIPE received, exiting
-     `(("glib" ,glib)
-       ("pcre" ,pcre)
-       ("libarchive" ,libarchive)
-       ("mcrypt" ,mcrypt)))
+     (list glib pcre libarchive mcrypt))
     (arguments
      `(#:parallel-build? #f             ;race conditions
        #:phases
@@ -388,7 +391,7 @@ list and implement the backup strategy.")
 (define-public snapraid
   (package
     (name "snapraid")
-    (version "11.5")
+    (version "12.0")
     (source
      (origin
        (method git-fetch)
@@ -397,26 +400,24 @@ list and implement the backup strategy.")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "0dlhdsmq5l208zldfr9z9g0p67wry81dr0r23lpybb5c9fm2f2rm"))))
+        (base32 "0k8pynafkx8bhnqnjhc3jsds5p40sflz4drm88i6dg6ifv35mhh9"))))
     (build-system gnu-build-system)
     (arguments
-     `(#:configure-flags
-       (list "--enable-valgrind"
-             "--with-blkid")
-       #:phases
-       (modify-phases %standard-phases
-         (add-before 'bootstrap 'set-version
-           (lambda _
-             (setenv "VERSION" ,version)
-             (patch-shebang "autover.sh"))))))
+     (list #:configure-flags
+           ;; XXX --enable-valgrind fails with ‘A must-be-redirected function
+           ;; whose name matches the pattern: strlen in an object with soname
+           ;; matching: ld-linux-x86-64.so.2 was not found […]’; used to work.
+           #~(list "--with-blkid")
+           #:phases
+           #~(modify-phases %standard-phases
+               (add-before 'bootstrap 'set-version
+                 (lambda _
+                   (setenv "VERSION" #$version)
+                   (patch-shebang "autover.sh"))))))
     (native-inputs
-     `(("automake" ,automake)
-       ("autoconf" ,autoconf)
-
-       ;; For the tests.
-       ("valgrind" ,valgrind)))
+     (list automake autoconf))
     (inputs
-     `(("util-linux" ,util-linux "lib"))) ; libblkid
+     (list `(,util-linux "lib"))) ; libblkid
     (home-page "https://www.snapraid.it/")
     (synopsis "Efficient backups using parity snapshots across disk arrays")
     (description
@@ -458,7 +459,7 @@ remain fully idle, saving power and producing less noise.")
          "0miklk4bqblpyzh1bni4x6lqn88fa8fjn15x1k1n8bxkx60nlymd"))))
     (build-system gnu-build-system)
     (inputs
-     `(("librsync" ,librsync-0.9)))
+     (list librsync-0.9))
     (arguments
      `(#:make-flags `(,(string-append "PREFIX=" (assoc-ref %outputs "out"))
                       ,(string-append "CC=" ,(cc-for-target)))
@@ -489,10 +490,9 @@ errors.")
         (base32 "11rvjcp77zwgkphz1kyf5yqgr3rlss7dm9xzmvpvc4lp99xq7drb"))))
     (build-system python-build-system)
     (native-inputs
-     `(("python-setuptools-scm" ,python-setuptools-scm)))
+     (list python-setuptools-scm))
     (inputs
-     `(("python" ,python)
-       ("librsync" ,librsync)))
+     (list python librsync))
     (arguments
      `(#:tests? #f))                    ; Tests require root/sudo
     (home-page "https://rdiff-backup.net/")
@@ -531,8 +531,7 @@ rdiff-backup is easy to use and settings have sensible defaults.")
            (lambda _
              (invoke "make" "test"))))))
     (inputs
-     `(("perl" ,perl)
-       ("rsync" ,rsync)))
+     (list perl rsync))
     (home-page "https://rsnapshot.org")
     (synopsis "Deduplicating snapshot backup utility based on rsync")
     (description "rsnapshot is a file system snapshot utility based on rsync.
@@ -552,7 +551,6 @@ rsnapshot uses hard links to deduplicate identical files.")
               (sha256
                (base32
                 "0fpdyxww41ba52d98blvnf543xvirq1v9xz1i3x1gm9lzlzpmc2g"))
-              (patches (search-patches "diffutils-gets-undeclared.patch"))
               (modules '((guix build utils)))
               (snippet
                '(begin
@@ -579,41 +577,38 @@ rsnapshot uses hard links to deduplicate identical files.")
                       (substitute* "configure"
                         (("GUILE=(.*)--variable bindir`" _ middle)
                          (string-append "GUILE=" middle
-                                        "--variable bindir`/guile")))
-                      #t))
+                                        "--variable bindir`/guile")))))
                   (add-before 'build 'set-libtirpc-include-path
                     (lambda* (#:key inputs #:allow-other-keys)
                       ;; Allow <rpc/rpc.h> & co. to be found.
-                      (let ((libtirpc (assoc-ref inputs "libtirpc")))
-                        (setenv "CPATH"
-                                (string-append (getenv "CPATH")
-                                               ":" libtirpc
-                                               "/include/tirpc"))
-                        #t)))
+                      (let ((tirpc (string-append (assoc-ref inputs "libtirpc")
+                                                  "/include/tirpc")))
+                        (if (getenv "CPATH")
+                          (setenv "CPATH"
+                                  (string-append (getenv "CPATH")
+                                                 ":" tirpc))
+                          (setenv "CPATH" tirpc)))))
                   (add-before 'check 'skip-test
                     (lambda _
                       ;; XXX: This test fails (1) because current GnuTLS no
                       ;; longer supports OpenPGP authentication, and (2) for
                       ;; some obscure reason.  Better skip it.
-                      (setenv "XFAIL_TESTS" "utils/block-server")
-                      #t)))))
+                      (setenv "XFAIL_TESTS" "utils/block-server"))))))
     (native-inputs
-     `(("guile" ,guile-2.0)
-       ("gperf" ,gperf-3.0)                  ;see <https://bugs.gnu.org/32382>
-       ("pkg-config" ,pkg-config)
-       ("rpcsvc-proto" ,rpcsvc-proto)))           ;for 'rpcgen'
+     (list guile-2.0 gperf-3.0 ;see <https://bugs.gnu.org/32382>
+           pkg-config rpcsvc-proto))           ;for 'rpcgen'
     (inputs
-     `(("guile" ,guile-2.0)
-       ("util-linux" ,util-linux)
-       ("libtirpc" ,libtirpc)
-       ("gnutls" ,gnutls)
-       ("tdb" ,tdb)
-       ("bdb" ,bdb)
-       ("gdbm" ,gdbm)
-       ("libgcrypt" ,libgcrypt)
-       ("lzo" ,lzo)
-       ("bzip2" ,bzip2)
-       ("zlib" ,zlib)))
+     (list guile-2.0
+           util-linux
+           libtirpc
+           gnutls
+           tdb
+           bdb
+           gdbm
+           libgcrypt
+           lzo
+           bzip2
+           zlib))
     (home-page "https://nongnu.org/libchop/")
     (synopsis "Tools & library for data backup and distributed storage")
     (description
@@ -738,16 +733,14 @@ detection, and lossless compression.")
                                (string-append share "/fish/vendor_completions.d")))
                #t))))))
     (native-inputs
-     `(("python-cython" ,python-cython)
-       ("python-setuptools-scm" ,python-setuptools-scm)
-       ("python-pytest" ,python-pytest)))
+     (list python-cython python-setuptools-scm python-pytest))
     (inputs
-     `(("acl" ,acl)
-       ("libb2" ,libb2)
-       ("lz4" ,lz4)
-       ("openssl" ,openssl)
-       ("python-llfuse" ,python-llfuse)
-       ("zstd" ,zstd "lib")))
+     (list acl
+           libb2
+           lz4
+           openssl
+           python-llfuse
+           `(,zstd "lib")))
     (synopsis "Deduplicated, encrypted, authenticated and compressed backups")
     (description "Borg is a deduplicating backup program.  Optionally, it
 supports compression and authenticated encryption.  The main goal of Borg is to
@@ -761,22 +754,19 @@ to not fully trusted targets.  Borg is a fork of Attic.")
 (define-public wimlib
   (package
     (name "wimlib")
-    (version "1.13.4")
+    (version "1.13.5")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://wimlib.net/downloads/"
                                   "wimlib-" version ".tar.gz"))
               (sha256
                (base32
-                "04ny5s5z05gk6davbwkjkraan781k2xzw6kjwp75h6ncv45dv1sb"))))
+                "08z3xxm5hq1n4wmyhgz14p1cv0w2lx610vn8nhfwpds4n7lwkz1j"))))
     (build-system gnu-build-system)
     (native-inputs
-     `(("pkg-config" ,pkg-config)))
+     (list pkg-config))
     (inputs
-     `(("fuse" ,fuse)
-       ("libxml2" ,libxml2)
-       ("ntfs-3g" ,ntfs-3g)
-       ("openssl" ,openssl)))
+     (list fuse libxml2 ntfs-3g openssl))
     (arguments
      `(#:configure-flags
        (list "--disable-static"
@@ -832,12 +822,11 @@ NTFS volumes using @code{ntfs-3g}, preserving NTFS-specific attributes.")
                     (output-dir
                      (assoc-ref outputs "out"))
 
-                    ;; Just a default... not so useful on guixsd though
-                    ;; You probably want to a service with file(s) to point to.
+                    ;; Just a default... not so useful on Guix Systems though.
+                    ;; You probably want a service with file(s) to point to.
                     (confdir "/etc/dirvish")
 
-                    (perl (string-append (assoc-ref %build-inputs "perl")
-                                         "/bin/perl"))
+                    (perl (search-input-file inputs "/bin/perl"))
                     (loadconfig.pl (call-with-input-file "loadconfig.pl"
                                      read-string)))
 
@@ -888,16 +877,13 @@ NTFS volumes using @code{ntfs-3g}, preserving NTFS-specific attributes.")
                (for-each write-man man-pages)
                #t))))))
     (inputs
-     `(("perl" ,perl)
-       ("rsync" ,rsync)
-       ("perl-libtime-period" ,perl-libtime-period)
-       ("perl-libtime-parsedate" ,perl-libtime-parsedate)))
+     (list perl rsync perl-libtime-period perl-libtime-parsedate))
     (home-page "http://dirvish.org/")
     (synopsis "Fast, disk based, rotating network backup system")
     (description
      "With dirvish you can maintain a set of complete images of your
 file systems with unattended creation and expiration.  A dirvish backup vault
-is like a time machine for your data. ")
+is like a time machine for your data.")
     (license (license:fsf-free "file://COPYING"
                                "Open Software License 2.0"))))
 
@@ -1037,11 +1023,7 @@ precious backup space.
     (arguments
      `(#:tests? #f))                    ;no test
     (inputs
-     `(("lzo" ,lzo)
-       ("libressl" ,libressl)
-       ("protobuf" ,protobuf)
-       ("xz" ,xz)
-       ("zlib" ,zlib)))
+     (list lzo libressl protobuf xz zlib))
     (home-page "http://zbackup.org")
     (synopsis "Versatile deduplicating backup tool")
     (description
@@ -1075,12 +1057,10 @@ is format-agnostic, so you can feed virtually any files to it.")
          "--disable-readline"
          "--disable-rmt")))
     (native-inputs
-     `(("pkg-config" ,pkg-config)))
+     (list pkg-config))
     (inputs
-     `(("openssl" ,openssl)
-       ("zlib" ,zlib)
-       ("util-linux" ,util-linux "lib")
-       ("e2fsprogs" ,e2fsprogs)))
+     (list openssl zlib
+           `(,util-linux "lib") e2fsprogs))
     (home-page "https://dump.sourceforge.io/")
     (synopsis "Ext2/3/4 file system dump/restore utilities")
     (description "Dump examines files in a file system, determines which ones
@@ -1092,6 +1072,85 @@ directory subtrees may also be restored from full or partial backups in
 interactive mode.")
     (license license:bsd-3)))
 
+(define-public btrbk
+  (package
+    (name "btrbk")
+    (version "0.31.3")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://digint.ch/download/btrbk/releases/"
+                                  name "-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1lx7vnf386nsik8mxrrfyx1h7mkqk5zs26sy0s0lynfxcm4lkxb2"))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:make-flags #~(list (string-append "PREFIX=" #$output))
+      #:phases #~(modify-phases %standard-phases
+                   (replace 'configure
+                     (lambda _
+                       (substitute* "Makefile"
+                         (("= /etc")
+                          (string-append "= " #$output "/etc")))))
+                   (delete 'check)
+                   (add-after 'install 'wrap-scripts
+                     (lambda* (#:key inputs outputs #:allow-other-keys)
+                       (define btrbk (search-input-file outputs "bin/btrbk"))
+                       ;; From a comment in btrbk, "Calling btrbk via 'lsbtr'
+                       ;; symlink acts as an alias for 'btrbk ls', while also
+                       ;; changing the semantics of the command line options."
+                       (substitute* btrbk
+                         (("program_name = \\$0")
+                          (string-append "program_name = "
+                                         "$ENV{'BTRBK_PROGRAM_NAME'}")))
+                       ;; Wrap the script, so that it works with SSH URI and
+                       ;; finds mbuffer out of the box.
+                       (wrap-program btrbk
+                         #:sh (search-input-file inputs "bin/bash")
+                         '("BTRBK_PROGRAM_NAME" = ("$0"))
+                         `("PATH" prefix
+                           ,(list (string-append #$btrfs-progs "/bin")
+                                  (string-append #$coreutils "/bin")
+                                  (string-append #$mbuffer "/bin")
+                                  (string-append #$openssh "/bin")))))))))
+    (native-inputs (list ruby-asciidoctor))
+    (inputs (list bash-minimal
+                  btrfs-progs
+                  coreutils
+                  mbuffer
+                  openssh
+                  perl))
+    (home-page "https://digint.ch/btrbk/")
+    (synopsis "Backup tool for Btrfs subvolumes")
+    (description "Btrbk is a backup tool for Btrfs subvolumes, taking
+advantage of Btrfs specific capabilities to create atomic snapshots and
+transfer them incrementally to your backup locations.  The source and target
+locations are specified in a config file, which allows easily configuring
+simple scenarios like e.g. a @i{laptop with locally attached backup disks}, as
+well as more complex ones, e.g. a @i{server receiving backups from several
+hosts via SSH, with different retention policy}.  It has features such as:
+@itemize
+@item atomic snapshots
+@item incremental backups
+@item flexible retention policy
+@item backups to multiple destinations
+@item transfer via SSH
+@item resume backups (for removable and mobile devices)
+@item archive to offline storage
+@item encrypted backups to non-btrfs storage
+@item wildcard subvolumes (useful for Docker and LXC containers)
+@item transaction log
+@item comprehensive list and statistics output
+@item resolve and trace Btrfs parent-child and received-from relationships
+@item list file changes between backups
+@item calculate accurate disk space usage based on block regions.
+@end itemize
+Btrbk is designed to run as a cron job for triggering periodic snapshots and
+backups, as well as from the command line (e.g. for instantly creating
+additional snapshots).")
+    (license license:gpl3+)))
+
 (define-public burp
   (package
     (name "burp")
@@ -1117,17 +1176,14 @@ interactive mode.")
                 (string-append prefix " 3600" suffix "\n")))
              #t)))))
     (inputs
-     `(("acl" ,acl)
-       ("librsync" ,librsync)
-       ("ncurses" ,ncurses)             ; for the live status monitor
-       ("openssl" ,openssl)
-       ("uthash" ,uthash)
-       ("zlib" ,zlib)))
+     (list acl
+           librsync
+           ncurses ; for the live status monitor
+           openssl
+           uthash
+           zlib))
     (native-inputs
-     `(("autoconf" ,autoconf)
-       ("automake" ,automake)
-       ("check" ,check-0.14)
-       ("pkg-config" ,pkg-config)))
+     (list autoconf automake check-0.14 pkg-config))
     (home-page "https://burp.grke.org")
     (synopsis "Differential backup and restore")
     (description "Burp is a network backup and restore program.  It attempts
@@ -1138,33 +1194,27 @@ backup.")
 (define-public disarchive
   (package
     (name "disarchive")
-    (version "0.2.1")
+    (version "0.4.0")
     (source (origin
               (method url-fetch)
               (uri (string-append "https://files.ngyro.com/disarchive/"
                                   "disarchive-" version ".tar.gz"))
               (sha256
                (base32
-                "1jypk0gdwxqbqxiblww863nzq0kwnc676q68j32sprqd7ilnq02s"))
-              (patches (search-patches "disarchive-cross-compilation.patch"))))
+                "1pql8cspsxyx8cpw3xyhirnisv6rb4vj5mxr1d7w9la72q740n8s"))))
     (build-system gnu-build-system)
-    (arguments
-     `(#:phases (modify-phases %standard-phases
-                  (add-after 'unpack 'delete-configure
-                    (lambda _
-                      (delete-file "configure"))))))
     (native-inputs
-     `(("autoconf" ,autoconf)
-       ("automake" ,automake)
-       ("pkg-config" ,pkg-config)
-       ("guile" ,guile-3.0)             ;for cross-compilation
-       ("guile-gcrypt" ,guile-gcrypt)
-       ("guile-quickcheck" ,guile-quickcheck)))
+     (list autoconf
+           automake
+           pkg-config
+           guile-3.0 ;for cross-compilation
+           guile-gcrypt
+           guile-lzma
+           guile-quickcheck))
     (inputs
-     `(("guile" ,guile-3.0)
-       ("zlib" ,zlib)))
+     (list guile-3.0 zlib))
     (propagated-inputs
-     `(("guile-gcrypt" ,guile-gcrypt)))
+     (list guile-gcrypt guile-lzma))
     (home-page "https://ngyro.com/software/disarchive.html")
     (synopsis "Software archive disassembler")
     (description "Disarchive can disassemble software archives into data
@@ -1174,3 +1224,46 @@ original files.  For example, a software archive made using tar and
 Gzip will need to describe the order of files in the tarball and the
 compression parameters used by Gzip.")
     (license license:gpl3+)))
+
+(define-public borgmatic
+  (package
+    (name "borgmatic")
+    (version "1.5.22")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "borgmatic" version))
+       (sha256
+        (base32 "0pvqlj17vp81i7saxqh5hsaxqz29ldrjd7bcssh4g1h0ikmnaf2r"))))
+    (build-system python-build-system)
+    (arguments
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'unpack 'configure
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   ;; Set absolute store path to borg.
+                   (substitute* "borgmatic/commands/borgmatic.py"
+                     (("location\\.get\\('local_path', 'borg'\\)")
+                      (string-append "location.get('local_path', '"
+                                     (search-input-file inputs "bin/borg")
+                                     "')")))))
+               (replace 'check
+                 (lambda* (#:key tests? #:allow-other-keys)
+                   (when tests?
+                     ;; Tests require the installed executable.
+                     (setenv "PATH" (string-append #$output "/bin"
+                                                   ":" (getenv "PATH")))
+                     (invoke "pytest")))))))
+    (inputs
+     (list borg python-colorama python-jsonschema python-requests
+           python-ruamel.yaml))
+    (native-inputs
+     (list python-flexmock python-pytest python-pytest-cov))
+    (home-page "https://torsion.org/borgmatic/")
+    (synopsis "Simple, configuration-driven backup software")
+    (description
+     "borgmatic is simple, configuration-driven backup software for servers
+and workstations.  Protect your files with client-side encryption.  Backup
+your databases too.  Monitor it all with integrated third-party services.
+borgmatic is powered by borg.")
+    (license license:gpl3+)))