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