Merge #361424: refactor lib.packagesFromDirectoryRecursive (v2)
[NixPkgs.git] / nixos / modules / services / backup / borgmatic.nix
blobc05fe208acb30c750ae877c5f62abb946742f165
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
7 let
8   cfg = config.services.borgmatic;
9   settingsFormat = pkgs.formats.yaml { };
11   repository =
12     with lib.types;
13     submodule {
14       options = {
15         path = lib.mkOption {
16           type = str;
17           description = ''
18             Path to the repository
19           '';
20         };
21         label = lib.mkOption {
22           type = str;
23           description = ''
24             Label to the repository
25           '';
26         };
27       };
28     };
29   cfgType =
30     with lib.types;
31     submodule {
32       freeformType = settingsFormat.type;
33       options = {
34         source_directories = lib.mkOption {
35           type = listOf str;
36           default = [ ];
37           description = ''
38             List of source directories and files to backup. Globs and tildes are
39             expanded. Do not backslash spaces in path names.
40           '';
41           example = [
42             "/home"
43             "/etc"
44             "/var/log/syslog*"
45             "/home/user/path with spaces"
46           ];
47         };
48         repositories = lib.mkOption {
49           type = listOf repository;
50           default = [ ];
51           description = ''
52             A required list of local or remote repositories with paths and
53             optional labels (which can be used with the --repository flag to
54             select a repository). Tildes are expanded. Multiple repositories are
55             backed up to in sequence. Borg placeholders can be used. See the
56             output of "borg help placeholders" for details. See ssh_command for
57             SSH options like identity file or port. If systemd service is used,
58             then add local repository paths in the systemd service file to the
59             ReadWritePaths list.
60           '';
61           example = [
62             {
63               path = "ssh://user@backupserver/./sourcehostname.borg";
64               label = "backupserver";
65             }
66             {
67               path = "/mnt/backup";
68               label = "local";
69             }
70           ];
71         };
72       };
73     };
75   cfgfile = settingsFormat.generate "config.yaml" cfg.settings;
78   options.services.borgmatic = {
79     enable = lib.mkEnableOption "borgmatic";
81     settings = lib.mkOption {
82       description = ''
83         See https://torsion.org/borgmatic/docs/reference/configuration/
84       '';
85       default = null;
86       type = lib.types.nullOr cfgType;
87     };
89     configurations = lib.mkOption {
90       description = ''
91         Set of borgmatic configurations, see https://torsion.org/borgmatic/docs/reference/configuration/
92       '';
93       default = { };
94       type = lib.types.attrsOf cfgType;
95     };
97     enableConfigCheck = lib.mkEnableOption "checking all configurations during build time" // {
98       default = true;
99     };
100   };
102   config =
103     let
104       configFiles =
105         (lib.optionalAttrs (cfg.settings != null) { "borgmatic/config.yaml".source = cfgfile; })
106         // lib.mapAttrs' (
107           name: value:
108           lib.nameValuePair "borgmatic.d/${name}.yaml" {
109             source = settingsFormat.generate "${name}.yaml" value;
110           }
111         ) cfg.configurations;
112       borgmaticCheck =
113         name: f:
114         pkgs.runCommandCC "${name} validation" { } ''
115           ${pkgs.borgmatic}/bin/borgmatic -c ${f.source} config validate
116           touch $out
117         '';
118     in
119     lib.mkIf cfg.enable {
121       warnings =
122         [ ]
123         ++
124           lib.optional (cfg.settings != null && cfg.settings ? location)
125             "`services.borgmatic.settings.location` is deprecated, please move your options out of sections to the global scope"
126         ++
127           lib.optional (lib.catAttrs "location" (lib.attrValues cfg.configurations) != [ ])
128             "`services.borgmatic.configurations.<name>.location` is deprecated, please move your options out of sections to the global scope";
130       environment.systemPackages = [ pkgs.borgmatic ];
132       environment.etc = configFiles;
134       systemd.packages = [ pkgs.borgmatic ];
136       # Workaround: https://github.com/NixOS/nixpkgs/issues/81138
137       systemd.timers.borgmatic.wantedBy = [ "timers.target" ];
139       system.checks = lib.mkIf cfg.enableConfigCheck (lib.mapAttrsToList borgmaticCheck configFiles);
140     };