summaryrefslogtreecommitdiffstats
path: root/nixos/modules/services/backup/borgbackup.nix
diff options
context:
space:
mode:
authorpennae <github@quasiparticle.net>2021-10-11 15:28:56 +0200
committertomberek <tomberek@users.noreply.github.com>2021-10-22 16:31:50 -0400
commit1fa5e13f30c60890b01475d7945a17ca5721a5f2 (patch)
treee10c77a522b47ac61b32efd0f27ae1e69871f6a1 /nixos/modules/services/backup/borgbackup.nix
parentc47fcb70c6885d6df869934280ebeb715ca7e6fd (diff)
nixos/borgbackup: allow dump scripts as stdin inputs
borg is able to process stdin during backups when backing up the special path -, which can be very useful for backing up things that can be streamed (eg database dumps, zfs snapshots).
Diffstat (limited to 'nixos/modules/services/backup/borgbackup.nix')
-rw-r--r--nixos/modules/services/backup/borgbackup.nix43
1 files changed, 35 insertions, 8 deletions
diff --git a/nixos/modules/services/backup/borgbackup.nix b/nixos/modules/services/backup/borgbackup.nix
index 5461dbaf0bd0..220c571b927e 100644
--- a/nixos/modules/services/backup/borgbackup.nix
+++ b/nixos/modules/services/backup/borgbackup.nix
@@ -42,12 +42,16 @@ let
${cfg.postInit}
fi
'' + ''
- borg create $extraArgs \
- --compression ${cfg.compression} \
- --exclude-from ${mkExcludeFile cfg} \
- $extraCreateArgs \
- "::$archiveName$archiveSuffix" \
- ${escapeShellArgs cfg.paths}
+ (
+ set -o pipefail
+ ${optionalString (cfg.dumpCommand != null) ''${escapeShellArg cfg.dumpCommand} | \''}
+ borg create $extraArgs \
+ --compression ${cfg.compression} \
+ --exclude-from ${mkExcludeFile cfg} \
+ $extraCreateArgs \
+ "::$archiveName$archiveSuffix" \
+ ${if cfg.paths == null then "-" else escapeShellArgs cfg.paths}
+ )
'' + optionalString cfg.appendFailedSuffix ''
borg rename $extraArgs \
"::$archiveName$archiveSuffix" "$archiveName"
@@ -182,6 +186,14 @@ let
+ " without at least one public key";
};
+ mkSourceAssertions = name: cfg: {
+ assertion = count isNull [ cfg.dumpCommand cfg.paths ] == 1;
+ message = ''
+ Exactly one of borgbackup.jobs.${name}.paths or borgbackup.jobs.${name}.dumpCommand
+ must be set.
+ '';
+ };
+
mkRemovableDeviceAssertions = name: cfg: {
assertion = !(isLocalPath cfg.repo) -> !cfg.removableDevice;
message = ''
@@ -240,11 +252,25 @@ in {
options = {
paths = mkOption {
- type = with types; coercedTo str lib.singleton (listOf str);
- description = "Path(s) to back up.";
+ type = with types; nullOr (coercedTo str lib.singleton (listOf str));
+ default = null;
+ description = ''
+ Path(s) to back up.
+ Mutually exclusive with <option>dumpCommand</option>.
+ '';
example = "/home/user";
};
+ dumpCommand = mkOption {
+ type = with types; nullOr path;
+ default = null;
+ description = ''
+ Backup the stdout of this program instead of filesystem paths.
+ Mutually exclusive with <option>paths</option>.
+ '';
+ example = "/path/to/createZFSsend.sh";
+ };
+
repo = mkOption {
type = types.str;
description = "Remote or local repository to back up to.";
@@ -657,6 +683,7 @@ in {
assertions =
mapAttrsToList mkPassAssertion jobs
++ mapAttrsToList mkKeysAssertion repos
+ ++ mapAttrsToList mkSourceAssertions jobs
++ mapAttrsToList mkRemovableDeviceAssertions jobs;
system.activationScripts = mapAttrs' mkActivationScript jobs;