diff --git a/modules/base/btrfssnapshot/default.nix b/modules/base/btrfssnapshot/default.nix new file mode 100644 index 0000000..141fe9d --- /dev/null +++ b/modules/base/btrfssnapshot/default.nix @@ -0,0 +1,53 @@ +{ + config, + lib, + pkgs, + ... +}: let + cfg = config.mj.base.btrfssnapshot; +in { + options.mj.base.btrfssnapshot = { + enable = lib.mkEnableOption "Enable btrfs snapshots"; + + subvolumes = lib.mkOption { + default = {}; + type = with lib.types; + attrsOf (submodule { + options = { + label = lib.mkOption {type = str;}; + keep = lib.mkOption {type = int;}; + refreshInterval = lib.mkOption {type = str;}; + }; + }); + }; + }; + + config = lib.mkIf cfg.enable { + systemd = { + services = + lib.mapAttrs' + ( + subvolume: params: + lib.nameValuePair + "btrfs-snapshot-${lib.strings.sanitizeDerivationName subvolume}" + { + description = "${params.label} btrfs snapshot for ${subvolume} (keep ${params.keep}"; + serviceConfig.ExecStart = "${pkgs.btrfs-auto-snapshot} --verbose --label=${params.label} --keep=${params.keep} ${subvolume}"; + } + ); + + timers = + lib.mapAttrs' + ( + subvolume: params: + lib.nameValuePair + "btrfs-snapshot-${lib.strings.sanitizeDerivationName subvolume}" + { + description = "${params.label} btrfs snapshot for ${subvolume}"; + wantedBy = ["timers.target"]; + timerConfig.OnCalendar = params.refreshInterval; + } + ); + }; + }; +} diff --git a/modules/base/default.nix b/modules/base/default.nix index 7c4544d..172d8b7 100644 --- a/modules/base/default.nix +++ b/modules/base/default.nix @@ -9,6 +9,7 @@ in { imports = [ ./boot + ./btrfssnapshot ./fileSystems ./snapshot ./sshd