Self-host your own digital island
1# nixos-mailserver: a simple mail server
2# Copyright (C) 2016-2018 Robin Raymond
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>
16
17{ config, pkgs, lib, ... }:
18
19with lib;
20
21let
22 cfg = config.mailserver;
23
24 preexecDefined = cfg.backup.cmdPreexec != null;
25 preexecWrapped = pkgs.writeScript "rsnapshot-preexec.sh" ''
26 #!${pkgs.stdenv.shell}
27 set -e
28
29 ${cfg.backup.cmdPreexec}
30 '';
31 preexecString = optionalString preexecDefined "cmd_preexec ${preexecWrapped}";
32
33 postexecDefined = cfg.backup.cmdPostexec != null;
34 postexecWrapped = pkgs.writeScript "rsnapshot-postexec.sh" ''
35 #!${pkgs.stdenv.shell}
36 set -e
37
38 ${cfg.backup.cmdPostexec}
39 '';
40 postexecString = optionalString postexecDefined "cmd_postexec ${postexecWrapped}";
41in {
42 config = mkIf (cfg.enable && cfg.backup.enable) {
43 services.rsnapshot = {
44 enable = true;
45 cronIntervals = cfg.backup.cronIntervals;
46 # rsnapshot expects intervals shortest first, e.g. hourly first, then daily.
47 # tabs must separate all elements
48 extraConfig = ''
49 ${preexecString}
50 ${postexecString}
51 snapshot_root ${cfg.backup.snapshotRoot}/
52 retain hourly ${toString cfg.backup.retain.hourly}
53 retain daily ${toString cfg.backup.retain.daily}
54 retain weekly ${toString cfg.backup.retain.weekly}
55 backup ${cfg.mailDirectory}/ localhost/
56 '';
57 };
58 };
59}