diff options
| author | Gregor Kleen <gkleen@yggdrasil.li> | 2017-12-17 14:22:10 +0100 |
|---|---|---|
| committer | Gregor Kleen <gkleen@yggdrasil.li> | 2017-12-17 14:22:10 +0100 |
| commit | b115168c15be41055343dba3a6e37d0e4ffd4590 (patch) | |
| tree | a2d6ba007d64243ec263e52594701d465ceac35c | |
| parent | eb13c2f4e7c2891548a8939575a5ee95ead67d15 (diff) | |
| download | nixos-b115168c15be41055343dba3a6e37d0e4ffd4590.tar nixos-b115168c15be41055343dba3a6e37d0e4ffd4590.tar.gz nixos-b115168c15be41055343dba3a6e37d0e4ffd4590.tar.bz2 nixos-b115168c15be41055343dba3a6e37d0e4ffd4590.tar.xz nixos-b115168c15be41055343dba3a6e37d0e4ffd4590.zip | |
…
| -rw-r--r-- | custom/borgbackup.nix | 23 | ||||
| -rw-r--r-- | hel.nix | 16 |
2 files changed, 33 insertions, 6 deletions
diff --git a/custom/borgbackup.nix b/custom/borgbackup.nix index 222b1999..c08168ed 100644 --- a/custom/borgbackup.nix +++ b/custom/borgbackup.nix | |||
| @@ -16,6 +16,11 @@ let | |||
| 16 | default = []; | 16 | default = []; |
| 17 | }; | 17 | }; |
| 18 | 18 | ||
| 19 | prune = mkOption { | ||
| 20 | type = types.attrsOf (types.listOf types.str); | ||
| 21 | default = {}; | ||
| 22 | }; | ||
| 23 | |||
| 19 | interval = mkOption { | 24 | interval = mkOption { |
| 20 | type = types.str; | 25 | type = types.str; |
| 21 | default = "6h"; | 26 | default = "6h"; |
| @@ -54,7 +59,7 @@ in { | |||
| 54 | config = mkIf (any (t: t.paths != []) (attrValues cfg.targets)) { | 59 | config = mkIf (any (t: t.paths != []) (attrValues cfg.targets)) { |
| 55 | services.btrfs-snapshots.enable = mkIf (cfg.snapshots == "btrfs") true; | 60 | services.btrfs-snapshots.enable = mkIf (cfg.snapshots == "btrfs") true; |
| 56 | 61 | ||
| 57 | systemd.timers = listToAttrs (map ({ target, path, tCfg }: nameValuePair "borgbackup-${target}@${path}" { | 62 | systemd.timers = listToAttrs (map ({ target, path, tCfg }: nameValuePair "borgbackup-${target}-${path}" { |
| 58 | wantedBy = [ "timers.target" ]; | 63 | wantedBy = [ "timers.target" ]; |
| 59 | 64 | ||
| 60 | timerConfig = { | 65 | timerConfig = { |
| @@ -64,9 +69,9 @@ in { | |||
| 64 | }; | 69 | }; |
| 65 | }) (flatten (mapAttrsToList (target: tCfg: map (path: { inherit target path tCfg; }) tCfg.paths) cfg.targets))); | 70 | }) (flatten (mapAttrsToList (target: tCfg: map (path: { inherit target path tCfg; }) tCfg.paths) cfg.targets))); |
| 66 | 71 | ||
| 67 | systemd.services = mapAttrs' (target: tCfg: nameValuePair "borgbackup-${target}@" (let | 72 | systemd.services = listToAttrs (map ({ target, path, tCfg }: nameValuePair "borgbackup-${target}@${path}" (let |
| 68 | deps = flatten [ | 73 | deps = flatten [ |
| 69 | (optional (cfg.snapshots == "btrfs") "btrfs-snapshot@%i.service") | 74 | (optional (cfg.snapshots == "btrfs") "btrfs-snapshot@%p.service") |
| 70 | (optional tCfg.network "network-online.target") | 75 | (optional tCfg.network "network-online.target") |
| 71 | ]; | 76 | ]; |
| 72 | in { | 77 | in { |
| @@ -87,10 +92,16 @@ in { | |||
| 87 | --patterns-from .backup \ | 92 | --patterns-from .backup \ |
| 88 | --one-file-system \ | 93 | --one-file-system \ |
| 89 | --compression auto,lzma \ | 94 | --compression auto,lzma \ |
| 90 | ${tCfg.repo}::${cfg.prefix}$1-{utcnow} | 95 | ${tCfg.repo}::${cfg.prefix}${path}-{utcnow} |
| 91 | ''; | 96 | ''; |
| 92 | in if tCfg.lock == null then borgCmd else "flock -xo /var/lock/${tCfg.lock} ${borgCmd}"; | 97 | in if tCfg.lock == null then borgCmd else "flock -xo /var/lock/${tCfg.lock} ${borgCmd}"; |
| 93 | scriptArgs = "%i"; | 98 | |
| 99 | preStop = mkIf (hasAttr path tCfg.prune) '' | ||
| 100 | borg prune \ | ||
| 101 | --prefix "${tcfg.prefix}${path}" \ | ||
| 102 | ${concatStringsSep " " tCfg.prune."${path}"} \ | ||
| 103 | ${tCfg.repo} | ||
| 104 | ''; | ||
| 94 | 105 | ||
| 95 | unitConfig = { | 106 | unitConfig = { |
| 96 | AssertPathIsDirectory = mkIf (tCfg.lock != null) "/var/lock"; | 107 | AssertPathIsDirectory = mkIf (tCfg.lock != null) "/var/lock"; |
| @@ -104,6 +115,6 @@ in { | |||
| 104 | IOSchedulingPriority = 7; | 115 | IOSchedulingPriority = 7; |
| 105 | SuccessExitStatus = [1 2]; | 116 | SuccessExitStatus = [1 2]; |
| 106 | }; | 117 | }; |
| 107 | })) cfg.targets; | 118 | }))) (flatten (mapAttrsToList (target: tCfg: map (path: { inherit target path tCfg; }) tCfg.paths) cfg.targets))); |
| 108 | }; | 119 | }; |
| 109 | } | 120 | } |
| @@ -532,10 +532,26 @@ | |||
| 532 | "odin" = { | 532 | "odin" = { |
| 533 | repo = "borg.odin:/srv/backup/borg"; | 533 | repo = "borg.odin:/srv/backup/borg"; |
| 534 | paths = [ "home-gkleen" ]; | 534 | paths = [ "home-gkleen" ]; |
| 535 | prune = { | ||
| 536 | "home-gkleen" = | ||
| 537 | [ "--keep-within 24H" | ||
| 538 | "--keep-daily 31" | ||
| 539 | "--keep-monthly 12" | ||
| 540 | "--keep-yearly -1" | ||
| 541 | ]; | ||
| 542 | }; | ||
| 535 | }; | 543 | }; |
| 536 | "munin" = { | 544 | "munin" = { |
| 537 | repo = "borg.munin:borg"; | 545 | repo = "borg.munin:borg"; |
| 538 | paths = [ "home-gkleen" ]; | 546 | paths = [ "home-gkleen" ]; |
| 547 | prune = { | ||
| 548 | "home-gkleen" = | ||
| 549 | [ "--keep-within 24H" | ||
| 550 | "--keep-daily 31" | ||
| 551 | "--keep-monthly 12" | ||
| 552 | "--keep-yearly -1" | ||
| 553 | ]; | ||
| 554 | }; | ||
| 539 | }; | 555 | }; |
| 540 | }; | 556 | }; |
| 541 | }; | 557 | }; |
