diff options
Diffstat (limited to 'modules/borgcopy/default.nix')
-rw-r--r-- | modules/borgcopy/default.nix | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/modules/borgcopy/default.nix b/modules/borgcopy/default.nix new file mode 100644 index 00000000..eae07dc8 --- /dev/null +++ b/modules/borgcopy/default.nix | |||
@@ -0,0 +1,120 @@ | |||
1 | { config, pkgs, lib, utils, flakeInputs, ... }: | ||
2 | |||
3 | with lib; | ||
4 | |||
5 | let | ||
6 | copyBorg = flakeInputs.mach-nix.lib.${config.nixpkgs.system}.buildPythonPackage rec { | ||
7 | pname = "copy-borg"; | ||
8 | src = ./copy; | ||
9 | version = "0.0.0"; | ||
10 | ignoreDataOutdated = true; | ||
11 | |||
12 | requirements = '' | ||
13 | humanize | ||
14 | tqdm | ||
15 | python-dateutil | ||
16 | xdg | ||
17 | python-unshare | ||
18 | pyprctl | ||
19 | halo | ||
20 | ''; | ||
21 | postInstall = '' | ||
22 | wrapProgram $out/bin/copy_borg \ | ||
23 | --prefix PATH : ${makeBinPath (with pkgs; [util-linux borgbackup])}:${config.security.wrapperDir} | ||
24 | ''; | ||
25 | |||
26 | providers.python-unshare = "nixpkgs"; | ||
27 | overridesPre = [ | ||
28 | (self: super: { python-unshare = super.python-unshare.overrideAttrs (oldAttrs: { name = "python-unshare-0.2.1"; version = "0.2.1"; }); }) | ||
29 | ]; | ||
30 | |||
31 | # _.tomli.buildInputs.add = with pkgs."python3Packages"; [ flit-core ]; | ||
32 | }; | ||
33 | |||
34 | copyService = name: opts: nameValuePair "copy-borg@${utils.escapeSystemdPath name}" { | ||
35 | serviceConfig = { | ||
36 | Type = "oneshot"; | ||
37 | ExecStart = "${copyBorg}/bin/copy_borg --verbosity ${toString opts.verbosity} ${utils.escapeSystemdExecArgs [opts.from opts.to]}"; | ||
38 | TimeoutStartSec = "8h"; | ||
39 | # User = "borg"; | ||
40 | # Group = "borg"; | ||
41 | # StateDirectory = "borg"; | ||
42 | RuntimeDirectory = "copy-borg"; | ||
43 | Environment = [ | ||
44 | "BORG_BASE_DIR=/var/lib/borg" | ||
45 | "BORG_CONFIG_DIR=/var/lib/borg/config" | ||
46 | "BORG_CACHE_DIR=/var/lib/borg/cache" | ||
47 | "BORG_SECURITY_DIR=/var/lib/borg/security" | ||
48 | "BORG_KEYS_DIR=/var/lib/borg/keys" | ||
49 | ] | ||
50 | ++ optional opts.unknownUnencryptedRepoAccessOk "BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes" | ||
51 | ++ optional opts.hostnameIsUnique "BORG_HOSTNAME_IS_UNIQUE=yes" | ||
52 | ++ optional (!(isNull opts.sshConfig)) "BORG_RSH=\"${pkgs.openssh}/bin/ssh -F ${pkgs.writeText "config" opts.sshConfig}\"" | ||
53 | ++ optional (!(isNull opts.keyfile)) "BORG_KEY_FILE=${opts.keyfile}"; | ||
54 | |||
55 | LogRateLimitIntervalSec = 0; | ||
56 | }; | ||
57 | }; | ||
58 | copyTimer = name: opts: nameValuePair "copy-borg@${utils.escapeSystemdPath name}" (recursiveUpdate { | ||
59 | wantedBy = [ "timers.target" ]; | ||
60 | |||
61 | timerConfig = { | ||
62 | Unit = "copy-borg@${utils.escapeSystemdPath name}.service"; | ||
63 | }; | ||
64 | } opts.timerOptions); | ||
65 | |||
66 | cfg = config.services.copyborg; | ||
67 | in { | ||
68 | options = { | ||
69 | services.copyborg = mkOption { | ||
70 | type = types.attrsOf (types.submodule { | ||
71 | options = { | ||
72 | from = mkOption { | ||
73 | type = types.str; | ||
74 | }; | ||
75 | to = mkOption { | ||
76 | type = types.str; | ||
77 | }; | ||
78 | |||
79 | verbosity = mkOption { | ||
80 | type = types.int; | ||
81 | default = 3; | ||
82 | }; | ||
83 | |||
84 | sshConfig = mkOption { | ||
85 | type = with types; nullOr str; | ||
86 | default = null; | ||
87 | }; | ||
88 | |||
89 | keyfile = mkOption { | ||
90 | type = with types; nullOr str; | ||
91 | default = null; | ||
92 | }; | ||
93 | |||
94 | unknownUnencryptedRepoAccessOk = mkOption { | ||
95 | type = types.bool; | ||
96 | default = false; | ||
97 | }; | ||
98 | hostnameIsUnique = mkOption { | ||
99 | type = types.bool; | ||
100 | default = true; | ||
101 | }; | ||
102 | |||
103 | timerOptions = mkOption { | ||
104 | # type = types.submodule utils.systemdUtils.unitOptions.stage2TimerOptions; | ||
105 | type = types.attrs; | ||
106 | default = { | ||
107 | wantedBy = ["timers.target"]; | ||
108 | }; | ||
109 | }; | ||
110 | }; | ||
111 | }); | ||
112 | default = {}; | ||
113 | }; | ||
114 | }; | ||
115 | |||
116 | config = { | ||
117 | systemd.services = mapAttrs' copyService cfg; | ||
118 | systemd.timers = mapAttrs' copyTimer cfg; | ||
119 | }; | ||
120 | } | ||